我们目前正在使用多线程解决方案来处理 20 个并发连接的高性能 TCP 服务器。我们的平均延迟约为每条消息 200 微秒,并且我们一直在努力控制可能产生1ms+ 异常值的 GC Activity 。 低延迟是我们此服务器的最高目标
,我们知道当前的数据很糟糕。我们正在评估单线程方法,以便我们可以通过单个线程处理所有这 20 个连接。
Java 中 TCP 延迟的当前下限是多少,换句话说,两台机器通过 10Gb 网络上的 TCP 套接字在 Java 中交换消息的速度有多快?
最佳答案
多线程服务器并不是解决延迟问题的方法,200 微秒确实太高了。对于超低延迟的网络应用程序,必须使用单线程、异步、非阻塞的网络库。您可以在同一个 react 器线程(即网络选择器)内轻松处理这 20 个套接字连接,该线程可以固定到专用且隔离的 CPU 核心。此外,如果使用 Java,则必须使用留下零垃圾的网络库,因为清理 GC Activity 很可能会阻塞关键 react 器线程,从而引入您正在观察的不良异常值。
为了让您了解 TCP 延迟,您可以查看 these benchmarks使用CoralReactor ,这是一个用Java实现的超低延迟无垃圾网络库。
Messages: 1,000,000 (size 256 bytes)
Avg Time: 2.15 micros
Min Time: 1.976 micros
Max Time: 64.432 micros
Garbage created: zero
75% = [avg: 2.12 micros, max: 2.17 micros]
90% = [avg: 2.131 micros, max: 2.204 micros]
99% = [avg: 2.142 micros, max: 2.679 micros]
99.9% = [avg: 2.147 micros, max: 3.022 micros]
99.99% = [avg: 2.149 micros, max: 5.604 micros]
99.999% = [avg: 2.149 micros, max: 7.072 micros]
请记住,2.15 微秒已经超过了环回,因此我没有考虑网络和操作系统/内核延迟。对于 10Gb 网络,256 字节大小的消息从 NIC 到 NIC 的线上延迟至少为 382 纳秒。如果您使用的网卡支持内核旁路(即 SolarFlare 的 OpenOnLoad),那么操作系统/内核延迟应该非常低。
免责声明:我是 CoralReactor 的开发者之一。
关于java - 目前在 Java 中可以实现的最低 TCP 延迟是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30004497/