本文介绍了交换芯片中两种常见了丢弃算法

1 名词释义

TD :Tail Drop尾部丢弃
    WRED: Weighted Random Early Detection,加权随机早期丢弃
    在交换芯片中,Buffer属于稀缺资源,受限于集成电路的物理性质,Buffer不能做到很大,通常只有10M左右。在报文的接收、处理、转发过程中,都会占用Buffer资源,各个端口队对的Buffer资源是抢占关系,通常来说,交换芯片提供了寄存器用于配置各个端口对Buffer占用的上限,以防止某个端口占用太多的Buffer资源以至于影响到其它端口的正常转发。

2 TD模型

TD尾部丢弃策略是指当队列已经满了的时候,以后再到达的所有报文(如果能够继续排队,这些分组都将排在队列的尾部)将都被丢弃的策略。

3 WRED模型

WRED是一个主动的队列管理机制,目的是提高全局的网络性能。

    队列管理是一种管理芯片中队列长度的机制,当需要的时候,该机制会丢弃报文。类似的管理机制还有HOL(Header of Line)。WRED与HOL的不同点是,WRED在buffer空间耗尽之前,提前丢弃报文。(It aims to preemptively drop packet before buffer space is exhausted)。通过提前丢弃报文,整体的网络性能就会更优。

    WRED通过追踪每条队列(queue)的平均长度统计值来实现。给予统计值,出口队列管理器给予为该队列定义的丢弃模板,概率性的丢弃报文。丢弃模板(drop profile)定义了一个队列在平均长度情况下的丢弃概率

    WRED战队出口的队列单独提供了积极的队列管理。RED只能针对端口提供一个统一的丢弃模板,不能区分队列和颜色,而WRED可以为不同的颜色和不同的队列使用不同的丢弃模板。

    WRED丢弃了一个类似于发段函数的 丢弃策略。每个丢弃模板包含一下参数:丢弃开始点(arop start point)、丢弃结束点(arop end point)、和最大丢弃率(max drop rate)。     如图所示,当平均队列长度增长到DropStartPoint以上时,开始丢包;当队列长度大道DropEndPoint时,所有发往这个队列的报文都会被丢弃。在DropEndPoint和DropStartPoint之间的斜率是MaxDropRate。MaxDropRate当平均队列长度达到DropEndPoint时的丢弃率

交换芯片vlan_交换芯片

平均队列长度是给予每个芯片的每个端口的Cos queue统计的,而不是每种报文的颜色,也就是说丢弃开始点(arop start point)和丢弃结束点(arop end point)都是之单个队列的长度值,而不是单个队列中的某个颜色的长度值。每个平均队列长度是给予队列独立追踪的,但是丢弃概率(drop probablitity)是叠加 的,也就是说,如果8个cos队列中的任何一个丢弃模板预示这个报文要丢弃,报文将会丢弃。
    在BCM56620中,芯片每4微妙计算一次队列长度,而不是每次收到报文以后,这样做的目的是通过减少计算时间提高了性能
    在BCM56620中,如果报文ECN位(Explicit Congestion notificatiob)使能了,芯片就会标记报文而不会丢弃报文。如果ECN的2-bit位的值是0B11,WRED就不会应用到这个报文中

3 TD的测试方法

3.1 连续Mac地址发测试

测试原理,根据尾部丢弃的特点,当队列满时,新到达的报文将会被丢弃。如果,将端口的出口pir(峰值带宽速率)设置为0,即不让报文从端口发出去,向队列中注入报文mac地址递增的报文,队列长度逐渐增加,当达到队列总长时,后续的报文将会被丢弃。停止发送报文,开始抓取报文,之后设置pir为1000,,观察抓到的报文mac地址是否连续。按照尾丢弃的特点,Mac地址是连续的。
    将出口的峰值带宽设置为0来测试,是非正常的测试,实际并不会这样做。
    步骤1:配置前的qos准备,将所有报文映射城同一内部优先级和同一种丢弃优先级,这样报文就能走同一个队列,便于查看。

vlan 1-20;887;890-920 
!         
mls qos map cos-intp  5 5 5 5 5 5 5 5 
mls qos map cos-dp  1 1 1 1 1 1 1 1 
mls qos queue statistics enable
!         
Interface Ethernet1/0/1
 switchport mode trunk
 switchport trunk native vlan 2

Interface Ethernet1/0/7
 switchport mode trunk
 switchport trunk native vlan 887
!

步骤:2:设置端口的丢弃策略为尾部丢弃

Interface Ethernet1/0/7
mls qos queue drop-algorithm tail
通过sdk提供的命令,查看尾部丢弃参数:
CTC_CLI(ctc-sdk)# show qos drop port 0x106 queue-id 5
Queue drop information
----------------
Drop Mode                     : WTD
WTD and WRED coexist          : 0
DropThrd                      : 496     496     496     496 
使用sdk提供的目录,查看队列长度:
QueueID              Depth(unit:288B)
---------------------------------------------
All Queue depth is zero!!!
---------------------------------------------

队列的每一个单位表示1个cell,一个cell代表最多288字节的报文

步骤:3:提供SDK提供的目录,将端口pir设置为0,即不让报文从队列出去,让队列长度增加

qos shape port 0x106 pir 0

步骤:4:打入mac地址递增的连续报文

交换芯片vlan_交换芯片_02


    步骤5:查看当前队列缓存数量

CTC_CLI(ctc-dkits)# show monitor queue-depth 
QueueID              Depth(unit:288B)
---------------------------------------------
53                   496       
---------------------------------------------

步骤6:出端口开启抓取报文
    步骤7:设置pir为1000,让报文发送出去,并开始抓取报文
    步骤8:查看队列长度

CTC_CLI(ctc-dkits)# show monitor queue-depth 
QueueID              Depth(unit:288B)
---------------------------------------------
All Queue depth is zero!!!
---------------------------------------------

步骤9:查看收包信息
    第一个包的mac为00:00:88:00:00:02,最后一个包的mac为00:00:88:00:01:F1

4 WRED的测试方法

4.1 连续Mac地址发测试

WRED的测试方法于WTD类似,配置丢弃算法时,选择WRED丢弃方式
    步骤1:与尾部丢弃的配置类似
    步骤2:设置端口的丢弃策略为尾部丢弃

Interface Ethernet1/0/7
 mls qos queue drop-algorithm wred
 mls qos queue 6 wred dp 1 drop-startpoint 10 drop-endpoint 1000 max-drop-rate 15
 通过sdk提供的命令,查看尾部丢弃参数:
CTC_CLI(ctc-sdk)#  show qos drop port 0x106 queue-id 5
Queue drop information

Drop Mode                     : WRED
WTD and WRED coexist          : 0
MaxThrd                       : 1000    1000    1000    64      
MinThrd                       : 8       8       8       0       
DropProb                      : 15      15      15      10

步骤:3:提供SDK提供的目录,将端口pir设置为0,即不让报文从队列出去,让队列长度增加
    步骤:4:打入mac地址递增的连续报文
    步骤5:查看当前队列缓存数量

CTC_CLI(ctc-dkits)# show monitor queue-depth 
QueueID              Depth(unit:288B)
---------------------------------------------
53                   1030      
---------------------------------------------

步骤6:出端口开启抓取报文
    步骤7:设置pir为1000,让报文发送出去,并开始抓取报文
    步骤8:查看队列长度

CTC_CLI(ctc-dkits)# show monitor queue-depth 
QueueID              Depth(unit:288B)
---------------------------------------------
All Queue depth is zero!!!
---------------------------------------------

步骤9:查看收包信息
    第一个包的mac为00:00:88:00:00:02,最后一个包的mac为00:00:88:00:04:4E