三层交换机之端口丢包问题分析
博通交换芯片,工程现网报交换入端口丢包。
此时show counters <pbmp>查看指定端口包统计,RDBGC0和RDBGC2有包统计,RDBGC0~x包统计是从RDBGC0~x寄存器中读取的。
BCM.0> show c ge16 RUC.ge16 : 8,986,723,402 +247,394 626/s RDBGC0.ge16 : 458,068 +2 RDBGC2.ge16 : 1,602,654 +88 2/s ING_NIV_RFVT.ge16 : 8,992,946,921 +247,733 628/s R127.ge16 : 6,393,207,709 +239,477 584/s R255.ge16 : 293,909,171 +2,879 17/s R511.ge16 : 69,994,865 +1,456 6/s R1023.ge16 : 83,653,035 +1,847 8/s R1518.ge16 : 2,152,046,041 +2,029 13/s R2047.ge16 : 136,260 +45 RPKT.ge16 : 8,992,947,081 +247,733 628/s RUCA.ge16 : 8,986,587,142 +247,349 626/s RMCA.ge16 : 1,603,814 +88 2/s RBCA.ge16 : 4,619,865 +251 ROVR.ge16 : 136,260 +45 RPRM.ge16 : 8,986,587,142 +247,349 626/s RPOK.ge16 : 8,992,810,821 +247,688 628/s RBYT.ge16 : 3,355,369,191,852 +25,630,497 79,117/s T64.ge16 : 58,350,600 +1,120 T127.ge16 : 931,738,405 +14,357 48/s T255.ge16 : 324,775,053 +3,759 18/s T511.ge16 : 129,863,807 +2,768 10/s T1023.ge16 : 182,777,634 +2,768 12/s T1518.ge16 : 14,285,643,850 +343,825 862/s TMGV.ge16 : 733,899,970 +1,000 T2047.ge16 : 733,899,978 +1,000 TPOK.ge16 : 16,647,049,319 +369,597 950/s TPKT.ge16 : 16,647,049,327 +369,597 950/s TUCA.ge16 : 16,559,797,943 +368,102 950/s TMCA.ge16 : 4,678,987 +875 TBCA.ge16 : 82,572,389 +620 TVLN.ge16 : 16,647,049,319 +369,597 950/s TBYT.ge16 : 19,985,827,660,546 +445,383,464 1,115,598/s PERQ_PKT.ge16 : 10,496,740,131 +261,033 71/s PERQ_BYTE.ge16 : 12,391,027,325,988 +323,472,166 31,036/s
查找芯片手册,找到RDBGC0寄存器的描述,该寄存器统计的包类型由RDBGC0_SELECT寄存器值决定(其他RDBGCx类似)
找到RDBG0_SELECT寄存器的描述,可以看到该寄存器实际上是一个bitmap,每一位表示不同类型的包。
RDBGCx_SELECT的bitmap映射,参考如下定义
接下来,在BCM命令行下获取RDBGC0_SELECT寄存器值
BCM.0> g RDBGC0_SELECT RDBGC0_SELECT.ipipe0[1][0x3e002100]=0x400ad11: <BITMAP=0x400ad11>
使用排除法,分别置位获取到的RDBGC0_SELECT寄存器值中置位的每一位
BCM.0> s RDBGC0_SELECT 0x4000d11
BCM.0> g RDBGC0_SELECT
RDBGC0_SELECT.ipipe0[1][0x3e002100]=0x4000d11: <BITMAP=0x4000d11>
清除端口包统计,再读取端口包统计(需要注意的是,端口包统计一般是定时刷新的,而不是及时刷新的,因此,多次读取之间要间隔一定时间)
BCM.0> show c ge16 RUC.ge16 : 8,987,412,514 +324,780 168/s RDBGC2.ge16 : 1,602,897 +126 ING_NIV_RFVT.ge16 : 8,993,636,960 +325,258 168/s R127.ge16 : 6,393,875,436 +314,042 158/s R255.ge16 : 293,916,429 +3,896 7/s R511.ge16 : 69,998,999 +2,208 R1023.ge16 : 83,658,311 +2,646 3/s R1518.ge16 : 2,152,051,614 +2,406 1/s R2047.ge16 : 136,331 +60 RPKT.ge16 : 8,993,637,120 +325,258 168/s RUCA.ge16 : 8,987,276,183 +324,720 168/s RMCA.ge16 : 1,604,057 +126 RBCA.ge16 : 4,620,549 +352 ROVR.ge16 : 136,331 +60 RPRM.ge16 : 8,987,276,183 +324,720 168/s RPOK.ge16 : 8,993,500,789 +325,198 168/s RBYT.ge16 : 3,355,440,490,454 +33,006,703 19,805/s T64.ge16 : 58,354,402 +1,583 1/s T127.ge16 : 931,777,872 +18,888 24/s T255.ge16 : 324,783,220 +4,211 5/s T511.ge16 : 129,871,134 +3,907 2/s T1023.ge16 : 182,784,285 +2,589 3/s T1518.ge16 : 14,286,679,112 +490,089 1/s TMGV.ge16 : 733,905,887 +1,027 1/s T2047.ge16 : 733,905,895 +1,027 1/s TPOK.ge16 : 16,648,155,912 +522,294 37/s TPKT.ge16 : 16,648,155,920 +522,294 37/s TUCA.ge16 : 16,560,901,956 +521,342 37/s TMCA.ge16 : 4,679,119 +69 TBCA.ge16 : 82,574,837 +883 TVLN.ge16 : 16,648,155,912 +522,294 37/s TBYT.ge16 : 19,987,169,754,335 +632,563,687 8,781/s PERQ_PKT.ge16 : 10,497,536,696 +327,902 18/s PERQ_BYTE.ge16 : 12,392,014,968,180 +404,154,675 3,608/s
实测发现,当置位RDROP位和RFILDR位时,会统计到入端口丢包
其中,RDROP是指端口无法转发该SVLAN+DMAC的报文,原因可能有两种——1)端口未加入SVLAN所在转发域(用vlan show检查),2)另外一个端口学习了SVLAN+DMAC的转发表项,但是两个端口之间配置了端口隔离(用egress show检查),导致报文无法转发到另外一个端口;RFILDR是指入端口报文匹配FP规则丢弃。
同理,排查出端口丢包也可以借鉴上述思路,参考TDBGCx_SELECT的bitmap映射:
A盘
导致端口丢包的原因:
1、由于某些接口、链路、双工异常导致的CRC错误(FCS帧)、Alignment Error帧、帧长不在MTU范围的报文等常见错误此类报文交换机会予以丢弃——计入端口包统计,查看端口计数,是否有FCS或者冲突帧
2、QoS限速、rate-limit配置导致的数据包正常丢弃
3、端口BLOCK(STP/RLDP)导致的数据包正常丢弃——查看端口生成树状态
4、对端设备发送的速率过快导致本端交换机buffer不足,而又没有流控(PAUSE帧)导致的丢包——计入端口包统计,尝试两端打开端口流控
5、多端口向一个端口发送报文,超出这个端口的转发能力,导致HOL队头阻塞丢包——尝试调整端口速率和开启端口流控观察
6、由于环境因素(例如异常帧较多),导致MMU资源溢出