问题现象

当出现这三个条件共存的情况下会出现scp速度变为0问题。

  1. 设置防火墙规则过滤掉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
    ......
  2. 设置 tcp_sack = 1
    [root@EulerOS-BaseTemplate ~]# sysctl -a | grep tcp_sack
    net.ipv4.tcp_sack = 1
  3. 在链路上发生丢包。

原因分析

  • net.ipv4.tcp_sack与防火墙规则冲突导致。
  • tcp_sack 设置快速重传,但是防火墙规则把sack需要的信息给strip掉了,导致重传的数据失效,只能慢速传输,速度到最低。
  • 在不发生丢包的情况下,没有触发重传场景,则不复现该问题。

解决方法

有两种修改方法,解决冲突问题:

  • 打开sack功能,把防火墙过滤sack-permitted,sack规则去掉,在丢包场景下tcp性能较好。
  • 关闭sack功能,设置net.ipv4.tcp_sack = 0,在丢包乱序场景下tcp性能较差。

发表评论

邮箱地址不会被公开。 必填项已用*标注