Java TCP/IP Socket写入性能优化

8

服务器环境

Linux/RedHat
6 cores
Java 7/8

关于应用程序:

我们正在开发一个使用Java的低延迟(7-8毫秒)高速交易平台。多腿订单会在符合算法条件后发送。

问题

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

问题

  1. 有没有其他替代java.net.Socket来减少套接字传输时间的方法?
  2. 有没有优化技术来提高性能?
  3. setPerformancePreferences()有用吗?
2个回答

5

我们没有使用setPerformancePreferences() api

它并没有什么作用,也从来没有。不用担心。

有没有java.net.Socket的替代品可以缩短套接字传输时间?

问题肯定不是软件问题。您可以在不同机器上通过Java到Java获取小于8微秒,但您需要像Solarflare或Mellanox这样的低延迟网络卡。

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

有什么优化技术可以提高性能吗?

使用非阻塞NIO,即ByteBuffers和对套接字连接进行忙碌等待。(我不会使用Selectors,因为它们会增加很多开销)。我会关闭nagle。

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

setPerformancePreferences() 有用吗?

看源代码...我让您自己判断。

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

Java 7/8

就使用哪个版本的问题而言,我建议从Java 8开始。因为它有更加出色的逃逸分析,可以减少短生命周期对象的垃圾产生,从而有助于减少GC之间的延迟和GC带来的抖动。


0

想到了几件事情:

JNI:JNI允许您编写C代码,该代码从您的Java代码运行。 可以将运行速度过慢的关键部分迁移到C / C ++以提高性能。 首先需要确定这些关键点是什么,以及是否值得将其移动到C / C ++。

Java Unsafe:想玩点危险的东西吗? 使用Java Unsafe来绕过GC。 此处有更多信息。 在Github上,您可以找到一些很酷的包装器代码,以更安全地使用Java Unsafe。 这里有一个更多信息。

LMAX Disruptor:在这里阅读更多相关信息该公司还在使用Java构建快速交易系统。Disruptor允许更快的线程间通信。

字节码审查:通过查看字节码来审查您的代码。我曾为自己制作的一个视频游戏做过这个工作,并成功地简化了代码。您需要一个好的工具将类文件转换为可读的字节码。这可能是我使用的工具。

改进的垃圾回收:您尝试过使用G1垃圾收集器吗?或者玩弄旧的GC

Highscalability:该网站充满了使代码快速的好信息。这里有一个可能会有所帮助的示例。

新API我不知道如何使用新API,但在我阅读的文章中它已经出现了。这里是另一篇关于它的文章。您可能需要通过JNI使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接