2023-11-17 号又出现了 2 次 windows 虚拟机死机,查了一下,依然是 LOCKUP ,但是出问题之前报了这么个错误`igb 0000:04:00.0: Detected Tx Unit Hang`,网上查询很多都说是网卡问题,解决方案一是更新网卡驱动,二是更改虚拟网卡为 vmware 那个 vmxnet3 。
```
Nov 17 00:51:37 pve kernel: [2426731.260861] igb 0000:04:00.0: Detected Tx Unit Hang
Nov 17 00:51:43 pve kernel: [2426737.376495] NETDEV WATCHDOG: eno1 (igb): transmit queue 1 timed out
Nov 17 00:51:43 pve kernel: [2426737.376512] WARNING: CPU: 51 PID: 0 at net/sched/sch_generic.c:477 dev_watchdog+0x277/0x280
Nov 17 14:56:55 pve kernel: [24279.339911] igb 0000:04:00.0: Detected Tx Unit Hang
Nov 17 14:57:03 pve kernel: [24286.443613] NETDEV WATCHDOG: eno1 (igb): transmit queue 0 timed out
Nov 17 14:57:03 pve kernel: [24286.443626] WARNING: CPU: 2 PID: 0 at net/sched/sch_generic.c:477 dev_watchdog+0x277/0x280
Nov 17 14:57:29 pve kernel: [24296.144959] NMI watchdog: Watchdog detected hard LOCKUP on cpu 0
```
Virtio 与 E1000 ,这是两种不同的网络虚拟化技术,Virtio 是半虚拟化而 E1000 是全虚拟化。对于全虚拟化方案来说,虚拟机是完全感知不到自己是运行在一个虚拟环境中的;而半虚拟化则是虚拟机知道自己就是运行在一个虚拟环境中,此时 IO 驱动就可以做一些针对性的修改优化,以此降低虚拟化层进行转换带来的开销及性能损失。显而易见,半虚拟化技术的隔离度是没有全虚拟化好的,而且要是虚拟机驱动有问题会导致宿主机也出问题。这就是为什么在使用 Virtio 时,OpenWRT 网络出现问题会导致整个 Proxmox 的网络都不能用了的原因。除了这两种虚拟化方式外,还有些更为先进的虚拟化技术,如 SR-IVO 等。
网上大概分 2 种处理方案:一是关闭 tso 、gso:ethtool -K eno1 tso off gso off ,大部分是添加在`/etc/network/interfaces`里面;
可以参考
https://blog.pakro.top/2020/solve_the_problem_of_eno1_Detected_Hardware_Unit_Hang_under_PVE/二是关闭 TCP checksum offload ,经过测试关闭 TCP checksum offload 的时候会自动关闭 tso ,gso 好像没被关闭,
可以参考
https://ovear.info/post/356 、
https://www.sjfn.com/post/pve-solves-sudden-network-disconnection.html 、
https://gaomf.cn/2019/07/28/PVE_OpenWRT_Network_Broken/目前先采用了二,不行的话再加上一,`sudo vim /etc/network/if-up.d/01-custom-ethtool`
```shell
#!/bin/bash
# Check if the interface is eno1
if [ "$IFACE" = "eno1" ]; then
# Run ethtool to disable tx and rx
/sbin/ethtool -K eno1 tx off rx off
fi
```
`chmod +x /etc/network/if-up.d/01-custom-ethtool`
后期打算**单独直通一个网卡进去以避免影响 pve 宿主机**,或尝试全虚拟化方案如 E1000 、vmxnet 之类。
目前已经直通一个 I210 网卡进去 Windows ,Linux 用 virtio 还好,windows 不推荐用。