我最近在运行一些性能测试时,偶然发现了一个有趣的TCP性能问题:将网络性能与回送性能进行比较。在我的情况下,网络性能超过了回送性能(1Gig网络,同一子网)。在我所处理的情况中,延迟非常关键,因此启用了TCP_NODELAY。我们提出的最佳理论是TCP拥塞控制正在阻止数据包的传输。我们进行了一些数据包分析,可以明确地看到数据包被阻塞了,但原因并不明显。现在有几个问题:
1)在什么情况下,以及为什么,通过回送传输通信速度会比网络传输慢?
2)在尽可能快地发送数据时,为什么在回送上切换TCP_NODELAY对最大吞吐量的影响要比在网络上大得多?
3)我们如何检测和分析TCP拥塞控制作为效果差的潜在解释?
4)是否有其他理论来解释这种现象?如果是,有没有任何证明理论的方法?
以下是由一个简单的点对点C ++应用程序生成的一些示例数据:
Transport Message Size (bytes) TCP NoDelay Send Buffer (bytes) Sender Host Receiver Host Throughput (bytes/sec) Message Rate (msgs/sec) TCP 128 开启 16777216 主机A 主机B 118085994 922546 TCP 128 关闭 16777216 主机A 主机B 118072006 922437 TCP 128 开启 4096 主机A 主机B 11097417 86698 TCP 128 关闭 4096 主机A 主机B 62441935 487827 TCP 128 开启 16777216 主机A 主机A 20606417 160987 TCP 128 关闭 16777216 主机A 主机A 239580949 1871726 TCP 128 开启 4096 主机A 主机A 18053364 141041TCP 128 关闭 4096 HostA HostA 214148304 1673033 UnixStream 128 - 16777216 HostA HostA 89215454 696995 UnixDatagram 128 - 16777216 HostA HostA 41275468 322464 NamedPipe 128 - - HostA HostA 73488749 574130
以下是更多有用的信息:
- 我只在处理小消息时发现了这个问题
- HostA和HostB都具有相同的硬件配置(Xeon X5550 @ 2.67GHz,总共32个核/ 128 Gig内存/ 1Gig网卡)
- 操作系统为RHEL 5.4内核2.6.18-164.2.1.el5)
谢谢你