萬兆網卡dropped嚴重


1.機器環境

系統:centos6.5

內核:4.19.5

網卡配置:萬兆網卡做bond0,單網卡啟用網卡多隊列RSS方式

兩種型號:都出現RX dropped嚴重的問題

Intel Corporation Ethernet 10G 2P X520 Adapter (rev 01)  

Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) 

2.問題現象

服務器流量很少的時候很難出現,一般都是在業務流量跑滿,單進程cpu跑滿的情況下,偶爾會出現dropped數值不斷增加。

3.解決方法

先給網卡更換個插槽、更換模塊、更換光纖,確定內存條都正常識別的情況下,如果都沒解決再往下看

通過top 1查看個別cpu軟中斷嚴重,cpu偏壓嚴重導致軟中斷不均,通過修改網卡多隊列模式解決,最優方式RFS,默認禁用。

/proc/sys/net/core/rps_sock_flow_entries

設置此文件至同時活躍連接數的最大預期值。對於中等服務器負載,推薦值為 32768 。所有輸入的值四舍五入至最接近的2的冪

/sys/class/net/device/queues/rx-queue/rps_flow_cnt

將 device 改為想要配置的網絡設備名稱(例如,eth0),將 rx-queue 改為想要配置的接收隊列名稱(例如,rx-0)。

將此文件的值設為 rps_sock_flow_entries 除以 N,其中 N 是設備中接收隊列的數量。例如,如果 rps_flow_entries 設為 32768,並且有 16 個配置接收隊列,那么

rps_flow_cnt 就應設為 2048。對於單一隊列的設備,rps_flow_cnt 的值和 rps_sock_flow_entries 的值是一樣的

ls /sys/class/net/eth0/queues/rx-*|grep queues|wc -l

8

rps_flow_cnt=32768/8=4096

echo 32768 >/proc/sys/net/core/rps_sock_flow_entries

for rxdir in /sys/class/net/eth0/queues/rx-*

do

    echo $rps_cpus >$rxdir/rps_cpus

    echo $rps_flow_cnt >$rxdir/rps_flow_cnt

done

echo 32768 >/proc/sys/net/core/rps_sock_flow_entries

4.參考腳本

rps_cpus='ffff,ffffffff'
rps_flow_cnt=4096
for ka in p4p1 p4p2
do
for rxdir in /sys/class/net/$ka/queues/rx-*
do
echo $rps_cpus >$rxdir/rps_cpus
echo $rps_flow_cnt >$rxdir/rps_flow_cnt
done
done
echo 131072 >/proc/sys/net/core/rps_sock_flow_entries

5.知識拓展

查看網卡是否支持多隊列

lscpi -vvv

找到Ethernet controller項,如果有MSI-X,Enable+ 並且Count>1,表示該網卡支持多隊列

配置RSS

intel官網可以找到網卡多隊列的腳本

執行方式

sh set_irq_affinity  p4p1

RPS/RFS

Receive Packet Steering/Receive Flow Streering,軟件方式實現CPU均衡,接收包中斷的優化
RPS: 網卡驅動對每一個數據庫包根據四元組(SIP,SPORT,DIP,DPORT)生成HASH值,通過HASH值將每個連接和CPU 綁定
RFS: 由於RPS只是單純的把數據包均衡到不同的CPU上,此時如果應用程序所在CPU和中斷處理的CPU不在同一個核,將會對CPU Cache影響很大,RFS的作用就是將應用程序和軟中斷處理分配到同一個CPU
配置步驟:

根據上述說明一個十六進制f表示四個CPU核,那么均衡到32核即ffffffff

RPS

rps_cpus='ffffffffff'

for rxdir in /sys/class/net/eth0/queues/rx-*

do

    echo $rps_cpus >$rxdir/rps_cpus

done

RFS

RFS擴展了RPS的性能以增加CPU緩存命中率,減少網絡延遲,默認是禁用的

/proc/sys/net/core/rps_sock_flow_entries
設置此文件至同時活躍連接數的最大預期值。對於中等服務器負載,推薦值為 32768 。所有輸入的值四舍五入至最接近的2的冪
/sys/class/net/device/queues/rx-queue/rps_flow_cnt
將 device 改為想要配置的網絡設備名稱(例如,eth0),將 rx-queue 改為想要配置的接收隊列名稱(例如,rx-0)。
將此文件的值設為 rps_sock_flow_entries 除以 N,其中 N 是設備中接收隊列的數量。例如,如果 rps_flow_entries 設為 32768,並且有 16 個配置接收隊列,那么 rps_flow_cnt 就應設為 2048。對於單一隊列的設備,rps_flow_cnt 的值和 rps_sock_flow_entries 的值是一樣的.

ls /sys/class/net/eth0/queues/rx-*|grep queues|wc -l

8

rps_flow_cnt=32768/8=4096

echo 32768 >/proc/sys/net/core/rps_sock_flow_entries

for rxdir in /sys/class/net/eth0/queues/rx-*

do

echo $rps_cpus >$rxdir/rps_cpus

echo $rps_flow_cnt >$rxdir/rps_flow_cnt

done

echo 32768 >/proc/sys/net/core/rps_sock_flow_entries


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM