假设我们有 2 个具有相同父类的类:父类:ceil = rates = 100class 1:rate = 40 和 ceil = 100class 2:rate = 20 和 ceil = 100(所使用的数字只是理论上的,用于解释它是如何实现的)有效)两个班级都发送了
假设我们有两个具有相同父级的班级:
Parent : ceil = rate = 100 class 1 : rate = 40 and ceil = 100 class 2 : rate = 20 and ceil = 100
两个班级都在尽力发送。首先,即使它们具有不同的优先级,也允许它们发送足够的数据包来满足速率。
但父级有一些剩余带宽:100 - 40 - 20 = 40。剩余带宽根据量子分配。每个类都可以轮流发送“量子”字节。
量子的计算方式为速率(以字节为单位)/ r2q。 r2q 默认为 10,如果您创建 htb qdisc,则可以推翻 r2q。如果您创建 htb 类,则 Quantum 可能会被否决。 Quantum 应大于 MTU (1500),以便您可以发送最大数据包
1 回合且小于 60000(在 htb qdisc 中硬编码,以防止类饥饿和过长的延迟)。
量子误差不会影响功能,只会影响精度。它们还通过系统日志进行记录,因此它们会占用大量文件空间。
当类允许发送时发送的数据包仍会与速率/ceil/burst/cburst 进行匹配。因此,如果您不允许使用 burs/cburst 参数,大量子将不会创建突发。
用量子计数数据包可能会很奇怪。如果我们有低速率等级(速率 = 5kbit),则默认量子 = 5000 / 10 = 500 字节。但大多数数据包都超过 500 字节。 Htb 版本 1 和 2 使用 DRR,因此将发送大于 1000 字节的数据包,并且
它会记住它发送了多少数据,并等到数据包被偿还后再发送另一个数据包。因此,如果您发送 1000 字节,下次轮询该类时,将不允许您发送。
Htb3 使用 WRR 调度程序。当数据包大小>量子已发送,它将被发送并记录量子太小的错误。但没有回报。 WRR 调度程序比 DRR 调度程序更快。所以确保量子更大
默认数据包大小。对于 15 kbyte/s 和默认 r2q,量子数为 1500,这正是最大数据包大小。如果您想将 htb 调整为小于 15 kbyte/s 的速率,您可以手动设置 r2q 和/或量子。
示例
父级为 30,有 3 个子级 c1、c2 和 c3。 3 个类别的速率为 10。类别 2 的量子 = 1,类别 3 的量子 = 2。类别 1 发送 4,因此它得到 4。C2 和 c3 正在发送尽可能多的数据,因此 c2 和 c3 得到 10(速率总是
使满意)。父级仍有 6 个可在 c2 和 c3 之间分配。它将根据量子进行分配,因此 c2 得到 2,c3 得到 4。
class | rate | traffic | quantum | bandwidth |
---|---|---|---|---|
c1 | 10 | 4 | ? | 4 |
c2 | 10 | +++ | 1 | 10+2=12 |
c3 | 10 | +++ | 2 | 10+4=14 |