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