应直接用ip -s link show dev 网卡名查看rx/tx errors:rx_errors是物理层错误总和(含crc/frame/length等),持续增长指向网线、光模块或双工问题;tx_errors罕见,非零需查carrier/aborted类错误;rx_dropped/tx_dropped属内核主动丢弃,非硬件故障。

直接用 ip -s link show dev 网卡名,别碰 ifconfig 或 netstat -i —— 它们字段模糊、统计口径旧,容易误判。
怎么快速定位 RX/TX errors 字段含义
执行 ip -s link show dev ens33(把 ens33 换成你的真实网卡名,可用 ip link show 先确认)后,输出分 RX 和 TX 两块:
-
rx_errors是总和,包含rx_crc_errors、rx_frame_errors、rx_length_errors等,只要非零且持续涨,基本指向物理层或驱动问题(比如网线松动、光模块衰减、双工不匹配) -
tx_errors较少见,但若非零,重点查ethtool -S ens33 | grep -i "carrier\|aborted"——tx_carrier_errors高说明对端链路反复断连,tx_aborted_errors高可能本端 PHY 异常 -
rx_dropped和tx_dropped不是“错误”,而是内核主动丢弃:前者常见于net.core.netdev_max_backlog不足或软中断处理不过来;后者多因 qdisc 队列满、TC 限速或驱动发送缓冲区溢出
为什么 ethtool -S 必须跟上
ip -s link 只给聚合值,真正定位根因得靠 ethtool -S 查底层寄存器:
- 先装工具:
sudo apt install ethtool(Debian/Ubuntu)或sudo dnf install ethtool(RHEL/CentOS) - 运行
ethtool -S ens33 | grep -E "(crc|frame|fifo|miss|drop)",重点关注:-
rx_crc_errors> 0 → 线缆接触不良或交换机端口故障 -
rx_missed_errors或rx_no_buffer持续涨 → ring buffer 太小或中断处理延迟,需调ethtool -G ens33 rx 4096 -
rx_over_errors高 → 接收 FIFO 溢出,和 CPU 负载、RPS/RFS 绑定强相关
-
- 注意:
ethtool -S字段名因芯片而异(Intel igb vs Broadcom bnxt),不能只搜关键词,得先用ethtool ens33确认 Link 状态、Speed、Duplex 是否正常
别被 /proc/net/dev 和 ifconfig 的 errs 值带偏
这三个地方的 “errs” 列不是一回事:
-
/proc/net/dev第三列errs是驱动上报的 RX 错误总和,但它不实时更新——部分虚拟网卡或老驱动会一直为 0,即使实际有错包 -
ifconfig ens33显示的RX errors和/proc/net/dev同源,且已被标记为废弃;它不区分错误类型,也不显示missed或overruns -
netstat -i的RX-ERR是同一套数据,还把 RX/TX 错误混在一列里,掩盖单向故障 - 真正可信的是
ip -s link的rx_errors:它直连 netlink,维度细、刷新准;如果它非零而/proc/net/dev为 0,信前者
监控变化量比看绝对值重要得多
ip -s link 输出是累计值,重启清零,单次数值毫无意义:
- 最简方法:
watch -n 1 'ip -s link show dev ens33 | grep -A 2 "RX\|TX"',每秒刷一次,盯rx_errors和rx_dropped是否在涨 - 更准做法:两次执行
ip -s link show dev ens33,用awk '/RX/ {getline; print $2}'提取rx_packets,再做差值算速率;同理算rx_errors增量 —— 如果rx_errors / rx_packets > 0.1%,必须查物理链路 - 别依赖
ifconfig的collisions或interrupts:千兆以上全双工网络中这些字段恒为 0,无诊断价值
真正难的不是命令怎么敲,而是看到 rx_dropped 上升时,能不能立刻意识到这大概率不是网线问题,而是 net.core.netdev_max_backlog 设置太小或软中断绑核不均;看到 rx_crc_errors 涨了,能不能马上去拔插网线、换端口、查光衰。字段含义混淆,比命令不会用更容易导致误判。











