我使用内核为 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
延迟(来自 ping)为 201 毫秒,但容量仅为 1.66 Mbps(来自 iperf)。如果我消除延迟,带宽恰好是 2 Mbps。如果我指定 1 Mbps 的带宽和 200 毫秒的 RTT,则一切正常。我也尝试过 ipfw / dummynet,结果类似。
我尝试在 Kconfig 中将 HZ=1000 重新构建内核——但这并没有解决问题。还有其他想法吗?
答案1
想象一下,如果你试图以每小时 55 英里的速度行驶,而你踩下油门和汽车加速之间有一秒钟的延迟,那么你将很难做到这一点。
你至少有一个优势,那就是知道你需要以每小时 55 英里的速度行驶。现在,假设你不知道这一点。那么会发生什么呢?当你的车速超过每小时 55 英里时,你会停下来,不得不再次加速,而你不知道自己会以什么速度停下来。
你肯定不会平均得 55 分,对吧?
这里也是一样。TCP 堆栈不知道它被限制在 2MBps,必须尝试找到该限制。而延迟意味着它无法对已达到限制的信息做出快速反应。由于硬限制,它实际上永远无法超过 2Mbps,因此其平均值将低于该值。
您可以使用burst
和/或minburst
设置来改善这种情况。本质上,这些设置的作用是,如果连接速度低于其限制,则让连接速度稍微超过其限制。这样,它有时会超过 2Mbps,这样它的平均速度就会更接近 2Mbps。