网络编程之网络丢包故障如何定位?如何解决?( 三 )


查看:
通过查看/proc/net/softnet_stat可以确定是否发生了netdev backlog队列溢出:

网络编程之网络丢包故障如何定位?如何解决?

文章插图
 
其中:每一行代表每个CPU核的状态统计,从CPU0依次往下;每一列代表一个CPU核的各项统计:第一列代表中断处理程序收到的包总数;第二列即代表由于netdev_max_backlog队列溢出而被丢弃的包总数 。从上面的输出可以看出,这台服务器统计中,并没有因为netdev_max_backlog导致的丢包 。
解决方案:
netdev_max_backlog的默认值是1000,在高速链路上,可能会出现上述第二统计不为0的情况,可以通过修改内核参数
net.core.netdev_max_backlog来解决:
$ sysctl -w net.core.netdev_max_backlog=2000单核负载高导致丢包
单核CPU软中断占有高, 导致应用没有机会收发或者收包比较慢,即使调整netdev_max_backlog队列大小仍然会一段时间后丢包,处理速度跟不上网卡接收的速度;
查看:mpstat -P ALL 1
网络编程之网络丢包故障如何定位?如何解决?

文章插图
 
单核软中断占有100%,导致应用没有机会收发或者收包比较慢而丢包;
解决方案:
1.调整网卡RSS队列配置:
查看:ethtool -x ethx;
调整:ethtool -X ethx xxxx;
2.看一下网卡中断配置是否均衡 cat /proc/interrupts
调整:
1) irqbalance 调整;# 查看当前运行情况service irqbalance status# 终止服务service irqbalance stop2) 中断绑CPU核 echo mask > /proc/irq/xxx/smp_affinity3.根据CPU和网卡队列个数调整网卡多队列和RPS配置
-CPU大于网卡队列个数:
查看网卡队列 ethtool -x ethx;
协议栈开启RPS并设置RPS;
echo $mask(CPU配置)> /sys/class/net/$eth/queues/rx-$i/rps_cpusecho 4096(网卡buff)> /sys/class/net/$eth/queues/rx-$i/rps_flow_cnt2)CPU小于网卡队列个数,绑中断就可以,可以试着关闭RPS看一下效果:echo 0 > /sys/class/net/<dev>/queues/rx-<n>/rps_cpus4.numa CPU调整,对齐网卡位置,可以提高内核处理速度,从而给更多CPU给应用收包,减缓丢包概率;
查看网卡numa位置:
ethtool -i eth1|grep bus-infolspci -s bus-info -vv|grep node上面中断和RPS设置里面mask需要重新按numa CPU分配重新设置;
5.可以试着开启中断聚合(看网卡是否支持)
查看 :
ethtool -c ethxCoalesce parameters for eth1:Adaptive RX: onTX: onstats-block-usecs: 0sample-interval: 0pkt-rate-low: 0pkt-rate-high: 0rx-usecs: 25rx-frames: 0rx-usecs-irq: 0rx-frames-irq: 256tx-usecs: 25tx-frames: 0tx-usecs-irq: 0tx-frames-irq: 256rx-usecs-low: 0rx-frame-low: 0tx-usecs-low: 0tx-frame-low: 0rx-usecs-high: 0rx-frame-high: 0tx-usecs-high: 0tx-frame-high: 0调整:
ethtool -C ethx adaptive-rx on简单总结一下网卡驱动丢包处理:
网络编程之网络丢包故障如何定位?如何解决?

文章插图
 
内核协议栈丢包以太网链路层丢包neighbor系统arp丢包
arp_ignore配置丢包
arp_ignore参数的作用是控制系统在收到外部的arp请求时,是否要返回arp响应 。arp_ignore参数常用的取值主要有0,1,2,3~8较少用到;
查看:sysctl -a|grep arp_ignore
网络编程之网络丢包故障如何定位?如何解决?

文章插图
 
解决方案:根据实际场景设置对应值;
0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上 。
1:只响应目的IP地址为接收网卡上的本地地址的arp请求 。
2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段 。
3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包 。
网络编程之网络丢包故障如何定位?如何解决?

文章插图
 

网络编程之网络丢包故障如何定位?如何解决?

文章插图
 
arp_filter配置丢包
在多接口系统里面(比如腾讯云的弹性网卡场景),这些接口都可以回应arp请求,导致对端有可能学到不同的mac地址,后续报文发送可能由于mac地址和接收报文接口mac地址不一样而导致丢包,arp_filter主要是用来适配这种场景;
查看:
sysctl -a | grep arp_filter


推荐阅读