两台同可用区机器之间传文件,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,同样延迟下重传率没有上升。

这里还有个坑。单流吞吐约等于窗口除以往返时延,跨地域长链路尤其明显;能并发传输就优先多流,比调内核参数见效快。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189