现象
ifconfig 发现RX dropped 数字比较大,持续增加,RX errors 很小,基本不变,RX overruns 都是0。
排查过程:
netstat -s 查看网络层统计信息
ethtool -S eth0 查看网卡统计信息
cat /proc/net/dev 查看网卡统计信息
ifconfig 部分字段的理解:
RX errors: 表示总的收包的错误数量,这包括 too-long-frames 错误,Ring Buffer 溢出错误,crc 校验错误,帧同步错误,fifo overruns 以及 missed pkg 等等。
RX dropped: 表示数据包已经进入了 Ring Buffer,但是由于内存不够,上层协议不支持等系统原因,导致在拷贝到内存的过程中被丢弃,netstat -s可以看到更详细的原因。
RX overruns: 表示了 fifo 的 overruns,这是由于 Ring Buffer(aka Driver Queue) 传输的 IO 大于 kernel 能够处理的 IO 导致的,而 Ring Buffer 则是指在发起 IRQ 请求之前的那块 buffer。
很明显,overruns 的增大意味着数据包没到 Ring Buffer 就被网卡物理层给丢弃了,而 CPU 无法即使的处理中断是造成 Ring Buffer 满的原因之一
没发现异常,一系列百度后,发现:
从2.6.37内核以后,改变了dropped包的统计方式,其不再是以错误包的方式统计,以下情况也会计入dropped包。其值只是做为一种状态统计了。
- Softnet backlog full — (Measured from /proc/net/softnet_stat)
- Bad / Unintended VLAN tags
- Unknown / Unregistered protocols
- IPv6 frames when the server is not configured for IPv6
收到交换机发送的广播路由协议或者其他协议数据,主机并未注册处理,或者主机没有启用ipv6而交换机上有ipv6数据过来,都会导致dropped统计累加。