我最近在运行一些比较网络性能与环回性能的性能测试时偶然发现了一个有趣的 TCP 性能问题。在我的情况下,网络性能超过了环回性能(1Gig 网络,相同子网)。在我处理延迟的情况下,延迟至关重要,因此启用了 TCP_NODELAY。我们提出的最好的理论是 TCP 拥塞控制阻止了数据包。我们做了一些数据包分析,我们可以肯定地看到数据包被持有,但原因并不明显。现在问题...
1)在什么情况下,为什么,通过环回通信会比通过网络慢?
2) 当尽可能快地发送时,为什么切换 TCP_NODELAY 对环回最大吞吐量的影响比网络上的影响大得多?
3) 我们如何检测和分析 TCP 拥塞控制作为性能不佳的潜在解释?
4)对于这种现象的原因,是否有人有任何其他理论?如果是,有什么方法可以证明这个理论?
以下是一个简单的点对点 c++ 应用程序生成的一些示例数据:
传输消息大小(字节) TCP NoDelay 发送缓冲区(字节) 发送方主机 接收方主机吞吐量(字节/秒) 消息速率(毫秒/秒) TCP 128 On 16777216 HostA HostB 118085994 922546 TCP 128 关闭 16777216 主机 A 主机 B 118072006 922437 TCP 128 On 4096 HostA HostB 11097417 86698 TCP 128 关闭 4096 HostA HostB 62441935 487827 TCP 128 On 16777216 HostA HostA 20606417 160987 TCP 128 关闭 16777216 HostA HostA 239580949 1871726 TCP 128 On 4096 HostA HostA 18053364 141041 TCP 128 关闭 4096 HostA HostA 214148304 1673033 UnixStream 128 - 16777216 HostA HostA 89215454 696995 Unix数据报 128 - 16777216 HostA HostA 41275468 322464 NamedPipe 128 - - HostA HostA 73488749 574130
这里还有一些有用的信息:
- 我只通过小消息看到这个问题
- HostA 和 HostB 都具有相同的硬件套件(Xeon X5550@2.67GHz,总共 32 个内核/128 Gig Mem/1Gig Nics)
- 操作系统是 RHEL 5.4 内核 2.6.18-164.2.1.el5)
谢谢你