一 背景
有時(shí)候,需要關(guān)注下網(wǎng)絡(luò)的是否丟包,特別是高帶寬情況下測(cè)試系統(tǒng)的性能的時(shí)候, 這次我們?cè)跍y(cè)試很小的流量的情況下,用ifconfig命令查看發(fā)現(xiàn)丟包:
watch ifconfig eno2
[root@localhost ~]# ifconfig eno2
eno2: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
ether 78:ac:44:0f:16:00 txqueuelen 1000 (Ethernet)
RX packets 1445302589 bytes 255819232376 (238.2 GiB)
RX errors 0 dropped 43330140683 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
dropped 數(shù)據(jù)在一直增加.
二 分析
2.1 實(shí)際網(wǎng)卡速率
既然沒有錯(cuò)誤,那么看看網(wǎng)卡的支持的速率多大,是否可以滿足現(xiàn)有的要求:
[root@localhost ~]# ethtool eno2 | egrep 'Speed|Duplex'
Speed: 10000Mb/s
Duplex: Full
10Gbps大于測(cè)試的速率,這個(gè)原因排除.
2.2 ethtool 分析具體丟包原因
通過ethtool -S
來查看丟包原因:
[root@localhost ~]# ethtool -S eno2|grep drop
rx_dropped: 1996379212
tx_dropped: 0
port.rx_dropped: 0
port.tx_dropped_link_down: 0
[root@localhost ~]# ethtool -S eno2|grep error
rx_errors: 0
tx_errors: 0
rx_length_errors: 0
rx_crc_errors: 0
port.tx_errors: 0
port.rx_crc_errors: 0
port.rx_length_errors: 0
發(fā)現(xiàn)除了丟包數(shù)據(jù),并沒有明顯的錯(cuò)誤.
2.2.1 rx_missed_errors
此原因是ring-buffer不夠了,可能原因來的速率確實(shí)很大,超出了預(yù)期,如果是臨時(shí)的大流量,可以通過增加rx的ring-buffer大小來解決,這里面的ring-buffer大小是指存的幀的數(shù)量,而不是字節(jié)數(shù).
# ethtool -g eno2
Ring parameters for eno2:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 1024
RX Mini: 0
RX Jumbo: 0
TX: 512
2.2.2 overruns
這玩意增大,說明數(shù)據(jù)包還沒到ring buffer就被物理網(wǎng)卡丟棄了,可能原因是中斷不均衡造成的.
如果沒有做線程綁定cpu的設(shè)置,就要看下是否開啟了中斷均衡:
service irqbalance status
如果指定了處理網(wǎng)絡(luò)包的線程綁定了具體的CPU,則需要將系統(tǒng)自帶的中斷均衡程序關(guān)閉:
service irqbalance stop
注意,處理網(wǎng)絡(luò)包的線程綁定cpu后, 可以達(dá)到的目的是網(wǎng)絡(luò)包的中斷是這個(gè)線程處理,而且后續(xù)也是
這個(gè)線程再進(jìn)一步分析包,好處是緩存可以重用,不用因?yàn)榍袚Q不同線程導(dǎo)致緩存失效的問題.
特別是NUMA架構(gòu),要將網(wǎng)卡歸屬NUMA節(jié)點(diǎn)的CPU綁定給線程,查看辦法:
lscpu
...
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39
...
網(wǎng)卡歸屬的NUMA節(jié)點(diǎn)查看:
[root@localhost ~]# cat /sys/class/net/eno2/device/numa_node
0
我們就可以把NUMA節(jié)點(diǎn)0上的CPU綁定給線程,用于處理eno2網(wǎng)卡的數(shù)據(jù)包薄料。
如何把網(wǎng)卡的隊(duì)列的中斷處理綁定到特定的cpu上,雖然可以手工設(shè)置,但是比較麻煩玩郊,網(wǎng)上有個(gè)腳本:set_irq_affinity 伴嗡,通過這個(gè)腳本可以方便地設(shè)置:
set_irq_affinity 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38 eno2
即用0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38
這些cpu來處理eno2網(wǎng)卡的中斷婉支。
我們可以將eno2的網(wǎng)卡隊(duì)列改成了20帆卓,這樣剛好可以一一對(duì)應(yīng)稽穆,更改辦法:
ethtool -L eno2 combined 20
負(fù)載均衡相關(guān)設(shè)置:
ethtool -K eno2 rxhash on
ethtool -K eno2 ntuple on
for proto in tcp4 udp4 ah4 esp4 sctp4 tcp6 udp6 ah6 esp6 sctp6
do
ethtool -N eno2 rx-flow-hash ${proto} sd
done
為了讓一個(gè)流所屬的雙向包都均衡到同一個(gè)網(wǎng)卡隊(duì)列中冠王,需要設(shè)置對(duì)稱哈希算法的key,設(shè)置方法如下:
ethtool -X eno2 hkey 6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A equal 20
2.2.3 rx_drop
這里面直觀看是丟包數(shù)舌镶,其實(shí)不僅僅是丟包數(shù)柱彻,比較坑豪娜。
The RT and RHEL7 kernels contains code that updates the rx_dropped counter for other non-error conditions.
The softnet backlog full
Bad VLAN tags
Packets received with unknown or unregistered protocols
IPv6 frames when the server is configured only for ipv4
具體可以參考:
[https://access.redhat.com/solutions/657483](https://access.redhat.com/solutions/657483)
如果想看實(shí)際網(wǎng)卡上是否有丟包,可以通過ethtool -S eno2|grep error
,想看下重傳率绒疗,可以通過
netstat -s
查看:
奇怪的是侵歇,同樣的包回放,如果不處理吓蘑,只收包就不丟包惕虑,這樣上面的原因就說不過去了,繼續(xù)排查磨镶。
三 程序排查
3.1 首先是磁盤io排查
因?yàn)槌绦蛴写罅繉懳募僮骼D瑁钥纯词遣皇谴疟P的IO滿了造成的丟包。
iostat -x 1 10
磁盤IO并未達(dá)到瓶頸琳猫。
yum install iotop
iotop -oP
也未看到特別大的磁盤IO伟叛,排除這個(gè)問題。
3.2 CPU
線程是綁定cpu的方式脐嫂,而且整體來說占用很均衡统刮,說明不存在cpu不均衡導(dǎo)致中斷處理不過來造成的丟包問題。
top -Hp pid
查看關(guān)鍵線程的cpu占用情況账千,比較均衡侥蒙,無瓶頸。
3.3 內(nèi)存查看
yum install numactl
#查看內(nèi)存占用
numastat -m
沒發(fā)現(xiàn)什么異常匀奏,內(nèi)存占用很均衡鞭衩。
3.4 排查中斷
通過以下命令看下,軟中斷在各個(gè)cpu上是否均衡娃善,如果不均衡按照overrun的辦法均衡下论衍。
watch cat /proc/softirqs
四 其他
目前該排查的都排查了,包括驅(qū)動(dòng)程序聚磺,已經(jīng)按照安裝了最新的驅(qū)動(dòng)程序坯台,仍然存在丟包問題。
由于是采用netmap
庫抓包瘫寝,所以下一步要進(jìn)行源碼或驅(qū)動(dòng)排查蜒蕾。
如果不是網(wǎng)卡丟包,而是正常的網(wǎng)絡(luò)丟包矢沿,可以參考下安裝下dropwatch排查
#yum install dropwatch
#dropwatch -l kas
>start
具體可以參考下面第一個(gè)鏈接:
[https://vcpu.me/categories/](https://vcpu.me/categories/)
[https://blog.huoding.com/2020/04/27/814](https://blog.huoding.com/2020/04/27/814)
五 詩詞欣賞
《訪戴天山道士不遇》
李白
犬吠水聲中滥搭,桃花帶露濃酸纲。
樹深時(shí)見鹿捣鲸,溪午不聞鐘。
野竹分青靄闽坡,飛泉掛碧峰栽惶。
無人知所去愁溜,愁倚兩三松。