服务器环境
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。
问题
答案 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使用它。