![htb qdesc 树如何处理带宽过度分配?](https://linux22.com/image/178371/htb%20qdesc%20%E6%A0%91%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%B8%A6%E5%AE%BD%E8%BF%87%E5%BA%A6%E5%88%86%E9%85%8D%EF%BC%9F.png)
假设我有一个简单的 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
这是非常古老的文档,但今天仍然适用。