队列指的是在缓存中对报文进行排序的逻辑。当流量的速率超过接口带宽或超过为该流量设置的带宽时,报文就以队列的形式暂存在缓存中。报文离开队列的时间、顺序,以及各个队列之间报文离开的相互关系由队列调度算法决定。
华为交换机设备的每个端口上都有 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调度
假设某端口有3个队列采用WRR调度,为每个队列配置一个权值,依次为50%、 25%、25%,详细的调度过程如下: 首先计数器初始化:Count[1]=2,Count[2]=1,Count[3]= 1。
− 第 1 个轮询: 从队列 1 取出报文 1 发送,Count[1]=1;从队列 2 取出报文 5 发送,Count[2]=0; 从队列 3 取出报文 8 发送,Count[3]=0。
− 第 2 个轮询: 从队列 1 取出报文 2 发送,Count[1]=0;由于Count[2]=0,Count[3]=0,队列 2 和队列 3 不参与此轮调度。 此时,Count[1]=0,Count[2]=0,Count[3]=0,将计数器重新初始化:Count[1]=2, Count[2]=1,Count[3]= 1。
− 第 3 个轮询:从队列 1 取出报文 3 发送,Count[1]=1;从队列 2 取出报文 6 发送,Count[2]=0; 从队列 3 取出报文 9 发送,Count[3]=0。
− 第 4 个轮询: 从队列 1 取出报文 4 发送,Count[1]=0;由于Count[2]=0,Count[3]=0,队列 2 和队列 3 不参与此轮调度。 此时,Count[1]=0,Count[2]=0,Count[3]=0,将计数器重新初始化:Count[1]=2, Count[2]=1,Count[3]= 1。
从统计上看,各队列中的报文流被调度的次数与该队列的权值成正比,权值越大被调度的次数相对越多。如果该端口为100Mbps,则可以保证最低权重的队列至少获得25Mbit/s带宽,避免了采用PQ调度时低优先级队列中的报文可能长时间得不到服务的缺点。WRR对于空的队列直接跳过,循环调度的周期变短,因此当某个队列流量小的时候,剩余带宽能够被其他队列按照比例占用。
WRR调度有两个缺点:
- WRR调度按照报文个数进行调度,因此每个队列没有固定的带宽,同等调度机 会下大尺寸报文获得的实际带宽要大于小尺寸报文获得的带宽。而用户一般关 心的是带宽。当每个队列的平均报文长度相等或已知时,通过配置WRR权重, 用户能够获得想要的带宽;但是,当队列的平均报文长度变化时,用户就不能 通过配置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的优点主要有以下几点:
- 不同的队列获得公平的调度机会,从总体上均衡各个流的延迟。
- 短报文和长报文获得公平的调度:如果不同队列间同时存在多个长报文和短报文等 待发送,让短报文优先获得调度,从而在总体上减少各个流的报文间的抖动。
- 从统计上看,权重越小,所分得的带宽越少。权重越大,所分得的带宽越多。