三层交换机之BCM56312芯片HOL拥塞丢包问题总结
用户报障组播花屏,查看交换UNI端口包统计,存在HOLD出口拥塞丢包。
20:22:36 BCM.0> show c c ge0 20:22:36 RUC.ge0 : 1,680,808,317 +82,097,712 886/s 20:22:36 RDBGC1.ge0 : 76,054 +5,340 20:22:36 HOLD.ge0 : 3,104,596 +145,569 20:22:36 GR64.ge0 : 355,912 +20,309 20:22:36 GR127.ge0 : 1,392,054,832 +70,593,389 718/s 20:22:36 GR255.ge0 : 79,887,985 +3,674,350 75/s 20:22:36 GR511.ge0 : 25,675,917 +1,373,198 3/s 20:22:37 GR1023.ge0 : 29,187,985 +1,164,996 63/s 20:22:37 GR1518.ge0 : 125,870,239 +4,247,750 28/s 20:22:37 GRMGV.ge0 : 27,098,913 +1,007,950 20:22:37 GR2047.ge0 : 28,017,599 +1,038,231 20:22:37 GRPKT.ge0 : 1,681,050,469 +82,112,223 886/s 20:22:37 GRBYT.ge0 : 363,826,467,122 +14,694,808,204 160,973/s 20:22:37 GRMCA.ge0 : 76,054 +5,340 20:22:37 GRBCA.ge0 : 166,098 +9,171 20:22:37 GROVR.ge0 : 918,686 +30,281 20:22:37 GRUC.ge0 : 1,679,889,631 +82,067,431 886/s 20:22:37 GRPOK.ge0 : 1,680,131,783 +82,081,942 886/s 20:22:37 GT64.ge0 : 1,814,746 +57,177 20:22:37 GT127.ge0 : 871,365,873 +35,674,422 379/s 20:22:37 GT255.ge0 : 104,240,011 +4,311,103 87/s 20:22:37 GT511.ge0 : 113,397,965 +3,310,902 302/s 20:22:37 GT1023.ge0 : 105,200,522 +3,239,467 12/s 20:22:37 GT1518.ge0 : 3,889,302,748 +94,718,866 3,026/s 20:22:37 GTMGV.ge0 : 461,049,277 +28,301,852 2/s 20:22:38 GT2047.ge0 : 565,358,483 +35,044,878 2/s 20:22:38 GTPKT.ge0 : 5,650,681,118 +176,357,585 3,785/s 20:22:38 GTMCA.ge0 : 2,894,323,395 +45,425,063 2,034/s 20:22:38 GTBCA.ge0 : 302,719,287 +3,911,733 49/s 20:22:38 GTOVR.ge0 : 104,309,206 +6,743,026 20:22:38 GTBYT.ge0 : 6,472,086,763,949 +193,005,388,859 4,268,102/s 20:22:38 GTUC.ge0 : 2,349,329,230 +120,277,763 1,702/s 20:22:38 GTPOK.ge0 : 5,546,371,912 +169,611,847 3,785/s
查看HOLD寄存器,每个端口都有一个独立的HOLD包统计寄存器,统计出口HOL拥塞丢包计数。
寄存器手册中,还有几个HOL丢包统计相关的寄存器HOLD_COS_PORT_SELECT和HOLD_COS0~7,两者相配合我们就可以精准地定位HOL拥塞丢包发生在指定端口的哪个出口队列。
举例说明
BCM.0> getreg HOLD_COS_PORT_SELECT HOLD_COS_PORT_SELECT.ipipe0[0xe780118]=0: <PORT_NUM=0> BCM.0> phy info Phy mapping dump: port id0 id1 addr iaddr name timeout ge0( 0) 143 bd84 80 80 1000X/100FX 250000 ge1( 1) 143 bd84 81 81 1000X/100FX 250000 ge2( 2) 143 bd84 82 82 1000X/100FX 250000 ge3( 3) 143 bd84 83 83 1000X/100FX 250000 ge4( 4) 143 bd84 84 84 1000X/100FX 250000 ge5( 5) 143 bd84 85 85 1000X/100FX 250000 ge6( 6) 143 bd84 86 86 1000X/100FX 250000 ge7( 7) 143 bd84 87 87 1000X/100FX 250000 xe0( 24) 143 bd91 d8 d8 XGXS5 250000 BCM.0> BCM.0> getreg HOLD.ge0 HOLD.ge0[0xe700014]=0x160d: <COUNT=0x160d> BCM.0> BCM.0> BCM.0> BCM.0> getreg HOLD_COS0 HOLD_COS0.ipipe0[0xe780015]=0x160d: <COUNT=0x160d> BCM.0> getreg HOLD_COS1 HOLD_COS1.ipipe0[0xe780016]=0: <COUNT=0> BCM.0> getreg HOLD_COS2 HOLD_COS2.ipipe0[0xe780017]=0: <COUNT=0> BCM.0> getreg HOLD_COS3 HOLD_COS3.ipipe0[0xe780018]=0: <COUNT=0> BCM.0> getreg HOLD_COS4 HOLD_COS4.ipipe0[0xe780019]=0: <COUNT=0> BCM.0> getreg HOLD_COS5 HOLD_COS5.ipipe0[0xe78001a]=0: <COUNT=0> BCM.0> getreg HOLD_COS6 HOLD_COS6.ipipe0[0xe78001b]=0: <COUNT=0> BCM.0> getreg HOLD_COS7 HOLD_COS7.ipipe0[0xe78001c]=0: <COUNT=0>
此外,HOLCOSSTATUS和HOL_STAT_BMAP寄存器可以查看指定端口指定COS队列的HOL状态,但是这个是动态刷新的。
前面定位指定端口的指定队列的HOLD丢包,那么怎么解决呢?
以长江水为例,大部分时间段是相对匀速地从上游流向下游(线速转发),但是在洪水暴发季节(下行报文突发),洪水会漫过江堤(每秒可通过多少立方水类似于队列深度)。为了防止洪水漫过江堤造成危害,采取了两方面的措施,一个是三峡蓄水(PAUSE流控帧和反压),即上游降低流速;另外是设置泄洪区或者加高江堤(提高队列深度)。
针对前面的HOL拥塞丢包场景,我们采取调整队列深度,缓解拥塞丢包的办法。这就引入了HOLCOSPKTSETLIMIT寄存器,它基于指定端口和指定COS队列进行配置,其中PKTSETLIMIT设置COS队列深度,即占用MMU资源超过多少个cell时,触发芯片将该队列置为HOL状态;RESETLIMITSEL设置当占用MMU资源数降低到多少个cell时,触发芯片将该队列解除HOL状态。
关于IBP反压,PAUSE流控和HOL拥塞可以参考《BCM56312芯片MMU介绍》。