网卡接收缓冲区溢出是linux网络丢包最常见却易被忽略的原因,表现为tcpdump抓不到、netstat -s统计不到的“静默丢包”;需分层排查:先查/proc/net/dev的rx-ovr,再用ethtool -s核验rx_over_errors/rx_fifo_errors/rx_missed_errors,最后调大ring buffer(如ethtool -g eth0 rx 4096)并匹配软中断、irq affinity等负载能力。

网卡接收缓冲区溢出是 Linux 网络丢包最常见却最容易被忽略的原因之一。它发生在数据包刚到达网卡硬件、还没进入内核协议栈的阶段,所以 tcpdump 抓不到,netstat -s 也统计不到,属于“静默丢包”。排查核心是分层验证:先看系统级统计,再查驱动级计数器,最后确认配置与负载是否匹配。
看 /proc/net/dev 的 Rx-OVR 列
Rx-OVR(Overruns)是第一道快速判断依据,代表网卡 FIFO 或 Ring Buffer 溢出导致的丢包:
- 执行
cat /proc/net/dev,找到目标网卡(如 eth0),关注 Rx-OVR 列数值 - Rx-OVR > 0 且随流量上升而持续增长 → 基本锁定接收缓冲区溢出
- 注意:虚拟网卡(如 virtio_net)可能不暴露 Rx-OVR,此时需结合
dmesg | grep -i "missed"和ethtool -S中rx_missed_errors综合判断
查 ethtool -S 中的关键丢包字段
ethtool -S 输出的是驱动原生计数器,比 /proc/net/dev 更细、更准:
-
rx_over_errors:对应 Rx-OVR,确认 Ring Buffer 溢出是否属实 -
rx_fifo_errors:物理 FIFO 满,多见于小包高吞吐场景,常与 rx_over_errors 同步上涨 -
rx_missed_errors:虚拟化环境关键指标,vCPU 调度延迟导致中断丢失,值上升说明宿主机 CPU 过载或 vCPU 绑定不合理 -
rx_dropped:包已进 Ring Buffer,但被内核丢弃(如内存不足、NAPI 处理慢),不属于缓冲区溢出范畴,需另查
检查并调大 Ring Buffer 大小
默认值在高吞吐或小包场景下极易不足(如 igb 默认 RX=256,ixgbe 默认 RX=512):
- 查看当前大小:
ethtool -g eth0 - 尝试调大(需网卡支持):
ethtool -G eth0 rx 4096(万兆卡常见上限为 4096 或 8192) - 调大后观察
rx_over_errors是否停止增长;若仍涨,需检查驱动版本、固件、中断亲和性(IRQ affinity)或软中断负载
协同检查配套内核参数与运行状态
单调大 Ring Buffer 效果有限,必须匹配处理能力:
- 检查软中断负载:
cat /proc/net/softnet_stat,第二列(dropped)若同步上涨,说明 NAPI 或 NET_RX 处理不过来 - 增大入口队列容量:
sysctl net.core.netdev_max_backlog=30000,防突发流量在软中断前堆积 - 确认中断是否集中在一个 CPU:
cat /proc/interrupts | grep eth0,若某 core 中断远高于其他,应配置 IRQ affinity 分散负载 - 避免误配 tc/qdisc:运行
tc qdisc show dev eth0,排除 netem loss 等人为丢包干扰











