[英]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。
题
我们没有使用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.