scp传送大文件速度逐渐变为0,传送缓慢问题的解决方法
问题现象
当出现这三个条件共存的情况下会出现scp速度变为0问题。
- 设置防火墙规则过滤掉sack-permitted、sack 报文头信息:
[root@EulerOS-BaseTemplate ~]# iptables -L -t mangle ...... Chain INPUT (policy ACCEPT) target prot opt source destination TCPOPTSTRIP tcp -- anywhere anywhere TCPOPTSTRIP options mss,sack-permitted,sack,timestamp,md5 ...... - 设置 tcp_sack = 1
[root@EulerOS-BaseTemplate ~]# sysctl -a | grep tcp_sack net.ipv4.tcp_sack = 1 - 在链路上发生丢包。
原因分析
- net.ipv4.tcp_sack与防火墙规则冲突导致。
- tcp_sack 设置快速重传,但是防火墙规则把sack需要的信息给strip掉了,导致重传的数据失效,只能慢速传输,速度到最低。
- 在不发生丢包的情况下,没有触发重传场景,则不复现该问题。
解决方法
有两种修改方法,解决冲突问题:
- 打开sack功能,把防火墙过滤sack-permitted,sack规则去掉,在丢包场景下tcp性能较好。
- 关闭sack功能,设置net.ipv4.tcp_sack = 0,在丢包乱序场景下tcp性能较差。