繁体   English   中英

Java TCP / IP套接字写入性能优化

[英]Java TCP/IP Socket write performance optimization

服务器环境

Linux/RedHat
6 cores
Java 7/8

关于申请:

我们正在使用Java开发低延迟(7-8 ms)的高速交易平台。 满足算法条件后发送多腿订单

问题

使用TCP / IP java.net.Socket API(使用java.io.OutputStream.write(bytes[] arg0) )进行交换的命令。 Profiler的测量记录为5-7微秒,根据我们的低延迟要求非常高。 堆栈跟踪中发布的问题之一未建议我们使用setPerformancePreferences()API。

  1. 是否可以使用java.net.Socket的替代方法来减少套接字传输时间?
  2. 任何提高性能的优化技术
  3. setPerformancePreferences()有什么用吗?

我们没有使用setPerformancePreferences()API

它什么也不做,也永远做不到。 我不会担心。

是否可以使用java.net.Socket的替代方法来减少套接字传输时间?

问题肯定不是软件问题。 在不同的机器上,从Java到Java的时间可能少于8微秒,但是您需要低延迟的网卡,例如Solarflare或Mellanox。

如果要进行快速处理,则应考虑使用GHz高的haswell处理器(可能时钟频率超过4.2或4.5 GHz)或双插槽Haswell Xeon。 这些成本相比交易成本并不高。

任何提高性能的优化技术

使用非阻塞NIO(即ByteBuffers)并忙于套接字连接。 (我不会使用选择器,因为它们会增加很多开销)我会关闭nagle。

对于某些微调,请在隔离的cpu上使用关联绑定线程。

setPerformancePreferences()有什么用吗?

从源头上看..我会让你当法官。

public void setPerformancePreferences(int connectionTime,
                                      int latency,
                                      int bandwidth)
{
    /* Not implemented yet */
}

Java 7/8

在使用哪个版本方面,我将从Java 8开始,因为Java 8改进了转义分析,可以减少短期对象的垃圾,从而帮助减少GC之间的等待时间和GC的抖动。

我想到了几件事:

JNI :JNI允许您编写从Java代码运行的C代码。 可以将运行缓慢的Java代码的关键部分迁移到C / C ++,以提高性能。 首先需要确定这些关键点是什么,以及是否有必要努力将其转移到C / C ++。

Java不安全 :想变得危险吗? 使用Java Unsafe绕过该讨厌的GC。 是更多信息。 在Github上,您可能会发现一些很酷的包装器代码,可以更安全地使用Java Unsafe。 这是一个。 更多信息。

LMAX Disruptor在此处了解更多信息。 该公司还在用Java构建快速交易系统。 Disruptor允许更快的线程间通信。

字节码检查:通过查看字节码来检查代码。 我已经为制作的视频游戏完成了此任务,并且能够简化代码。 您需要一个很好的工具将您的类文件转换为可读的字节码。 这可能是我使用的工具。

改进的垃圾收集:您是否尝试过使用G1垃圾收集器 还是搞混了旧版GC

高度可扩展性 :该站点上有很多有关使代码快速运行的良好信息。 这是一个可能有帮助的示例。

新API我不确切知道如何使用新API,但是我已阅读的文章中已经提到了它。 这是另一篇文章。 您可能需要通过JNI使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM