无意的带宽限制——还能去哪里寻找?

无意的带宽限制——还能去哪里寻找?

这很尴尬,但我似乎无意中对我的 Ubuntu 机器的 SSH 连接设置了持续的带宽限制。

传输文件时scp通过、sftp、 或远程服务器rsync,下载速率被限制为 2MB/s。传输文件时远程服务器,上传速率不受限制。从同一网络上的其他计算机,从同一远程服务器传输相同的文件,我可以完全饱和我的下载带宽。

这直到大约三周前才开始,在此之前,我已经频繁地从这台远程服务器传输文件已有好几年了。有时我会用rsync's标志来限制下载速率--bwlimit

它是可能的我在喝醉时通过其他机制限制了带宽,但我不记得这样做过,而且我在我的命令历史记录中找不到任何表明这一点的内容。

我多次检查了路由器的 QOS 设置,它已完全禁用。我已经梳理了路由器设置界面的其余部分(它正在运行Tomato FWIW),但无济于事。

什么可能会限制该特定机器的下载速率?

我检查过的事情:

  • ionice或 的用法nice
  • 的用法wondershaper
  • 的用法trickle
  • 路由器设置

有人对检查什么或如何调试这个有其他想法吗?

答案1

我最近的任务是确定为什么我们的应用程序服务器和特定的单个 IP 之间的流量传输速率为 160 kbits/sec,而两个系统上的所有其他流量为 10-100 Mbits/sec。

对于这两个相互通信的端点来说,限制是独一无二的。

我检查了所有明显的流量整形和流量控制解决方案,但没有成功。

最后,在分析了一些数据包捕获后,我注意到 ECN 标志仅在这两个端点之间的传输上设置。

事实证明,客户端请求显式拥塞通知 (ECN) 并在所有 SYN 数据包中设置拥塞经历 (CE),导致服务器通过降低传输速率来缓解拥塞。 CE标志设置在差分服务字段的有效数字中。

您可以使用以下命令检查 Linux 服务器设置 (/proc/sys/net/ipv4/tcp_ecn):

sysctl -a | grep _ecn

使用以下命令设置 tcp_ecn:

sysctl net.ipv4.tcp_ecn=2

可能的值为:

0 - 禁用 ECN。既不发起也不接受 ECN。
1 - 当传入连接请求时启用 ECN,并在传出连接尝试时请求 ECN。
2 - 当传入连接请求时启用 ECN,但不在传出连接上请求 ECN。

默认值:2

我使用 tcpdump 和 WireShark 来验证 CE 代码是否确实正在传输。

使用 tcpdump 开始捕获,将其保存到 pcap 文件,启动要捕获的请求,然后使用 Ctl+c 停止捕获:

tcpdump -I any -w my_capture.pcap

然后你可以在 WireShark 中打开这个 pcap 并使用过滤器来查看是否发生这种情况。

所有使用 ECN 的数据包:

tcp.flag.ecn==1

所有发送拥塞的数据包:

ip.dsfield.ecn==3

我不确定这是否能解决这个具体问题,但 OP 要求提供任何可能性。希望看到这篇文章的人可能对还要检查什么内容束手无策,会发现此信息有用,并且不会花几天时间检查配置文件。

我最终将服务器 tcp_ecn 设置为 0,带宽立即跃升至正常范围。这是一个临时修复,同时我们确定客户端在 SYN 数据包中发送 CE 标志的原因。我读过,这可能是某些系统协商它们正在使用 ECN 的方式,但那是另一个话题了。

了解 CoS 显式拥塞通知
tcp_ecn

相关内容