适用对象:使用常见集成型以太网控制器的 Proxmox VE 虚拟化宿主机

问题特征:宿主网络随机掉线、时间不固定;重启 networking 后宿主恢复,但虚拟机仍需 stop/start 才能恢复;虚拟机内部 reboot 无效

结论摘要:关闭网卡 offload + 关闭 EEE(Energy Efficient Ethernet),并进行 systemd 永久化,是当前该问题族成功率最高、代价最低、可复现性最强的解决方案之一。


1. 问题现象(行为级描述)

在长期运行的虚拟化环境中,宿主机会出现随机网络中断,具有如下共同特征:

  • 掉线时间不固定,常见于高负载后或空闲阶段
  • 物理链路状态显示为 UP
  • 宿主机可通过重启 networking 服务恢复外网连通性
  • 虚拟机在宿主恢复后仍然不通
  • 必须对虚拟机执行 Stop → Start 才能恢复网络
  • 虚拟机内部 reboot 无法解决问题

这些现象往往容易被误判为虚拟机、应用或网络配置问题,但多次验证表明:真正进入异常状态的是宿主机网络路径本身


2. 架构与关键前提

该问题通常出现在如下环境组合中:

  • 硬件:采用 SoC 集成以太网控制器的紧凑型主机
  • 驱动:常见集成以太网驱动
  • 宿主系统:Proxmox VE(Linux bridge + tap/vhost-net)
  • 网络模型
VM → virtio-net
   → vhost-net
      → tapX / fwbrX
         → vmbr0
            → 物理网卡(eno1)

与台式机或服务器上常见的独立 PCIe 网卡不同,集成型以太网控制器在电源管理(EEE / ASPM / C-state)与 CPU之间存在更强的耦合,这一差异是问题产生的重要边界条件。


3. 关键认知纠偏

3.1 虚拟机并非问题源头

  • 虚拟机不掌控物理网卡
  • 虚拟机不管理 offload / EEE / 省电状态
  • 虚拟机只通过 tap 设备间接依赖宿主网络

当宿主网络路径进入异常中间态时,虚拟机只是最先感知失败的一层

3.2 为什么重启 networking 只能救宿主

networking 服务的重启会:

  • 重建物理接口
  • 重建 Linux bridge
  • 重置路由与防火墙规则

但它不会销毁或重建已经存在的:

  • tap 设备
  • vhost-net 队列
  • 防火墙子 bridge

因此,虚拟机仍然绑定在失效的中间层网络对象上。

3.3 为什么必须 Stop → Start 虚拟机

只有彻底停止并重新启动虚拟机,宿主侧才会:

  • 销毁旧的 tap / vhost-net
  • 重新创建完整的 VM 网络路径
  • 将其接入当前健康的 bridge

这解释了为何 VM reboot 无效,而 Stop/Start 有效


4. 根因分析

4.1 offload(硬件卸载)的问题

在虚拟化 + bridge 场景下,开启 offload 会导致:

  • 网卡硬件维护一套内核不可见的内部状态
  • 高 PPS / 高负载下,RX/TX 队列可能进入异常
  • Linux 内核仍认为接口 UP,但转发路径已失效

这是“链路显示正常但无法通信”的根本原因之一。

4.2 EEE(Energy Efficient Ethernet)的问题

EEE 会在链路空闲时将网卡置于低功耗状态(LPI),并在流量恢复时唤醒。

在部分 NUC + e1000e 组合上:

  • 唤醒过程并非 100% 可靠
  • 可能出现链路 detected 但实际 TX/RX 不工作的状态

EEE 解释了问题的随机性时间不确定性

4.3 叠加效应

当 offload 与 EEE 同时开启时:

  • 硬件状态错乱概率显著提高
  • 宿主网络更容易进入“逻辑存活、实际失效”的中间态

5. 解决思路与实施

5.1 只读检查(确认命中问题族)

ip -br link
ethtool -i eno1
ethtool -k eno1
ethtool --show-eee eno1

若满足以下条件:

  • 驱动为 常见集成以太网驱动
  • 多项 offload 为 on
  • EEE 为 enabled

即可进入整改阶段。


5.2 关闭 offload(立即生效)

ethtool -K eno1 \
  rx off tx off \
  tso off gso off gro off \
  sg off rxvlan off txvlan off

5.3 关闭 EEE(立即生效)

ethtool --set-eee eno1 eee off

验证:

ethtool --show-eee eno1

应显示 EEE status: disabled


6. 永久化(systemd)

为避免重启或内核升级后配置失效,建议将两项设置拆分为两个 systemd oneshot 服务

6.1 offload 永久化

[Unit]
Description=Disable offload on eno1
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -K eno1 rx off tx off tso off gso off gro off sg off rxvlan off txvlan off
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

6.2 EEE 永久化

[Unit]
Description=Disable EEE on eno1
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool --set-eee eno1 eee off
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

启用:

systemctl daemon-reload
systemctl enable --now eno1-offload-off.service
systemctl enable --now eno1-eee-off.service

7. 效果与验证标准

问题被认为“已解决”,通常满足以下任一条件:

  • 长时间运行中不再需要重启虚拟机以恢复网络
  • 即便出现瞬时抖动,也能自动恢复,不进入死状态
  • 原本高频(如每日)的异常在数周内不再复现

8. 总结

  • 该问题并非虚拟机、应用或配置错误
  • 根因在于 集成型以太网控制器 + 对应驱动 + offload/EEE 的组合边界
  • 关闭 offload 与 EEE 是结构性修复,而非临时规避
  • systemd 永久化将个人经验转化为可复用的工程资产

通过将网络行为完全收回到 Linux 内核控制范围内,宿主机从“不可预测状态”回到“可维护、可解释状态”,虚拟化环境的稳定性得到显著提升。

Leave a Reply

Your email address will not be published. Required fields are marked *