NETDEV WATCHDOG超时直接卡死网卡是内核主动保护机制,因驱动层TX描述符耗尽、DMA失败或硬件卡死导致发送停滞,需重载驱动或升级固件修复。

为什么 NETDEV WATCHDOG 超时会直接卡死网卡
这不是单纯的告警,而是内核在检测到网卡驱动长时间未完成数据包发送(默认 5 秒)后,主动触发的保护性停用。一旦触发,对应队列会被禁用,tx_queue_len 归零,ifconfig 或 ip link 里能看到 NO-CARRIER 或持续 LOWER_UP 但无流量,dmesg 里反复刷出该错误——说明驱动已放弃恢复,必须人工干预。
- 根本原因几乎都落在驱动层:TX 描述符耗尽、DMA 映射失败、硬件状态机卡在 BUSY、中断未及时响应
- 不是网络拥塞或丢包问题,
ping和tcpdump在本地可能完全正常,但出向流量彻底停滞 - 重启网络服务(
systemctl restart networking)无效,必须重载驱动或重启内核模块
快速定位是哪个网卡和驱动在出问题
先确认报错绑定的具体设备:dmesg -T | grep -i "watchdog.*timed out",输出类似 NETDEV WATCHDOG: eth0 (tg3): transmit queue 0 timed out,重点看括号里的驱动名(这里是 tg3)和接口名(eth0)。
- 查驱动归属:
ethtool -i eth0 | grep driver,验证是否与dmesg一致 - 查当前驱动状态:
lsmod | grep tg3(替换成你实际的驱动名),确认是否已加载 - 查硬件是否异常:
lspci -vv -s $(ethtool -i eth0 | awk '/bus-info/ {print $3}') | grep -A10 "Kernel driver",观察是否有Interrupt字段缺失或MSI-X状态异常
临时恢复:卸载并重载驱动(不重启系统)
这是最快让网卡“活过来”的方式,但仅治标。执行前确保你有带外管理(如 iDRAC/iLO)或本地终端访问,避免 SSH 断连后失联。
- 关闭接口:
ip link set eth0 down - 卸载驱动:
rmmod tg3(替换成你的驱动名,如e1000e、ixgbe) - 重新加载:
modprobe tg3 - 启用接口:
ip link set eth0 up - 验证:
ethtool eth0 | grep "Link detected"应为yes,且cat /proc/interrupts | grep eth0有中断计数增长
注意:某些驱动(如 mlx5_core)依赖多个模块,需按依赖顺序卸载;若报 Module tg3 is in use,用 lsof -nPi | grep eth0 找占用进程,或加 -f 强制(不推荐)。
永久修复要盯紧三个配置点
临时重载只是绕过问题,真正稳定需从硬件兼容性、驱动参数、队列调度三方面收敛。
- 升级固件:尤其是 Broadcom(
tg3)、Intel(e1000e)网卡,老版本 NIC 固件在高吞吐下易卡 TX 状态机,去厂商官网下最新.bin文件 +bnx2-firmware或intel-microcode包更新 - 调驱动参数:在
/etc/modprobe.d/下新建文件(如net-fix.conf),添加:options tg3 disable_msi=1
(
options tg3 enable_mcp=0disable_msi对老主板更稳,enable_mcp关闭某些 BCM 芯片的电源管理副作用) - 压测验证:用
iperf3 -c X.X.X.X -t 300 -P 4持续 5 分钟,同时watch -n1 'cat /sys/class/net/eth0/queues/tx-0/byte_count'观察是否突变为 0 —— 这才是真实复现点
很多团队卡在“重载完好了几天又复发”,往往是因为只改了驱动参数却没升固件,或者误把 net.core.netdev_watchdog_timeo 调大(掩盖问题,不解决)。真正稳定的系统,dmesg 里不该出现这行错误。










