电竞比分网-中国电竞赛事及体育赛事平台

分享

Linux 下網(wǎng)絡(luò)丟包問題處理

 yi321yi 2020-05-05

最近業(yè)務(wù)上老有問題,查看發(fā)現(xiàn)overruns值不斷增加,學(xué)習(xí)了一下相關(guān)的知識。

發(fā)現(xiàn)數(shù)值也在不停的增加。G 了一下,發(fā)現(xiàn)這些 errors, dropped, overruns 表示的含義還不大一樣。

eth2 Link encap:Ethernet HWaddr 00:8C:FA:F1:DA:78

inet addr:10.249.2.112 Bcast:10.249.2.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:26191508237 errors:0 dropped:0 overruns:45732243 frame:0

TX packets:20141298524 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:4684832167216 (4.2 TiB) TX bytes:4670328443919 (4.2 TiB)

Memory:c7200000-c7280000

RX errors: 表示總的收包的錯(cuò)誤數(shù)量,這包括 too-long-frames 錯(cuò)誤,Ring Buffer 溢出錯(cuò)誤,crc 校驗(yàn)錯(cuò)誤,幀同步錯(cuò)誤,fifo overruns 以及 missed pkg 等等。

RX dropped: 表示數(shù)據(jù)包已經(jīng)進(jìn)入了 Ring Buffer,但是由于內(nèi)存不夠等系統(tǒng)原因,導(dǎo)致在拷貝到內(nèi)存的過程中被丟棄。

RX overruns: 表示了 fifo 的 overruns,這是由于 Ring Buffer(aka Driver Queue) 傳輸?shù)?IO 大于 kernel 能夠處理的 IO 導(dǎo)致的,而 Ring Buffer 則是指在發(fā)起 IRQ 請求之前的那塊 buffer。很明顯,overruns 的增大意味著數(shù)據(jù)包沒到 Ring Buffer 就被網(wǎng)卡物理層給丟棄了,而 CPU 無法即使的處理中斷是造成 Ring Buffer 滿的原因之一,上面那臺有問題的機(jī)器就是因?yàn)?interruprs 分布的不均勻(都壓在 core0),沒有做 affinity 而造成的丟包。

RX frame: 表示 misaligned 的 frames。

1、先查看硬件情況

一臺機(jī)器經(jīng)常收到丟包的報(bào)警,先看看最底層的有沒有問題:

ethtool eth2 | egrep 'Speed|Duplex'

Speed: 1000Mb/s

Duplex: Full

ethtool -S eth2 | grep crc

rx_crc_errors: 0

Speed, Duplex, CRC 之類的都沒問題,基本可以排除物理層面的干擾。

2、通過 ifconfig 可以看到 overruns 字段在不停的增大

for i in seq 1 100; do ifconfig eth2 | grep RX | grep overruns; sleep 1; done

這里一直增加

RX packets:26191785302 errors:0 dropped:0 overruns:45732243 frame:0

3、查看buffer大小

找了一些國外的文章,可以通過ethtool來修改網(wǎng)卡的buffer size ,首先要網(wǎng)卡支持,我的服務(wù)器是是INTEL 的1000M網(wǎng)卡,我們看看ethtool說明。

-g –show-ringQueries the specified ethernet device for rx/tx ring parameter information.
-G –set-ringChanges the rx/tx ring parameters of the specified ethernet device.

查看當(dāng)前網(wǎng)卡的buffer size情況ethtool -g eth0

Ring parameters for eth0:

Pre-set maximums:

RX: 4096RX Mini: 0

RX Jumbo: 0

TX: 4096

Current hardware settings:

RX: 256

RX Mini: 0

RX Jumbo: 0

TX: 256

4、修改buffer size大小

ethtool -G eth2 rx 2048

ethtool -G eth2 tx 2048

查看丟包

[root@appserver1 network-scripts]# cat /proc/net/dev | column -t

Inter-| Receive | Transmit

face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed

lo:1697064305645 4937104295 0 0 0 0 0 0 1697064305645 4937104295 0 0 0 0 0 0

eth0:72829268758 343814516 0 21338 0 0 0 9764241 74743576507 418943369 0 0 0 0 0 0

eth1:5826509023 48719872 0 0 0 0 0 11358883 127451707 1107964 0 0 0 0 0 0

eth2:4684766978372 26191366713 0 0 45732243 0 0 278436828 4670300836866 20141168183 0 0 0 0 0 0

eth3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

bond0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

[root@appserver1 network-scripts]# netstat -i | column -t

Kernel Interface table

Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg

eth2 1500 0 26191244868 0 0 45732243 20141056331 0 0 0 BMRU

lo 16436 0 4937053994 0 0 0 4937053994 0 0 0 LRU

問題:接受隊(duì)列溢出產(chǎn)生錯(cuò)誤,當(dāng)?shù)诌_(dá)的包多于內(nèi)核可以處理的包時(shí),計(jì)算機(jī)會產(chǎn)生漫溢(overruns)。輸入隊(duì)列達(dá)到其上限(max_backlog)時(shí),多抵達(dá)的那些包會全部被丟棄掉。


@讀者 achlice 補(bǔ)充:

補(bǔ)充一下, 對于overrun的包,修改了ring buffer之后,重啟主機(jī)后會失效,1,需要將配置添加到網(wǎng)卡配置文件例如 rhel系列是在/etc/sysconfig/network-scripts/ifcfg-* , 例如網(wǎng)卡是enp3, 在 ifcfg-enp3 配置文件添加 'ETHTOOL_OPTS='-G ${DEVICE} rx 4096; -A ${DEVICE} autoneg on' 2,如果網(wǎng)卡配置ETHTOOL_OPTS 參數(shù)不生效,請確保initscripts 這個(gè)軟件包是最新版本.

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多