【案例分享】私有云平臺服務(wù)器網(wǎng)卡overrun丟包故障處理

故障描述
客戶反饋在DELL R730服務(wù)器中出現(xiàn)了大量丟包的現(xiàn)象,更換服務(wù)器與交換機(jī)端的光模塊之后,現(xiàn)象依舊存在。
故障分析
首先使用命令ethtool -S [物理網(wǎng)卡名] | grep crc 檢查傳輸介質(zhì)狀態(tài)。

再使用ethtool -S [物理網(wǎng)卡名] | grep err 檢查細(xì)節(jié)。

可以看見物理層面上的crc校驗(yàn)故障計(jì)數(shù)不存在,可以排除丟包問題由傳輸線纜、服務(wù)器交換機(jī)模塊或者接口導(dǎo)致。
使用命令ifconfig [網(wǎng)卡名] 查看數(shù)據(jù)包收發(fā)狀態(tài)總覽

可以看到收包的overruns計(jì)數(shù)很高,該計(jì)數(shù)說明報(bào)文在緩沖區(qū)已滿但是內(nèi)核沒有及時(shí)處理,導(dǎo)致網(wǎng)卡直接丟棄報(bào)文。使用cat /proc/net/dev | column -t命令檢查詳細(xì)的包數(shù)據(jù)。

檢查到fifo字段的計(jì)數(shù)不停增長。
當(dāng)系統(tǒng)內(nèi)核處理速度跟不上網(wǎng)卡收包速度時(shí),驅(qū)動來不及分配緩沖區(qū),NIC 接收到的數(shù)據(jù)包無法及時(shí)寫到sk_buffer,就會產(chǎn)生堆積,當(dāng) NIC 內(nèi)部緩沖區(qū)寫滿后,就會丟棄部分?jǐn)?shù)據(jù),引起丟包。這部分丟包為 rx fifo errors,在/proc/net/dev 中體現(xiàn)為 fifo 字段增長,在 ifconfig 中體現(xiàn)為 overruns 指標(biāo)增長。
該情況可能是cpu核心任務(wù)分配不均導(dǎo)致,客戶方面運(yùn)行了腳本檢查cpu的狀態(tài)與負(fù)載。

可以看到大部分核心負(fù)載很低,也沒有產(chǎn)生cpu硬件故障的報(bào)錯(cuò)。
客戶使用的linux Kernel版本為3.x,在4.11版本的kernel中會修正該問題。

由于服務(wù)器承載業(yè)務(wù)比較重要,暫時(shí)無法更新宿主系統(tǒng)的kernel,只能想其他辦法暫時(shí)緩解問題。
故障處理
經(jīng)過討論決定增加網(wǎng)卡的緩沖區(qū)來緩解這一問題。
使用命令ethtool -g [物理網(wǎng)卡名] 檢查網(wǎng)卡當(dāng)前緩沖區(qū)以及最高支持的緩沖區(qū)大小。

使用命令ethtool -G [網(wǎng)卡名] rx [緩沖區(qū)大小],本次事例將數(shù)值調(diào)成了網(wǎng)卡支持的最大值4078。在后續(xù)的觀察中,客戶反饋丟包現(xiàn)象大幅度減少,在虛擬機(jī)業(yè)務(wù)中感知不明顯,需要完全根除只能更新宿主系統(tǒng)kernel的版本。
經(jīng)驗(yàn)總結(jié)
★★★服務(wù)器丟包故障排除的一些心得如下:
1.?觀察ifconfig下的計(jì)數(shù)
2. RX 收包方向:
Dropped:可能網(wǎng)絡(luò)中存在環(huán)路導(dǎo)致設(shè)備收到超過最大處理量的數(shù)據(jù)
Overruns:可能由于應(yīng)用層/系統(tǒng)核心/驅(qū)動導(dǎo)致的緩沖區(qū)數(shù)據(jù)處理不及時(shí)
如果dropped和overruns沒有計(jì)數(shù),則使用ethtool -S [網(wǎng)卡名] 檢測crc校驗(yàn)計(jì)數(shù)情況。服務(wù)器網(wǎng)卡故障是極少出現(xiàn)的問題,當(dāng)網(wǎng)卡出現(xiàn)損壞之后服務(wù)器BMC會出現(xiàn)提示網(wǎng)卡異?;蚍?wù)器因?yàn)镮ERR故障導(dǎo)致宕機(jī)。
3. TX 傳包方向:
Overruns:TX方向的overruns有可能是負(fù)載均衡設(shè)備(或者Nginx)發(fā)生vip漂移導(dǎo)致,需要根據(jù)設(shè)備所處網(wǎng)絡(luò)結(jié)構(gòu)排障。