ip -s link的rx_errors只是聚合值,无法区分CRC错、帧错或buffer溢出等具体类型;必须用ethtool -S查rx_crc_errors、rx_missed_errors、rx_over_errors等寄存器字段才能准确定位物理层、驱动层或CPU处理瓶颈问题。

直接看 ip -s link 只能知道总错包数,真要分清是 CRC 错、帧错还是 buffer 溢出,必须用 ethtool -S。
为什么 ip -s link 的 rx_errors 不够用
ip -s link show dev ens33 输出的 rx_errors 是个聚合值,它把所有底层接收错误全加在一起:CRC 校验失败、帧对齐错、长度错、symbol 错……但你没法知道哪一类在涨。如果只是线缆松动,rx_crc_errors 会明显上升;如果是 CPU 处理不过来,rx_missed_errors 或 rx_no_buffer 才会跳变——这两类问题的处理方式完全不同。
常见误判场景:
- 看到
rx_errors在涨,立刻换网线,结果发现其实是rx_missed_errors高,根源是中断绑定不均或 ring buffer 太小 - 用
ifconfig查到相同数字就以为定位完成,但ifconfig已废弃,字段含义模糊,且不支持现代网卡的细分寄存器
用 ethtool -S 查具体错误类型
先确认网卡名:ip link show;再查寄存器快照:ethtool -S ens33(把 ens33 换成你的实际接口名)。
关键字段因芯片而异,但以下几类通用性强:
-
rx_crc_errors> 0 → 物理链路问题:网线接触不良、光模块衰减、交换机端口异常 -
rx_missed_errors或rx_no_buffer持续上涨 → ring buffer 不足或软中断处理延迟,需调ethtool -G ens33 rx 4096 -
rx_over_errors高 → 接收 FIFO 溢出,和 CPU 负载、RPS/RFS 设置强相关 -
rx_frame_errors非零 → 帧对齐失败,多见于双工不匹配或交换机配置错误
过滤命令可简化排查:ethtool -S ens33 | grep -E "(crc|miss|over|frame)"
别被 /proc/net/dev 和 netstat -i 的 errs 带偏
/proc/net/dev 第三列 errs 和 netstat -i 的 errs 实际是同一数据源,但它只统计 RX 方向、不区分错误类型,且部分驱动(尤其是虚拟网卡或老芯片)根本不更新该字段——可能长期为 0,哪怕 ip -s link 已显示几百个 rx_errors。
更糟的是:netstat -i 把 RX/TX errors 合并在一列里,掩盖单向故障。比如只有接收出错、发送完全正常,你根本看不出。
可信顺序是:ip -s link > ethtool -S > 其他;/proc/net/dev 和 netstat -i 仅适合脚本批量读取历史趋势,不能用于实时根因判断。
查之前先确认基础链路状态
ethtool -S 的输出依赖硬件寄存器上报,如果链路本身没 UP,很多字段就是 0 或无效值。所以务必先跑:ethtool ens33,检查:
-
Link detected: yes—— 否则物理层已断,查线缆/光模块 -
Speed:和Duplex:是否与对端一致 —— 双工不匹配会导致大量rx_frame_errors -
Auto-negotiation:是否启用 —— 关闭时易引发协商失败
如果 Link detected 是 no,后面所有错误统计都失去意义,优先解决连通性问题。











