如何进行 QoS 设置,使某个低优先级数据流获得高达 X Mbps 的带宽,但前提是此接口上的当前总带宽(所有流/类)不超过 X?同时,其他数据流/类不得限制为 X。
用例是 ISP 通过计算 5 分钟间隔内的带宽平均值并计费最高值来计费流量。我希望将最大使用量保持在最低水平(即在接口繁忙时抑制批量传输),但在空闲/低流量时让数据传输通过。
查看经常使用的分类调度程序 CBQ、HTB 和 HSFC,我找不到实现此目的的直接方法。
答案1
我让它在 hfsc 中工作。我假设您示例中的“X”是 100mbit,但当然可以是任何值。
这里的技巧是创建一个像这样的树类:
+--------------------------------------------------------------+ +---------------------+
| | | 1:1 |
| root | |---------------------|
| + | | Rate: 100mbit |
| | | | Upper Rate: 100mbit |
| | | | |
| | | | |
| | | | |
| +----v------+ | +---------------------+
| | 1:1 | |
| | | | +---------------------+
| +--+---+----+ | | 1:10 |
| | | | |---------------------|
| | | | | Rate: 100mbit |
| | | | | Upper Rate: 100mbit |
| | | | | |
| +----------+------+ +--------+----------+ | | |
| | 1:10 | | 1:11 | | | |
| | | | | | +---------------------+
| +----------+ +----------+ |
| | +---------------------+
| | | 1:11 |
| | |---------------------|
| | | Rate: 10kbit |
+--------------------------------------------------------------+ | Upper Rate: 100mbit |
| |
| |
| |
+---------------------+
之所以会发生这种神奇的事情,是因为 1:10 类(默认类)被设置为始终获得 100mbit 的保证带宽,而“慢速”1:11 类仅提供 10kbit 的保证带宽,突发至 100mbit。
这会迫使根类(1:1)始终满足 1:10 而不是 1:11 的需求。
注意事项:
- 不要使用 iptables CLASSIFY 目标将流量放入 1:11。其 真的很慢分类。请使用流量控制过滤器。或者,如果您要在此处输入大量应用程序,并且过滤的端口可能有所不同,请使用 cgroup。
- 将 hfsc 上的默认目标设置为 1:10。
- 您可能应该将“慢速”链接设置为至少主机的 TCP 最大段大小。这样,您就可以尝试让发送应用程序卡在慢速队列中,长时间阻塞,而无需内核重新协商窗口大小等。
我测试了这一点,让两个竞争应用程序通过 2 个服务尽可能快地向相邻主机发送数据。其中一个服务属于 1:11 类。它们都通过 100mbit 发送了 5 秒的流量(因此传输了 60MB 的数据)。当无类运行时,正如预期的那样,两者都在 10 秒内完成(两者都共享链接,因此时间分配相等)。
通过此 QoS 设置,优先级服务在 5 秒内完成,而低优先级服务在 10 秒内完成(好像低优先级正在等待高优先级先完成),我认为这就是您想要的。
答案2
我不确定这是否有效,但你可以尝试 HTB:
- 对于低优先级流,将设置
rate
为零(或几乎为零),并将ceil
设置为实际最大值 X。这会导致低优先级流的保证速度为零,并且有机会借款来自其他流的最大速度为 X MBit/s。 - 对于其他流,将速率设置为您的网络接口的速度。
根据HTB 文档,这应该可行。不过,我自己没有尝试过。
编辑:当链接有 X MBit/s 空闲带宽时,这不会限制低优先级流量。但这可能是一个开始...
答案3
这很尴尬,但如果您可以手动更改限制,那么您可以让守护进程在更精细的网格上进行平均(例如,1 分钟间隔,跟踪最后 5-10 分钟)。然后,您只需要一个相当简单的控制循环,您可以在其中调整流量限制,以使 5 分钟平均值保持在限制以下的安全范围内。更复杂的流量预测方案是可选的。