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

时间:2015-05-08 12:42:03

标签: java performance tcp socket.io low-latency

服务器环境

Linux/RedHat
6 cores
Java 7/8

关于申请:

我们正致力于使用Java开发低延迟(7-8毫秒)高速交易平台。在满足算法条件后发送多支单订单

问题

使用TCP / IP java.net.Socket API(使用java.io.OutputStream.write(bytes[] arg0))向交易所下达的订单。 Profiler测量记录为5-7微秒,根据我们的低延迟要求,这是非常高的。我们没有像在stacktrace中发布的一个问题中所建议的那样使用setPerformancePreferences()api。

问题

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

2 个答案:

答案 0 :(得分:5)

  

我们没有使用setPerformancePreferences()api

它什么也没做,从来没有。我不担心。

  

java.net.Socket的任何替代方法都可以减少套接字传输时间吗?

问题肯定不是软件问题。你可以在不同的机器上从Java到Java获得<8微秒,但是你需要像Solarflare或Mellanox这样的低延迟网卡。

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

  

任何提高性能的优化技术

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

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

  

setPerformancePreferences()是否有用?

看着来源......我会让你成为法官。

forever start server.js
  

Java 7/8

就使用哪个版本而言,我将从Java 8开始,因为它有很多改进的转义分析,可以减少短期对象的垃圾,从而有助于减少GC与GC之间的延迟。

答案 1 :(得分:0)

有几件事情浮现在脑海中:

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

Java Unsafe:想变得危险吗?使用Java Unsafe绕过那个讨厌的GC。 Here更多信息。在Github上,您可以找到一些很酷的包装代码,以更安全地使用Java Unsafe。 Here is one. More info.

LMAX Disruptor:详细了解here。该公司还在建立一个Java快速交易系统。 Disruptor允许更快的线程间通信。

字节码审查:通过查看字节代码来查看代码。我为我制作的视频游戏做了这个,并且能够简化代码。您需要一个很好的工具来将类文件转换为可读的字节码。 THis might be the tool i used.

改进垃圾收集:您是否尝试过使用G1 garbage collector?或者弄乱older GC's

Highscalability:这个网站充满了关于快速编写代码的好信息。 Here is an example that might help.

New API我不确切知道如何使用新API,但它已经出现在我读过的文章中。 Here is another article on it.您可能需要通过JNI使用它。