交换芯片Qos队列调度算法(SP/RR/WRR/DWRR)

  • Post author:
  • Post category:其他

交换芯片在Qos队列管理中一般支持SP,WRR,DWRR这些调度算法,下面分介绍这三种算法。

1)SP(Strict Priority,严格优先级

也称为PQ(Priority Queuing)调度,就是严格按照队列优先级的高低顺序进行调度。只有高优先级队列中的报文全部调度完毕后,低优先级队列才有调度机会。

 

2、RR(Round Robin,轮循)

RR调度采用轮询的方式,对多个队列进行调度。RR以环形的方式轮询多个队列。 如果轮询的队列不为空,则从该队列取走一个报文;如果该队列为空,则直接跳过该队列,调度器不等待。

 

3、WRR(Weighted Round Robin,加权轮循) 

基于报文数的加权,每个队列拥有的调度次数和该队列的权重成比例。

实现方法是:为每个队列设置一个报文计数器 Count,根据权重进行初始化;每次轮询到一个队列时,输出一个报文且队列的计数器减一,直到计数器减为0时停止该队列的调度;当所有队列的计数器都为0时,根据权重重新初始化,开始新一轮调度。

假设某端口有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调度有两个缺点:

1)WRR调度按照报文个数进行调度,因此每个队列没有固定的带宽,同等调度机 会下大尺寸报文获得的实际带宽要大于小尺寸报文获得的带宽。而用户一般关 心的是带宽。当每个队列的平均报文长度相等或已知时,通过配置WRR权重, 用户能够获得想要的带宽;但是,当队列的平均报文长度变化时,用户就不能 通过配置WRR权重获取想要的带宽。
2)低延时需求业务(如语音)得不到及时调度。

4、DRR

差分轮询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、DWRR(Deficit Weighted Round Robin,差分加权轮循)

基于报文字节数的加权,每个队列拥有的调度带宽和该队列的权重成比例。

实现方法是:为每个队列设置一个计数器Deficit,Deficit 初始化为Weight * MTU;每次轮询到一个队列时,输出一个报文且队列的计数器减去报文长度,直到计数器减为0时停止该队列的调度;当所有队列的计数器都为0时,根据Weight*MTU重新初始化每个队列计数器,开始新一轮调度。

如下图举例,假设某端口MTU=150Bytes,有2个队列Q1和Q2采用DWRR调度,Q1队列中有多个200Bytes的长报文,Q2队列中有多个100Bytes的端报文,Q1和Q2配置权重比为2:1。

经过第1~3轮DWRR调度,Q1队列被调出了3个200Bytes的报文,Q2 队列被调出了3个100Bytes 的报文;从长期的统计看,Q1和Q2的实际输出带宽比是2:1,与权重比相符。

假设某端口MTU=150Bytes,有 2 个队列Q1和Q2采用DRR调度,Q1 队列中有 多个 200Bytes 的长报文,Q2队列中有多个 100Bytes 的端报文,Q1和Q2配置权重 比为weight1:weight2=2:1。则DWRR调度过程如图 2-37。

  1. 第一轮调度 Deficit[1] =weight1* MTU=300,Deficit[2] = weight2* MTU=150Bytes,从 Q1 队 列取出 200Bytes 报文发送,从Q2队列取出 100Bytes 发送;发送后,Deficit[1] = 100,Deficit[2] =50。
  2. 第二轮调度
    从 Q1 队列取出 200Bytes 报文发送,从Q2队列取出 100Bytes 发送;发送后, Deficit[1] = -100,Deficit[2] =-50。
  3. 第三轮调度
    此时两个队列都为负,因此,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调度也具有低延时需求业务(如语音)得不到及时调度的缺点。

综上所述,优缺点对比分析: