htb qdesc 树如何处理带宽过度分配?

htb qdesc 树如何处理带宽过度分配?

假设我有一个简单的 htb 层次结构(请参阅man 8 tc-htb) 设置为子 htb 类指定的总带宽超过为根 htb 类指定的总带宽:

tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 70kbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 70kbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 70kbps

这里根 htb 类的最大值为 100kbps,但子 htb 类的集体最大值为 160kbps。

内核将如何处理以最大速率生成流量的所有三个子进程?在这种情况下,我可以使用中介 sfq 来确保公平对待总流量吗?

更重要的是,如果生成的总流量超过硬件接口的带宽,内核如何决定让哪些流量通过?

答案1

HTB 的一般建议是确保“子类的费率总和等于或小于父类的费率”。

如果子类允许更高的速率,则 HTB 将超出带宽限制。对父级的限制不强制执行,它仅用于“借用带宽”计算(根据上限速率)。实际的带宽限制仅由子(叶)类强制执行。

或者至少这就是多年前邮件列表上的解释:

如果父类 ceil 小于子类 ceil 的总和,则子类可能消耗比父类允许的更多的带宽。发生这种情况是因为父类从未被检查过!仅当子级超出利率并希望向父级借用时,才会检查父级。

https://www.spinics.net/lists/lartc/msg08619.html

这是非常古老的文档,但今天仍然适用。

相关内容