一、故障描述
运营商客户反馈在DELL R730服务器中出现大量丢包,更换服务器与交换机端的光模块之后丢包现象依旧存在。
二、故障分析
首先使用命令ethtool -S [物理网卡名] | grep crc 检查传输介质状态。
再使用ethtool -S [物理网卡名] | grep err 检查细节。
可以看见物理层面上的crc校验故障计数不存在,可以排除丢包问题由传输线缆、服务器交换机模块或者接口导致。
使用命令ifconfig [网卡名] 查看数据包收发状态总览。
可以看到收包的overruns计数很高。该计数说明报文在缓冲区已满但是内核没有及时处理,导致网卡直接丢弃报文。
使用cat /proc/net/dev | column -t命令检查详细的包数据。
检查到fifo字段的计数不停增长。
当系统内核处理速度跟不上网卡收包速度时,驱动来不及分配缓冲区,NIC 接收到的数据包无法及时写到sk_buffer,就会产生堆积,当 NIC 内部缓冲区写满后,就会丢弃部分数据,引起丢包。这部分丢包为 rx fifo errors,在/proc/net/dev 中体现为 fifo 字段增长,在 ifconfig 中体现为 overruns 指标增长。
由于该情况可能是cpu核心任务分配不均导致,客户方面运行了脚本检查cpu的状态与负载。
可以看到大部分核心负载很低,也没有产生cpu硬件故障导致的报错。
客户使用的linux Kernel版本为3.x,在4.11版本的kernel中会修正该问题。
由于服务器承载业务比较重要,暂时无法更新宿主系统的kernel,只能想其他办法暂时缓解问题。
三、故障处理
经过讨论决定增加网卡的缓冲区来缓解这一问题。
使用命令ethtool -g [物理网卡名] 检查网卡当前缓冲区以及最高支持的缓冲区大小。
使用命令ethtool -G [网卡名] rx [缓冲区大小],
本次事例中将数值调成了网卡支持的最大值4078。
在后续的观察中客户反馈丢包现象大幅度减少,在虚拟机业务中感知不明显。
需要完全根除只能更新宿主系统kernel的版本。
四、经验总结
服务器丢包故障排除的一些心得:
1、观察ifconfig下的计数
2、RX收包方向:
dropped:可能网络中存在环路导致设备收到超过最大处理量的数据包
overruns:可能由于应用层/系统核心/驱动导致的缓冲区数据处理不及时
如果dropped和overruns没有计数,则使用ethtool -S [网卡名] 检测crc校验计数情况。服务器网卡故障是极少出现的问题,当网卡出现损坏之后服务器BMC会出现提示网卡异常或服务器因为IERR故障导致宕机。
3、TX 传包方向:
overruns: TX方向的overruns有可能是负载均衡设备(或者Nginx)发生vip漂移导致,需要根据设备所处网络结构排障。