两个主要原因:
- buff不足导致丢包
- 系统丢弃了不识别的数据
RX dropped:
表示数据包已经进入了 Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃。
从2.6.37内核开始,对RX dropped统计的内容做除了调整,目前出现一下几种情况会被统计到RX dropped当中:
Softnet backlog full (分配内存失败 在/proc/net/softnet_stat有统计)
Bad/Unintended VLAN tags (当收到的数据包包含无效或不正确的 VLAN 标签时,这些数据包会被网络层丢弃,并计入
RX dropped
)Unknown/Unregistered protocols (使用了系统无法识别的协议,或者该协议未在系统中注册,则系统会丢弃这些数据包并将它们计入
RX dropped
)IPv6 frames (网络接口接收到的 IPv6 数据包无法处理(如未启用 IPv6 或 IPv6 协议未正确配置),这些数据包也会被丢弃并计入
RX dropped
)
经查询是第二点系统未识别 stp 的包导致,可以使用tcpdump抓包进行分析,并且在执行tcpdump的时候,系统RX dropped 值就不在增加了
解决办法:
需要开启内核stp模块
临时开启
modprobe bridge
永久开启
echo "bridge" > /etc/modules-load.d/bridge.conf
查看
lsmod | grep bridge
如果想卸载这个模块,再删除上面那个文件就行
modprobe -r bridge
这个可以解决由系统未识别stp的包导致RX dropped 值一直增加的问题。
ps:因为是物理设备,所以在交换机上面关闭stp协议,经测试也是可以的。