我目前正在研究使用Ubuntu服务器来提供QoS而不是我的消费级路由器的机会。 我已经阅读了很多关于tc和HTB排队规则的资源,这些资源看起来是我需要的QoS需求,即使现在大部分看起来很清楚,仍然有一些东西让我感到子类率。
让我们来看看这个样本configuration作为这个问题的答案:
tc class add dev eth0 parent 1: classid 1:1 htb rate 90kbps ceil 90kbps tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 60kbps tc class add dev eth0 parent 1:1 classid 1:11 htb rate 30kbps ceil 60kbps tc class add dev eth0 parent 1:1 classid 1:12 htb rate 30kbps ceil 60kbps
当你知道tc如何工作时,这是非常简单的:三个子类都保证了30kbps的带宽,但是允许从他们的父类(30 + 30 = 60kbps ceil)借用30kbps的可用带宽。
这个例子对我有意义。 父类的总带宽为90kbps,三个子类中的每一个都保证30kbps – 3×30kbps = 90kbps。
现在,让我们来看看这个教程中的另一个例子:
# tc class add dev eth0 parent 1: classid 1:1 htb rate 6mbit burst 15k # tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit burst 15k # tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 6mbit burst 15k # tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1kbit ceil 6mbit burst 15k
这就是让我感到困惑的地方。 第一个子类保证带宽为5mbit,而第二个子类保证3mbit的带宽。 但是父类只有6mbit的带宽!
这个规则的目的是什么? 没有一个子类能够获得其保证的带宽。
更令人困惑的是本教程的结论:
HTB当然看起来很棒 – 如果10:和20:都有自己的保证带宽,还有更多的需要分割的话,那么他们以5:3的比例借用,就像你期望的那样。
两个class怎么能保证他们的带宽,他们的父母还有带宽借用?
毫无疑问,我在这里错过了一些东西。 这可能是有缺陷的教程,但我发现了很多其他样本与相同types的混淆设置 – 例如:
/sbin/tc class add dev eth3 parent 1: classid 1:1 htb rate 2000kbit /sbin/tc class add dev eth3 parent 1:1 classid 1:10 htb prio 1 rate 1500kbit ceil 1950kbit /sbin/tc class add dev eth3 parent 1:1 classid 1:20 htb prio 2 rate 500kbit ceil 1600kbit
有了这个configuration,在这种情况下,1:20类可以借用带宽到父类(允许借用高达1600kbit),因为其兄弟的保证带宽是1500kbit,其兄弟的1500kbit加上500kbit的它自己的保证带宽已经匹配父2000kbit带宽。
任何人都可以澄清的情况?
你明白了如何工作。
虽然,你需要仔细看看你的例子:两个父类都没有ceil选项,然后将使用更多的带宽(如果可用)。 如果在最后一个例子中,父类具有rate 2000kbit ceil 2000kbit ,则子类将不能借用那么多的带宽。
但是,我确实同意在5 + 3Mbit的例子中,如果带宽大于6Mbit,那么两个类都不会有保证的带宽。
这一个可能是一个错误。