![HTB 调度程序出现意外行为,低优先级流量紧缺高优先级流量](https://linux22.com/image/680890/HTB%20%E8%B0%83%E5%BA%A6%E7%A8%8B%E5%BA%8F%E5%87%BA%E7%8E%B0%E6%84%8F%E5%A4%96%E8%A1%8C%E4%B8%BA%EF%BC%8C%E4%BD%8E%E4%BC%98%E5%85%88%E7%BA%A7%E6%B5%81%E9%87%8F%E7%B4%A7%E7%BC%BA%E9%AB%98%E4%BC%98%E5%85%88%E7%BA%A7%E6%B5%81%E9%87%8F.png)
我正在努力确保家庭网关级别的 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 调度和出于某种原因阻止高优先级流量有关。因此,当计算我的高优先级流量的速率时,它不知何故高于其上限。
- 但是,如果比特率较低,为什么高优先级流量会达到其上限?
- 为什么低优先级流量可以阻塞其他流量几秒钟,即使其保证速率接近于零?
我尝试过改变不同的参数(突发、天花板、速率),但没有看到任何改善。
预先感谢您的帮助。