HTB 调度程序出现意外行为,低优先级流量紧缺高优先级流量

HTB 调度程序出现意外行为,低优先级流量紧缺高优先级流量

我正在努力确保家庭网关级别的 UDP 流量延迟低。在这个家庭网关上,我有两种类型的流量,TCP 和 UDP,我使用 HTB 确保区别对待。我测试的带宽等于 1Mbit/s(因此它连接到模拟的 ADSL 1Mbit 链路)。

我使用以下配置:

tc qdisc add dev br0 handle 1: root htb default 15
tc class add dev br0 parent 1: classid 1:1 htb rate 1000kbit ceil 1000kbit
tc class add dev br0 parent 1:1 classid 1:14 htb rate 200kbit ceil 1000kbit prio 1
tc class add dev br0 parent 1:1 classid 1:15 htb rate 10bit ceil 1000kbit prio 2
tc filter add dev br0 parent 1: protocol ip u32 match ip tos 0xb8 0xff flowid 1:14 (UDP)
tc filter add dev br0 parent 1: protocol ip u32 match ip tos 0x00 0xff flowid 1:15 (TCP)
tc qdisc add dev br0 parent 1:14 handle 20: sfq limit 40
tc qdisc add dev br0 parent 1:15 handle 50: pfifo limit 1000 

为了了解流量如何交互,对于 UDP,我使用“阶梯式”流量,因此我从 0bit/s 开始,每十秒将流量增加 100kbit/s。当我达到 1Mbit/s 时,我每 10 秒减少 100kbit/s,直到达到零。

除此之外,我还有 TCP 流量,要么是文件上传,要么是简单的 iperf(对观察到的行为没有任何影响)。

通常情况下,大多数时候我都会得到预期的行为。因此我可以完美地看到 TCP/UDP 流量分离和 UDP 的“阶梯式”趋势。此外,UDP 流量接管了 TCP(但 TCP 仍然可以发送 - 趋势与 UDP 相反,因此先减少,然后增加)。

但是,我有时会看到 TCP 完全接管 UDP 流量几秒钟。在测试期间,这种情况会发生 1 到 3 次。一般来说,这种情况至少发生一次,当 UDP 比特率已经在下降时(大约 30 秒后才达到 0),TCP 流量会完全接管几秒钟(3 到 5 秒)。我真的无法理解这种行为,因为看起来 UDP 流量无法发送,但它不应该超过其上限,因为它的比特率已经在下降。

我认为这与 HTB 调度和出于某种原因阻止高优先级流量有关。因此,当计算我的高优先级流量的速率时,它不知何故高于其上限。

  • 但是,如果比特率较低,为什么高优先级流量会达到其上限?
  • 为什么低优先级流量可以阻塞其他流量几秒钟,即使其保证速率接近于零?

我尝试过改变不同的参数(突发、天花板、速率),但没有看到任何改善。

预先感谢您的帮助。

相关内容