使用tc进行stream量整形不适用于高延迟和带宽

我使用内核2.6.38.8的tc进行stream量整形。 限制带宽工作,增加延迟工作,但是当对带宽进行延迟整形时,如果限制> 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 

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

我已经尝试在Kconfig中使用重buildHZ = 1000的内核 – 这并没有解决问题。 其他想法?

想象一下,如果你在踩油门和踩油门之间有一秒的延迟时间,那么试试每小时行驶55英里。 你会很难做到这一点。

而且你至less有一个好处,就是你知道你需要每小时行驶55英里。 现在,想象你不知道这一点。 那么,当你每小时超过55英里的时候,你会停下来,不得不重新加速,不知道你会以什么样的速度停下来。

你当然不会平均55,你会吗?

这里一样的东西。 TCP堆栈不知道它被限制在2MBps,并且必须尝试find这个限制。 等待时间意味着它不能很快地对它达到极限的信息作出反应。 由于实际上不能超过2Mbps,由于硬性限制,其平均值将会低于此值。

您可以通过burst和/或小minburst设置来改善这一点。 从本质上来说,如果连接超出限制,连接就会超出限制。 这样,在某些时候它将会超过2Mbps,这样它的平均接近2Mbps。