我正在尝试通过 Linux 机器之间的“高延迟网络”来提高 TCP 吞吐量,但会出现一些数据包丢失。
我将tcp_mem
、tcp_wmem
和设置tcp_rmem
为“8192 20530752 20530752”。
我将 、 和 设置rmem_max
为wmem_max
“ rmem_default
20530752 wmem_default
”。
我将netdev_max_backlog
和设置txqueuelen
为 50000。
我设置tcp_congestion_control
为“scalable”。
我使用“nist”(cnistnet)模拟延迟 50ms(每个方向 25ms)和下降 0.5%(每个方向 0.25%),我达到的带宽约为 7.48mbps。
以下是结果表(使用 iperf 测量速率):
| 0ms | 50ms
0% | 710mbps | 276mbps
0.5% | 181mbps | 7.48mbps
我没想到延迟会对吞吐量产生如此大的影响(在这些大的 TCP 窗口下)。我也没想到丢包会产生如此大的影响。尤其是使用“可扩展”算法时,因为它的“拥塞窗口”应该能够从丢包中快速恢复。
我使用tcpdump
& sar
(sysstat 的一部分)尝试查看发生了什么。我没有在 sar 的报告中看到任何可疑的内容。在 tcp dump 中我看到:
“rexmt data pkts” = 88(共发送 8183 个)
“rexmt data bytes” = 127,424 字节(共发送 44,649,104 个字节)
“avg owin” = 135,964 字节。
“avg retr time” = 53.5 毫秒。
这是 TCP 所能做到的最好吗?在这种情况下,没有其他算法可以实现更好的吞吐量吗?我的场景是否与众不同(我认为 50ms 延迟和 0.5 丢包是正常的 WAN 属性)?