我使用这个 tc 命令来限制接口上的上传速度:
tc qdisc add dev eth1 root tbf rate 2mbit burst 10kb latency 70ms peakrate 2.4mbit minburst 1540
但它会导致严重的丢包。如果通过 (WAN) 传入的数据eth0
为 7 GB,则速率限制接口上的数据将为 6.2 GB eth1
。是否有其他速率限制解决方案可以减少丢包?
答案1
如果我理解正确的话,您正在尝试通过限制面向本地的接口上的出口流量来限制来自 ISP 的入口流量。
您看到的数据包丢失可能是预料之中的,因为丢弃的数据包是 TCP 检测拥塞的方式之一,也是路由器发出拥塞信号的方式。这也是您的路由器可以遵守您通过 tc 给予它的限制而不破坏 ie TCP 拥塞避免的唯一合理方式。 (tc 确实有使用 RED 的设施,尽管我对此了解不够,无法告诉您除了它的存在之外的任何信息)。
您可以检查 tc,而不是在向内接口上调整出口流量入口队列规则,将其连接到面向 ISP 的接口和一个 TC 过滤器以监管您的入口流量。数据包丢失仍然会发生,因为这可能是路由器发出拥塞信号的唯一可行方法。
有关示例,请参阅 LARTC 食谱条目“终极交通调节器”,其中使用 tc 的 ingress qdisc。
答案2
这取决于你的tx队列的大小,如果你严格限制,那么TC只能丢弃而不是排队数据包,不幸的是我只知道如何在cisco ios上执行此操作,而不知道如何在unix tc上执行此操作。
答案3
您可以增加队列的大小来解决该问题。 (正如 jdborg 所说)抱歉,我的评分不够高,无法直接发表评论。
这是一个例子
如果此命令产生不需要的数据包丢失
sudo tc qdisc add dev eno1 root tbf rate 1mbit burst 32kbit latency 400ms
400ms
您可以通过将延迟从 更改为来增加缓冲区(队列)大小来解决该问题10000ms
该命令现在看起来像这样sudo tc qdisc add dev eno1 root tbf rate 1mbit burst 32kbit latency 10000ms
总之:如上面所示增加队列大小将解决数据包丢失问题。这只是需要增加多少的问题。
我的研究
我在队列只有 400ms 时做了 10Mbps iPerf 测试,结果导致 90% 的 UDP 数据包丢失。当队列设置为 10000ms 时重新进行 iPerf 测试会导致 0% 的数据包丢失。
如何设置 iPerf 测试
iPerf 测试是在 PC#1 是 iPerf 服务器、PC#2 是 iPerf 客户端的情况下完成的。 PC#2 的出站连接通过tc
命令 被限制