试图了解 HTB 子类比率

Eri*_*AND 5 traffic-shaping tc htb

我目前正在研究使用 Ubuntu 服务器而不是我的消费者级路由器来提供 QoS 的机会。我已经阅读了很多关于tc和 HTB 排队规则的资源——这看起来是我需要满足我的 QoS 需求的资源,即使现在大部分看起来很清楚,仍然有一些东西让我在子类率方面感到困扰。

让我们来看看这个示例配置作为这个问题的答案:

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
Run Code Online (Sandbox Code Playgroud)

当您知道tc 的工作原理时,这非常简单:三个子类都保证有 30kbps 的带宽,但允许从其父类借用 30 kbps 以上的可用带宽(30 + 30 = 60kbps ceil)。

这个例子对我来说很有意义。父类的总带宽为 90kbps,三个子类中的每一个都保证 30kbps - 3 x 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
Run Code Online (Sandbox Code Playgroud)

这就是事情让我感到困惑的地方。第一个子类保证5mbit的带宽,而第二个子类保证3mbit的带宽。但是父类只有6mbit的带宽!

制定这样的规则的目的是什么?没有一个子类将永远能够获得其保证的带宽。

更令人困惑的是教程的结论:

HTB 看起来确实很棒——如果 10: 和 20: 都有保证的带宽,还有更多的带宽需要分配,那么它们以 5:3 的比例借用,正如您所期望的那样。

这两个班级怎么可能有保证的带宽,他们的父级仍然有带宽可以借用?

毫无疑问,我在这里遗漏了一些东西。这可能是有缺陷的教程,但我发现了很多其他的样品用同一种混淆设置的-在这里例如:

/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
Run Code Online (Sandbox Code Playgroud)

使用这种配置,在这种情况下,1:20 类可以向父类借用带宽(最多可以借用 1600kbit),因为其兄弟类的保证带宽是 1500kbit - 其兄弟类的 1500kbit 加上 500kbit它自己的保证带宽已经匹配父2000kbit带宽。

任何人都可以澄清情况吗?

小智 1

您确实了解 htb 的工作原理。
尽管如此,您需要仔细查看示例:两个父类都没有ceil选择,然后将使用更多带宽(如果可用)。如果在最后一个示例中,父类有rate 2000kbit ceil 2000kbit,则子类将无法借用那么多带宽。

不过,我确实同意,在 5+3Mbit 示例中,如果带宽大于 6Mbit,则两个类都不会获得保证的带宽。
这可能是一个错误。