一次服务器失联排查——e1000e 网卡硬件挂起的故障

故障现象描述

在我的某台服务器运行过程中,出现系统网络无响应故障:SSH 无法连接、ICMP 请求(Ping)超时。但是,云服务商监控面板显示 CPU 与内存等基础资源指标处于正常范围。在缺乏 VNC 或带外管理(OOB)控制台的环境下,此类状态表现为服务器完全失联,仅能通过强制重启恢复。

此类故障随机出现了若干次,且我给服务器的任务负载不高,因此怀疑是底层网络驱动或硬件层面发生故障。

故障排查与日志分析

系统重启恢复后的初期是提取故障现场数据的关键时机。需通过持久化系统日志定位崩溃原因。

定位核心错误信息

通过 journalctl -kb -1 命令查看上一次启动周期的内核日志,核心错误特征如下:

1
2
3
4
5
6
7
8
9
e1000e 0000:00:19.0 eno1: Detected Hardware Unit Hang:
TDH <3d7>
TDT <429>
next_to_use <429>
next_to_clean <3d6>
buffer_info[next_to_clean]:
time_stamp <106754d5c>
next_to_watch <3d8>
jiffies <106754ee8>

结论: 该日志确认为 Intel e1000e 系列网卡驱动在 Linux 内核中的已知缺陷。网卡硬件单元在处理数据包或执行硬件加速(Offload)时发生内部逻辑死锁。此时操作系统内核运行正常,但网络接口控制器(NIC)已停止响应,导致外部网络请求均被丢弃。

当然,在查阅 journalctl/var/log/syslog 时,可能存在大量类似如下的 UFW 防火墙拦截记录:

1
kernel: [UFW BLOCK] IN=eno1 OUT= MAC=... SRC=20.163.15.177 ...

此类日志为常规的互联网端口扫描拦截记录,属于正常防火墙行为,与系统死机故障无关,排查时应予以过滤。

根因分析

经查阅资料,该故障的核心诱因为 TSO (TCP Segmentation Offload) 及其他硬件分片卸载功能。

TSO 旨在将 TCP 分片操作交由网卡硬件处理以降低 CPU 负载。但在部分 Intel 网卡芯片与 e1000e 驱动的组合环境下,开启此功能会导致网卡内部的传输描述符头部/尾部指针(TDH/TDT)状态异常,最终触发 Hardware Unit Hang

解决方案

修复该问题的标准方法为通过 ethtool 工具禁用网卡的硬件分片卸载功能。

为保证该设置在系统重启后稳定生效,需配置可靠的自动化执行机制。

基于 Systemd 的修复方案

在 Debian 13 及采用现代初始化系统的 Linux 发行版中,网络接口的启动存在异步竞态条件(Race Condition)。为确保 ethtool 命令在硬件完全初始化后执行,需通过 Systemd 严格绑定底层硬件设备。

创建服务配置文件 /etc/systemd/system/e1000e-fix.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=Disable hardware offload to fix e1000e NIC hang issue
# 绑定硬件设备单元,确保在内核识别到物理网卡后执行
BindsTo=sys-subsystem-net-devices-eno1.device
After=sys-subsystem-net-devices-eno1.device
# 等待网络目标初步在线
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
# 预留 10 秒缓冲时间,确保链路层协商完成且网卡处于完全就绪状态
ExecStartPre=/usr/bin/sleep 10
# 禁用 TSO, GSO, RX, TX 等硬件加速功能
ExecStart=/usr/sbin/ethtool -K eno1 tso off gso off rx off tx off
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

服务启用与验证

执行以下命令重载配置并启用该服务:

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable e1000e-fix.service
sudo systemctl start e1000e-fix.service

通过以下命令验证配置是否生效:

1
ethtool -k eno1 | grep offload

若输出显示 tcp-segmentation-offload: off 等相关卸载参数为关闭状态,则修复策略已成功应用。

补充加固建议

若禁用 TSO 等功能后,网卡硬件挂起问题仍有极小概率复现,建议修改 GRUB 引导参数以禁用 PCIe ASPM(活动状态电源管理)。编辑 /etc/default/grub 文件,在 GRUB_CMDLINE_LINUX_DEFAULT 变量中追加以下参数:

1
pcie_aspm=off e1000e.IntMode=1,1

配置完成后执行 sudo update-grub 并重启系统。此操作可避免网卡因底层的硬件级节能休眠机制异常而无法被正常唤醒。