使用tc进行流量整形是不准确的,带宽和延迟都很高

时间:2012-03-23 18:39:56

标签: linux network-programming trafficshaping ipfw

我正在使用内核2.6.38.8的tc进行流量整形。限制带宽工作,增加延迟工作,但在使用延迟整形两个带宽时,如果限制大于1.5 Mbps左右,实现的带宽总是远低于限制。

示例:

tc qdisc del dev usb0 root
tc qdisc add dev usb0 root handle 1: tbf rate 2Mbit burst 100kb latency 300ms
tc qdisc add dev usb0 parent 1:1 handle 10: netem limit 2000 delay 200ms

产生201 ms的延迟(来自ping),但容量仅为1.66 Mbps(来自iperf)。如果我消除延迟,带宽恰好是2 Mbps。如果我指定1 Mbps和200 ms RTT的带宽,一切正常。我也尝试过ipfw + dummynet,产生类似的结果。

我尝试在Kconfig中使用HZ=1000重建内核 - 但这并没有解决问题。其他想法?

2 个答案:

答案 0 :(得分:5)

这实际上不是一个问题,它的行为就像它应该的那样。由于您已经添加了200毫秒的延迟,因此完全没有使用完整的2Mbps管道。我建议您更详细地研究TCP / IP协议,但这里是对iperf发生的事情的简短总结:您的默认窗口大小可能是3个数据包(可能每个1500个字节)。你用3个数据包填充你的管道,但现在必须等到你收到确认(这是拥塞控制机制的一部分)。由于您将发送延迟200毫秒,这将需要一段时间。现在你的窗口大小将增加一倍,然后你可以发送6个数据包,但是还需要等待200ms。然后窗口大小再次翻倍,但是当窗口完全打开时,默认的10秒iperf测试接近结束,你的平均带宽显然会更小。

答案 1 :(得分:0)

这样想:

假设您将延迟设置为1小时,速度设置为2 Mbit / s。

对于TCP ACK,2 Mbit / s要求(例如)50 Kbit / s。由于ACK需要一个多小时才能到达源,因此源无法继续以2 Mbit / s的速度发送,因为TCP窗口仍在等待第一次确认。

延迟和带宽与您的想法相关(至少在TCP中.UDP是一个不同的故事)