真正代表硬件/驱动层丢包的是rx_fifo_errors、rx_over_errors、rx_missed_errors、rx_dropped四个字段:rx_fifo_errors表物理fifo溢出,rx_over_errors表ring buffer溢出,rx_missed_errors表vcpu调度丢失,rx_dropped表内核协议栈丢包;其余带drop或error字段多为伪丢包或中间状态,需结合/proc/net/dev等系统指标交叉验证。

直接用 ethtool -S 查硬件级丢包,关键不是“全字段扫描”,而是盯住四个核心计数器:它们分别对应不同层级的瓶颈,且命名有规律、增长有指向性。其他带 drop 或 error 的字段多数是中间状态或伪丢包,容易误导。
重点盯住这四个硬件/驱动层丢包字段
运行 ethtool -S eth0(把 eth0 换成你的实际接口名),重点关注以下四列:
-
rx_fifo_errors:物理 FIFO 缓冲区溢出。网卡芯片 DMA 写入内存前的硬件缓存满了,新包被硬件直接丢弃。常见于小包高吞吐场景,常与
rx_over_errors同步上涨 -
rx_over_errors:Ring Buffer 溢出。驱动分配的接收队列(ring)已满,新包无法入队,被驱动层丢弃。本质是“收得慢、来得快”,优先查
ethtool -g eth0看当前大小 - rx_missed_errors:vCPU 调度丢失(虚拟化环境尤其敏感)。宿主机 CPU 过载、vCPU 绑定不合理或超配时,中断响应延迟,导致收包中断丢失
-
rx_dropped:包已进 Ring Buffer,但被内核协议栈主动丢弃。原因包括内存紧张、
net.core.netdev_max_backlog不足、软中断处理慢,或 socket 接收队列满
别被 rx_errors 和 grep "drop" 带偏
rx_errors 是链路层错误总和(CRC、帧长、校验等),只反映物理链路质量差(如光衰、线缆松动),不等于丢包;而 grep -i drop 容易漏掉关键字段(比如 Intel 驱动里的 rx_no_buffer_count),也可能误抓 tx_aborted_errors(发送冲突重试失败,非丢包)这类干扰项。
必须交叉验证系统级指标
ethtool -S 只看硬件+驱动层,无法判断协议栈是否也丢了。要准确定位,需同步检查:
-
cat /proc/net/dev:看目标网卡行的 Rx-DRP(对应rx_dropped)和 Rx-OVR(对应rx_over_errors)。这两个字段轻量、稳定、兼容性好 -
netstat -s | grep "packet receive errors"或cat /proc/net/softnet_stat第2列(dropped):确认软中断层是否丢包 -
ss -i查应用 socket 的rcv_space和rcv_ssthresh:判断是否因接收缓冲区满导致上层丢包
典型归因模式与快速响应
结合两组数据,可快速锁定根因:
-
ethtool -S中rx_over_errors或rx_fifo_errors持续涨,而/proc/net/dev的Rx-OVR同步上升 → Ring Buffer 或 FIFO 瓶颈,立即执行ethtool -G eth0 rx 4096调大接收队列 -
Rx-DRP明显上升,但rx_over_errors/rx_fifo_errors几乎为 0 → 协议栈问题,调高net.core.netdev_max_backlog,或检查软中断 CPU 分布(top -H看ksoftirqd) -
rx_crc_errors或rx_length_errors突增 → 物理层异常,检查光纤弯折、模块老化、交换机端口协商(ethtool eth0看 speed/duplex)、双工不匹配











