解决 Intel(R) I350-T4 在 vSphere 7 上的高延时问题

记录下如何解决 ESXi 7 主机上的 Intel(R) I350-T4 网卡周期性出现的高延迟丢包问题.

问题现象

实验环境有四台 Lenovo M920X 运行 ESXi 7.0U1 组成的集群, 使用的是 Intel(R) I350-T4 四口千兆网卡. 差不多每运行一两周后某台主机的某个网口就会出现超高延迟 (~1s) 并伴随丢包.

vmkernel.log 中可以发现下面的日志

1
2
3
4
5
2022-01-09T16:31:39.224Z cpu13:1049182)igbn: igbn_CheckRxHang:1382: vmnic1: false hang detected on RX queue 0
2022-01-09T16:31:45.246Z cpu13:1049182)igbn: igbn_CheckRxHang:1382: vmnic1: false hang detected on RX queue 0
2022-01-09T16:31:51.260Z cpu13:1049182)igbn: igbn_CheckRxHang:1382: vmnic1: false hang detected on RX queue 0
2022-01-09T16:31:57.270Z cpu13:1049182)igbn: igbn_CheckRxHang:1382: vmnic1: false hang detected on RX queue 0
2022-01-09T16:32:03.293Z cpu13:1049182)igbn: igbn_CheckRxHang:1382: vmnic1: false hang detected on RX queue 0

此时插拔网线, 禁用/启用网卡均无效, 只能重启主机才能使该网口恢复正常.

失败的尝试

禁用节能模式 Energy Efficient Ethernet

网上搜索到过一个类似的问题, 不过是在 ESXi 6.5 上的, 由 igbn 1.3.1 版本驱动的 bug 导致. 但是文中提到的选项参数在 ESXi 7 中已经不可用. 尝试在对端物理交换机上禁用节能模式后, 状况并没有显著差别.

替换官方驱动

将 inbox igbn 驱动替换为 Intel 提供的驱动. 使用 vmkchdev -l 来获取设备的 VID:DID SVID:SDID, 然后去 https://customerconnect.vmware.com 搜索适用的驱动下载. 替换驱动并重启主机后, 问题依旧.

调整 TSO/LRO

尝试禁用/启用 TSO/LRO

1
2
3
esxcli system settings advanced set -o /Net/UseHwTSO -i 0
esxcli system settings advanced set -o /Net/UseHwTSO6 -i 0
esxcli system settings advanced set -o /Net/TcpipDefLROEnabled -i 0

然而结果并没有什么显著差别

1
2
3
esxcli system settings advanced set -o /Net/UseHwTSO -i 1
esxcli system settings advanced set -o /Net/UseHwTSO6 -i 1
esxcli system settings advanced set -o /Net/TcpipDefLROEnabled -i 1

替换同型号网卡

从另外一个渠道买入同型号的 Intel(R) I350-T4, 给其中一台主机替换上, 经过一段时间后问题依然重现. 至此可以排除网卡硬件本身的问题.

解决方法

偶然一次检查网卡统计信息时发现有比较大的 Receive FIFO error:

1
2
3
4
5
6
esxcli network nic stats get -n vmnic1

NIC statistics for vmnic1
...
Receive FIFO errors: 834656

结合 KB 50121760 尝试调整 ring buffer

1
2
3
4
esxcli network nic stats get -n vmnic1
esxcli network nic ring preset get -n vmnic1
esxcli network nic ring current get -n vmnic1
esxcli network nic ring current set -n vmnic1 -r 4096 -t 4096

调整完重启主机. 持续运行半年没再出现过类似状况, 至此问题解决.