我正在尝试调试主机(“lowHost”)上的低 TCP 传输速率。
作为参考,我将其与第二台主机(“highHost”)进行比较。
我正在进行两项速率测量:
- 使用 curl 从 Web 服务器下载大文件。
- 使用 iperf
与 highHost 相比,lowHost 要经过一个额外的网络跳数(“路由器”)。
lowHost ---(router)----->(fw)----> internet ----> webserver
highHost ---------------->(fw)----> internet ----> webserver
“路由器” 是一台 Linux 主机,它使用 nat(iptables)并在一组网络接口之间路由流量。
我试图了解这台路由器是否是造成 TCP 速率低的原因。
我最好的猜测是,低速率是由延迟峰值引起的,这限制了 tcp cwnd。
| lowHost | highHost
--------------------------------------------------------------------------------
curl rate | 40Mbps rate | 400Mbps rate
curl wshark “rtt” | ~100 pkts with rtt>100ms | ~5 pkts with rtt>100ms
curl rwnd | 3MB | 3MB
curl cwnd | 0.2MB | 2.5MB
--------------------------------------------------------------------------------
iperf tcp rate | 100Mbps | 700Mbps
iperf tcp wshark “rtt” | 0 pkts with rtt>100ms |
iperf tcp cwnd | 0.5MB |
--------------------------------------------------------------------------------
iperf udp rate | 350Mbps |
ping stats:
lowHost --> webserver
79 packets transmitted, 79 received, 0% packet loss, time 78077ms
rtt min/avg/max/mdev = 33.285/33.664/38.176/0.800 ms
highHost --> webserver
108 packets transmitted, 108 received, 0% packet loss, time 106949ms
rtt min/avg/max/mdev = 32.684/32.855/39.706/0.689 ms
我使用 systemtap 检查内核中 ip_forward 调用的持续时间,以查看它是否是延迟峰值的来源。
当采样超过 60 秒时,最大 ip_forward 调用持续时间为 8 毫秒,这远远不足以解释 wireshark“rtt”中看到的延迟。
如果不是路由器,那还会是什么?
如果是路由器,而且不是延迟,那还会是什么?
是否有任何套接字统计数据可以指出问题所在 (/bin/ss)?
为什么 iperf 速率是 curl 速率的两倍?
wireshark 吞吐量/rtt/rwnd/cwnd 图表: