队列指的是在缓存中对报文进行排序的逻辑。当流量的速率超过接口带宽或超过为该流量设置的带宽时,报文就以队列的形式暂存在缓存中。报文离开队列的时间、顺序,以及各个队列之间报文离开的相互关系由队列调度算法决定。
华为交换机设备的每个端口上都有 8 个下行队列,称为CQ(Class Queue)队列,也叫 端口队列(Port-queue),在交换机内部与前文提到的 8 个PHB一一对应,分别为BE、 AF1、AF2、AF3、AF4、EF、CS6 和CS7。单个队列的报文采用 FIFO(First In First Out)原则入队和出队。
PQ(Priority Queuing)调度
PQ(Priority Queuing)调度,就是严格按照队列优先级的高低顺序进行调度。只有 高优先级队列中的报文全部调度完毕后,低优先级队列才有调度机会。 采用PQ 调度方式,将延迟敏感的关键业务放入高优先级队列,将非关键业务放入 低优先级队列,从而确保关键业务被优先发送。 PQ调度的缺点是:拥塞发生时,如果较高优先级队列中长时间有分组存在,那么 低优先级队列中的报文就会由于得不到服务而“饿死”。
假设端口有 3 个采用PQ调度的队列,分别为高优先(High)队列、中优先(Medium) 队列、和低优先(Low)队列,它们的优先级依次降低。如图,其中报文编号表示报文到达顺序。
图1 PQ调度
RR(Round Robin)调度
RR调度采用轮询的方式,对多个队列进行调度。RR以环形的方式轮询多个队列。 如果轮询的队列不为空,则从该队列取走一个报文;如果该队列为空,则直接跳过该队列,调度器不等待。
图2 RR调度
RR调度各个队列之间没有优先级之分,都能够有相等的概率得到调度。RR调度的缺点是:所有队列无法体现优先级,对于延迟敏感的关键业务和非关键业务无法得到区别对待,使得关键业务无法及时得到处理
WRR(Weighted Round Robin)调度
—
加权轮询WRR(Weighted Round Robin)调度主要解决RR不能设置权重的不足。 在轮询的时候,WRR每个队列享受的调度机会和该队列的权重成比例。RR调度相当于权值为 1 的WRR调度。 WRR的实现方法是为每个队列设置一个计数器 Count,根据权重进行初始化。每次 轮询到一个队列时,该队列输出一个报文且计数器减一。当计数器为 0 时停止调度该队列,但继续调度其他计数器不为 0 的队列。当所有队列的计数器都为 0 时,所有计数器重新根据权重初始化,开始新一轮调度。在一个循环中,权重大的队列被多次调度。
图3 WRR调度
=得不到及时调度。
DRR(Deficit Round Robin)调度
差分轮询DRR(Deficit Round Robin)调度实现原理与RR调度基本相同。DRR与RR的区别是:RR调度是按照报文个数进行调度,而DRR是按照报文长度进行调度。
DRR为每个队列设置一个计数器Deficit,Deficit 初始化为一次调度允许的最大字节数, 一般为接口MTU。每次轮询到一个队列时,该队列输出一个报文且计数器Deficit 减去报文长度。如果报文长度超过了队列的调度能力,DRR调度允许Deficit 出现负值,以保证长报文也能够得到调度。但下次轮循调度时该队列将不会被调度。当计数器为 0 或 负数时停止调度该队列,但继续调度其他计数器为正数的队列。当所有队列的Deficit 都为 0 或负数时,将所有队列的Deficit 计数器加上初始值,开始新一轮调度。
假设某端口MTU=150Bytes,有 2 个队列Q1和Q2采用DRR调度,Q1 队列中有多个 200Bytes 的长报文,Q2队列中有多个100Bytes 的端报文,则调度过程如图 4 所示。
图4 DRR调度
由图4可以看出,经过第 1~6 轮DRR调度,Q1队列被调出了3个200Bytes 的报文, Q2队列被调出了6个100Bytes 的报文。从长期的统计看,Q1和 Q2 的实际输出带宽比 是 1:1,为公平的比例。DRR调度避免了采用PQ调度时低优先级队列中的报文可能长时间得不到服务的缺点。 但是,DRR调度不能设置权重,且也具有低延时需求业务(如语音)得不到及时调度的缺点。
DWRR(Deficit Weighted Round Robin)调度
差分加权轮询DWRR(Deficit Weighted Round Robin)调度主要解决DRR不能设置权重的不足。DRR调度相当于权值为 1 的DWRR调度。 DWRR为每个队列设置一个计数器Deficit,Deficit 初始化为Weight * MTU。每次轮询到一个队列时,该队列输出一个报文且计数器Deficit 减去报文长度。当计数器为 0 时停止调度该队列,但继续调度其他计数器不为 0 的队列。当所有队列的计数器都为 0 时,所有计数器的Deficit 都加上Weight*MTU,开始新一轮调度。
图5 DWRR调度
假设某端口MTU=150Bytes,有 2 个队列Q1和Q2采用DRR调度,Q1 队列中有 多个 200Bytes 的长报文,Q2队列中有多个 100Bytes 的端报文,Q1和Q2配置权重 比为weight1:weight2=2:1。则DWRR调度过程如图 2-37。
第一轮调度 Deficit[1] =weight1* MTU=300,Deficit[2] = weight2* MTU=150Bytes,从 Q1 队 列取出 200Bytes 报文发送,从Q2队列取出 100Bytes 发送;发送后,Deficit[1] = 100,Deficit[2] =50。
第二轮调度
从 Q1 队列取出 200Bytes 报文发送,从Q2队列取出 100Bytes 发送;发送后, Deficit[1] = -100,Deficit[2] =-50。
第三轮调度
此时两个队列都为负,因此,Deficit[1] = Deficit[1]+weight1* MTU=-100+2150=200,Deficit[2] = Deficit[2]+weight2 MTU=-50+1*150=100。
从 Q1 队列取出 200Bytes 报文发送,从Q2队列取出 100Bytes 发送;发送后, Deficit [1] = 0,Deficit[2] = 0。
由上图可以看出,经过第 1~3 轮DWRR调度,Q1队列被调出了3个200Bytes 的 报文,Q2 队列被调出了3个100Bytes 的报文。从长期的统计看,Q1和Q2的实际 输出带宽比是 2:1,与权重比相符。
DWRR调度避免了采用PQ调度时低优先级队列中的报文可能长时间得不到服务的缺点,也避免了各队列报文长度不等或变化较大时,WRR调度不能按配置比例分 配带宽资源的缺点。但是,DWRR调度也具有低延时需求业务(如语音)得不到及时调度的缺点。
WFQ(Weighted Fair Queuing)调度
加权公平队列WFQ(Weighted Fair Queuing)调度是按队列权重来分配每个流应占有出口的带宽。同时,为了使得带宽分配更加“公平”,WFQ 以 bit 为单位进行调度,类似于图 6的 bit-by-bit 调度模型
图6 WFQ调度
Bit-by-bit 调度模型可以完全按照权重分配带宽,防止长报文比短报文获得更多带宽,从 而减少大小报文共存时的时延抖动。但Bit-by-bit 调度模型只是理想化的模型,实际上,华为交换机实现的WFQ是按照一定的粒度,例如 256B、1KB,或其他粒度,具体按何种粒度,与单板类型相关。
WFQ的优点主要有以下几点:
不同的队列获得公平的调度机会,从总体上均衡各个流的延迟。
短报文和长报文获得公平的调度:如果不同队列间同时存在多个长报文和短报文等 待发送,让短报文优先获得调度,从而在总体上减少各个流的报文间的抖动。
从统计上看,权重越小,所分得的带宽越少。权重越大,所分得的带宽越多。