java - 目前在 Java 中可以实现的最低 TCP 延迟是多少?

标签 java multithreading tcp real-time nio

我们目前正在使用多线程解决方案来处理 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/

相关文章:

java - 手机锁定时 Admob 广告循环

java - 中断线程中的阻塞队列

java - SocketChannel.write(ByteBuffer[]) "corrupting"数据

java - TCP接收字节包

java - 如何检查指定端口是否可以通信?

java - 有人可以建议简化代码吗?

java - 我似乎无法为我的java使用两个继承,在另一个类中扩展一个类

java - 如何使用异步线程调整/分析线程池配置?

c - 可重入函数和线程安全函数之间的区别

angular - Chrome 暂停请求 15 秒