本文介绍了交换芯片中两种常见了丢弃算法
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时的丢弃率
平均队列长度是给予每个芯片的每个端口的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地址递增的连续报文
步骤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