首页 > 技术文章 > 万兆网卡dropped严重

lussys 2020-05-14 15:05 原文

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

推荐阅读