Linux QoS:空闲时间内的批量数据传输

Linux QoS:空闲时间内的批量数据传输

如何进行 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 分钟平均值保持在限制以下的安全范围内。更复杂的流量预测方案是可选的。

相关内容