最近维护家里服务器时追踪到了一个诡异的bug,启用SATA直通后在某些情况下可能会影响网络速度,初步怀疑是ESXi自身的bug导致,暂时没啥解决方法只能换其他解决方案,网上没找到类似的信息姑且做个记录方便后人。

bug触发机制

测试的网络拓扑大概就是一个openwrt接管某一个vswitch作为LAN口分配ip,然后新建两个配置完全相同的虚拟机接入此虚拟交换机,为了做对比测试先不进行直通。

接着以A机为server,B机为client使用iperf测速,结果大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from [ip], port 55234
[ 5] local [ip] port 5201 connected to [ip] port 55236
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 1.57 GBytes 13.4 Gbits/sec
[ 5] 1.00-2.00 sec 1.64 GBytes 14.1 Gbits/sec
[ 5] 2.00-3.00 sec 1.68 GBytes 14.4 Gbits/sec
[ 5] 3.00-4.00 sec 1.65 GBytes 14.2 Gbits/sec
[ 5] 4.00-5.00 sec 1.64 GBytes 14.1 Gbits/sec
[ 5] 5.00-6.00 sec 1.64 GBytes 14.1 Gbits/sec
[ 5] 6.00-7.00 sec 1.62 GBytes 13.9 Gbits/sec
[ 5] 7.00-8.00 sec 1.62 GBytes 13.9 Gbits/sec
[ 5] 8.00-9.00 sec 1.69 GBytes 14.5 Gbits/sec
[ 5] 9.00-10.00 sec 1.66 GBytes 14.3 Gbits/sec
[ 5] 10.00-10.00 sec 1.61 MBytes 13.4 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.00 sec 16.4 GBytes 14.1 Gbits/sec receiver
-----------------------------------------------------------

如果在路由虚拟机上测速会稍快,但问题不大均在10Gbps这个数量级,由于是在同一主机中内网传输,理论上就是内存复制,也与虚拟交换机10G的标称速度相同。

然后将A机接入SATA直通的PCIe设备,B机保持不变,同样进行测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from [ip], port 38544
[ 5] local [ip] port 5201 connected to [ip] port 38546
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 74.8 MBytes 627 Mbits/sec
[ 5] 1.00-2.00 sec 76.6 MBytes 643 Mbits/sec
[ 5] 2.00-3.00 sec 75.0 MBytes 630 Mbits/sec
[ 5] 3.00-4.00 sec 76.5 MBytes 642 Mbits/sec
[ 5] 4.00-5.00 sec 76.7 MBytes 644 Mbits/sec
[ 5] 5.00-6.00 sec 75.8 MBytes 636 Mbits/sec
[ 5] 6.00-7.00 sec 77.1 MBytes 646 Mbits/sec
[ 5] 7.00-8.00 sec 76.5 MBytes 642 Mbits/sec
[ 5] 8.00-9.00 sec 76.7 MBytes 644 Mbits/sec
[ 5] 9.00-10.00 sec 76.6 MBytes 643 Mbits/sec
[ 5] 10.00-10.02 sec 1.24 MBytes 575 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.02 sec 764 MBytes 639 Mbits/sec receiver

发现问题了没,速度从10Gbps降低到了0.5Gbps,性能折损将近20倍!也就是说即使是内网传输也达不到千兆,这也太拉垮了。

而且更严重的是,如果在此SATA直通的虚拟机中跑一些服务(nas网盘等),过一会之后主机上的所有虚拟机均无法关机(表现为虚拟机系统确实已经关闭,但esxi面板状态却显示正在关机且再无响应……ssh登陆主机后可以看到vm进程依然在运行,kill掉之后貌似没有什么效果,估计是vmkernel死锁了,而且恶心的是这个时候无法通过正常手段关机(kernel死锁),只能按服务器电源强制关机。

问题所在与解决方案(雾)

这个问题是源于我发现做nfs的nas虚拟机速度有点过慢了,即使加上ssd缓存内网也跑不上100M,追了一会才发现是网络问题。起初我以为是驱动或者虚拟机配置之类的,可是当我升级到最新版esxi并且使用新创建的虚拟机测试,结果问题依然存在。然后我怀疑是HPE Gen10 Plus的硬件问题(比如直通占用总线带宽之类离谱的东西),网上看到了 @wzyboy 大佬也有同样配置的服务器,也做了直通但是使用的是pve做底层,于是发邮件戳了下他请他做一下对照组测试,结果一切正常。结合虚拟机无法关机,初步锁定是ESXi自身bug导致。

总之目前的结论就是ESXi的SATA直通在**部分硬件或驱动(HPE Gen10 Plus with HPE Customized ESXi 7.0.2)**上存在bug(可能是个例),由于大概率和vmkernel有关没啥好办法,如果你不幸遇到了这个问题,解决方法就只能是不用就好了:P 使用vmdk映射代替SATA直通,虽然麻烦了点但是网络问题总算能够解决,结合ssd缓存终于能跑满了~没法解决,换PVE。