两台同可用区机器之间传文件,scp 只能跑到 300Mbps,网卡是万兆,用 iperf3 单流测也是这个数,往返延迟四毫秒。
真正麻烦的地方在于,几个原因的现象几乎一样。单条连接的窗口受带宽时延积限制;socket 收发缓冲区还是默认的 212992 字节;传输只开了单线程,没有并发流;中间设备的限速策略按单流生效。
上来先用 iperf3 确认单流上限
iperf3 -c 10.0.2.20 -t 30 -P 1
多流并发看能否叠加
iperf3 -c 10.0.2.20 -t 30 -P 8
接着放大收发缓冲区
sysctl -w net.ipv4.tcp_rmem='4096 87380 33554432' && sysctl -w net.ipv4.tcp_wmem='4096 65536 33554432'
末了开启窗口缩放并复核吞吐
sysctl net.ipv4.tcp_window_scaling && iperf3 -c 10.0.2.20 -t 30 -w 4M
命令输出我都留了记录,免得改完记不清原来的值。
改之前先确认了最近有没有人动过配置,避免白查一遍。
别只看报错消失,验证要多做一步。单流吞吐提升到 1.5Gbps 以上,多流叠加能到 8Gbps,同样延迟下重传率没有上升。
这里还有个坑。单流吞吐约等于窗口除以往返时延,跨地域长链路尤其明显;能并发传输就优先多流,比调内核参数见效快。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
