我阅读了关于 HFSC 的原始SIGCOMM '97 PostScript 论文,它非常技术性,但我了解基本概念。您可以指定凸或凹服务曲线,而不是给出线性服务曲线(与几乎所有其他调度算法一样),因此可以将带宽和延迟解耦。然而,即使本文提到了正在使用的调度算法(实时和链路共享),它总是只提到每个调度类的一条曲线(解耦是通过指定这条曲线来完成的,只需要一条曲线) )。
现在已经使用ALTQ 调度框架为 BSD(OpenBSD、FreeBSD 等)实现了 HFSC,并且已经使用TC 调度框架(iproute2 的一部分)在 Linux 上实现了它。两种实现都添加了两条额外的服务曲线,这在原始论文中是没有的!实时服务曲线和上限服务曲线。再次请注意,原始论文提到了两种调度算法(实时和链接共享),但在那篇论文中,它们都使用一个单一的服务曲线。正如您目前在 BSD 和 Linux 中发现的那样,从来没有两条独立的服务曲线。
更糟糕的是,某些版本的 ALTQ 似乎为 HSFC 添加了额外的队列优先级(原始论文中也没有优先级这样的东西)。我发现有几个 BSD HowTo 提到了这个优先级设置(尽管最新的 ALTQ 版本的手册页不知道 HSFC 的这个参数,所以正式它甚至不存在)。
这一切都使得 HFSC 调度比原始论文中描述的算法更加复杂,并且互联网上有大量的教程经常相互矛盾,其中一个声称与另一个相反。这可能是为什么似乎没有人真正了解 HFSC 调度的真正工作原理的主要原因。在我提出问题之前,我们需要某种示例设置。我将使用一个非常简单的方法,如下图所示:
替代文字 http://f.imagehost.org/0177/hfsc-test-setup.png
以下是一些我无法回答的问题,因为教程相互矛盾:
我到底需要什么实时曲线?假设 A1、A2、B1、B2 都是 128 kbit/s 的链路共享(其中任何一个都没有实时曲线),那么如果根有 512 kbit/s 分配(并且A 和 B 当然都是 256 kbit/s),对吧?为什么还要给 A1 和 B1 一个 128 kbit/s 的实时曲线?这有什么好处?给这两个更高的优先级?根据原始论文,我可以通过使用曲线给它们更高的优先级,毕竟这就是 HFSC 的意义所在。通过给两个类一个 [256kbit/s 20ms 128kbit/s] 的曲线,它们的优先级都是 A2 和 B2 的两倍(平均仍然只有 128 kbit/s)
实时带宽是否计入链路共享带宽?例如,如果 A1 和 B1 都只有 64kbit/s 的实时带宽和 64kbit/s 的链路共享带宽,这是否意味着一旦通过实时为它们提供 64kbit/s 的服务,它们的链路共享要求也得到了满足(他们可能获得额外的带宽,但让我们暂时忽略它)或者这是否意味着他们通过链接共享获得了另外的 64 kbit/s?那么每个类是否都有实时加链接共享的带宽“要求”?或者如果链路共享曲线高于实时曲线(当前链路共享要求等于指定的链路共享要求减去已经提供给此的实时带宽),一个类是否只具有比实时曲线更高的要求?班级)?
上限曲线是否也适用于实时,仅适用于链接共享,或者可能适用于两者?有些教程说一种方式,有些人说另一种方式。甚至有人声称上限是实时带宽+链路共享带宽的最大值?真相是什么?
假设 A2 和 B2 都是 128 kbit/s,如果 A1 和 B1 仅是 128 kbit/s 链路共享,或 64 kbit/s 实时和 128 kbit/s 链路共享,是否有任何区别? ,有什么区别?
如果我使用单独的实时曲线来增加类的优先级,我为什么需要“曲线”呢?为什么实时不是一个固定值,链接共享也是一个固定值?为什么两条曲线?原始论文中明确需要曲线,因为每个类只有一个此类属性。但是现在,有了三个属性(实时、链接共享和上限),我还需要每个属性上的曲线做什么?为什么我希望曲线形状(不是平均带宽,而是它们的斜率)对于实时和链接共享流量是不同的?
根据可用的少量文档,内部类(A 类和 B 类)的实时曲线值完全被忽略,它们仅适用于叶类(A1、A2、B1、B2)。如果这是真的,为什么ALTQ HFSC 示例配置(搜索3.3 示例配置)设置内部类的实时曲线并声称这些设置了这些内部类的保证速率?这不是完全没有意义吗?(注意:pshare 在 ALTQ 中设置链路共享曲线并光栅化实时曲线;您可以在示例配置上方的段落中看到这一点)。
有的教程说所有实时曲线的总和不能高于线速的80%,也有的说不能高于线速的70%。哪一个是对的,或者他们可能都错了?
一个教程说你会忘记所有的理论。不管事情真的如何运作(调度程序和带宽分配),根据下面的“简化思维模型”想象这三条曲线:实时是此类将始终获得的保证带宽。link-share 是这个类想要完全满足的带宽,但是不能保证满足。如果有多余的带宽,该类甚至可能会获得比满足所需更多的带宽,但它可能永远不会使用超过上限所说的。要使所有这些工作,所有实时带宽的总和可能不会超过线路速度的 xx%(请参阅上面的问题,百分比会有所不同)。问题:这或多或少是准确的还是对 HSFC 的完全误解?
如果上述假设确实准确,那么该模型中的优先级在哪里?例如,每个类可能有一个实时带宽(保证)、一个链路共享带宽(不保证)和一个上限,但仍然有一些类比其他类具有更高的优先级需求。在那种情况下,我仍然必须以某种方式优先考虑,即使在这些类的实时流量中也是如此。我会按曲线的斜率优先考虑吗?如果是这样,哪条曲线?实时曲线?链接份额曲线?上限曲线?他们全部?我会给它们所有人相同的斜率还是每个不同的斜率以及如何找出正确的斜率?
我仍然没有失去希望,这个世界上至少存在一群真正了解 HFSC 并能够准确回答所有这些问题的人。这样做而不在答案中相互矛盾会非常好;-)