我最近偶然发现一个有趣的TCP性能问题,同时运行一些比较网络性能和环回性能的性能测试.在我的情况下,网络性能超出了环回性能(1Gig网络,同一个子网).在这种情况下,我处理延迟是至关重要的,所以TCP_NODELAY被启用.我们提出的最好的理论是TCP拥塞控制是阻止数据包.我们做了一些分组分析,我们可以肯定地看到数据包正在被持有,但原因不明显.现在的问题…
1)在什么情况下,为什么通过环回进行通信会比网络慢?
2)尽可能快地发送,为什么切换TCP_NODELAY会比通过网络对环回的最大吞吐量有更多的影响?
3)如何检测和分析TCP拥塞控制作为对性能不佳的潜在解释?
4)有没有其他理由说明这个现象的原因?如果是,任何方法来证明理论?
以下是一个简单的点对点应用程序生成的一些示例数据:
Transport Message Size (bytes) TCP NoDelay Send Buffer (bytes) Sender Host Receiver Host Throughput (bytes/sec) Message Rate (msgs/sec)
TCP 128 On 16777216 HostA HostB 118085994 922546
TCP 128 Off 16777216 HostA HostB 118072006 922437
TCP 128 On 4096 HostA HostB 11097417 86698
TCP 128 Off 4096 HostA HostB 62441935 487827
TCP 128 On 16777216 HostA HostA 20606417 160987
TCP 128 Off 16777216 HostA HostA 239580949 1871726
TCP 128 On 4096 HostA HostA 18053364 1