現象
ifconfig 發現RX dropped 數字比較大,RX errors 和RX overruns 都是0.
登錄檢查時sar -n DEV 1 5 流量不高,ping延時也不大,messages沒有異常信息,uptime很大,猜測是累計的dropped counter。對系統性能無影響。
Netstat -s 統計網絡層 TCP UDP 未發現異常。
ethtool -S eth0 統計網卡信息,未見異常。
網上找到同樣case,說是內核統計dropped測方式發生了變化,對業務應用無影響。
以下信息根據網上資料整理所得,未驗證。
判斷方法:
運行tcpdump后, ifconfig中的dropped 不再增加。
ifconfig 部分字段的理解:
RX errors: 表示總的收包的錯誤數量,這包括 too-long-frames 錯誤,Ring Buffer 溢出錯誤,crc 校驗錯誤,幀同步錯誤,fifo overruns 以及 missed pkg 等等。
RX dropped: 表示數據包已經進入了 Ring Buffer,但是由於內存不夠,上層協議不支持等系統原因,導致在拷貝到內存的過程中被丟棄,netstat -s可以看到更詳細的原因。
RX overruns: 表示了 fifo 的 overruns,這是由於 Ring Buffer(aka Driver Queue) 傳輸的 IO 大於 kernel 能夠處理的 IO 導致的,而 Ring Buffer 則是指在發起 IRQ 請求之前的那塊 buffer。
很明顯,overruns 的增大意味着數據包沒到 Ring Buffer 就被網卡物理層給丟棄了,而 CPU 無法即使的處理中斷是造成 Ring Buffer 滿的原因之一,
上面那台有問題的機器就是因為 interruprs 分布的不均勻(都壓在 core0),沒有做 affinity 而造成的丟包。
可以嘗試設置驅動程序啟用多個隊列,分別在不同的CPU上產生中斷,增加報文的並行處理速度。增加網絡層的接收緩沖區memory大小,減少應用的數目,降低CPU的壓力,使應用層能夠盡快處理收到的數據包。
RX frame: 表示 misaligned 的 frames。
對於 TX 的來說,出現上述 counter 增大的原因主要包括 aborted transmission, errors due to carrirer, fifo error, heartbeat erros 以及 windown error,而 collisions 則表示由於 CSMA/CD 造成的傳輸中斷。
ifconfig 下面的一些字段(errors, dropped, overruns)
查看有無丟包:
for i in `seq 1 10`; do ifconfig eth0 | grep RX | grep overruns; sleep 1; done
netstat -i | column -t
轉自https://blog.csdn.net/sinat_38723234/article/details/103455999
