VMware和HyperV(wsl2)共存后性能大幅下降的解决方案 为了使用WSL2,要求开启HyperV的虚拟化,但开了HyperV之后,VMWare就不能用了。
虽然从VMWare16版本开始vmware已经能和wsl2、hyper-v共存(记忆中好像vmware 16版之前就有几个小版本支持和hyper-v、wsl2共存),但这个共存是付出了巨大代价的:VMWare的性能大幅下降。
我并没有具体测试性能到底下滑了多少,但是可以对比曾经和现在使用VMWare的流畅度:
老电脑是宏碁4750G配置:cpu i5-2410m,显卡GT520,内存8G,vmware里装win7、win server 2008/2012,使用机械硬盘好多年,还开好几个虚机多开DNF,跑Exchange、SQL Server集群等等,换成SATA固态之后体验更丝滑,丝毫不感觉虚拟机有卡顿延迟不流畅的感觉
现在的电脑配置:CPU i7-7700K,显卡GTX1060 6G,内存32G,NVME固态。和老电脑相比,配置带来的提升至少是1到2个数量级。然而开启HyperV之后,VMWare里装Win7,只是装几个软件(qq、微信、百度网盘、迅雷),虚拟机就卡的要死,流畅度很差,延迟卡顿到恼火。关闭HyperV虚拟化之后,瞬间丝滑了
所以,WSL2和流畅的VMWare只能二选一。
我本人曾经重度使用wsl2,但现在基本上只使用wsl1。不使用wsl2的原因有多方面,虽然现在(windows10 22H2,2023年)已经改善了wsl2一些不友好的地方,但wsl2依然有一个缺陷让我不得不放弃wsl2:我在Win宿主机上有几十G的数据需要Linux子系统里的程序去读写,而wsl2读写win宿主机上的数据是非常慢的,另一方面,wsl1读写win宿主机上的数据并不慢,性能也不差。
所以,我选择仅使用wsl1并且拥抱流畅的VMWare,忍痛放弃wsl2(虽然一点也不痛)。但是,我也不是完全放弃wsl2,而是以多系统隔离的方式让它们共存了。
VMware和HyperV以多系统隔离的方式共存 描述一下现在我的两个win系统:
win10:wsl + wsl2 + vmware,也就是说,这个系统中开启了hyper-v,可以使用wsl2,但是容忍vmware的性能下降
win10_nohyperv:wsl + vmware,也就是说,这个系统中关闭了Hyper-V,使用wsl和没有性能损失的vmware
生成这样的多系统隔离很简单,执行几个命令即可。
假如,现在的系统win10是开启了hyper-v虚拟化的(如果使用了wsl2,记得先把所有的wsl2子系统备份或者取消注册,后面操作完成了再重新注册回来),打开命令提示符(注意,不能是powershell)执行下面的命令,这将复制当前系统生成一个关闭了hyper-v虚拟化功能的新系统:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 $ bcdedit /copy {current} /d "Win10_nohyperv” # 输出:已将该项成功复制到 {48294053-70b2-11ee-9c25-9e34ad6831ea},复制大括号里的内容 $ bcdedit /set {48294053-70b2-11ee-9c25-9e34ad6831ea} hypervisorlaunchtype OFF # 现在就有两个系统了,一个是开启了HyperV虚拟化的,一个是关闭了HyperV虚拟化的 $ bcdedit Windows 启动管理器 -------------------- 标识符 {bootmgr} device partition=\Device\HarddiskVolume8 path \EFI\MICROSOFT\BOOT\BOOTMGFW.EFI description Windows Boot Manager locale zh-CN inherit {globalsettings} default {current} resumeobject {48294053-70b2-11ee-9c25-9e34ad6831ea} displayorder {48294054-70b2-11ee-9c25-9e34ad6831ea} {current} toolsdisplayorder {memdiag} timeout 3 Windows 启动加载器 ------------------- 标识符 {48294054-70b2-11ee-9c25-9e34ad6831ea} device partition=C: path \WINDOWS\system32\winload.efi description Win10_22H2 locale zh-CN inherit {bootloadersettings} recoverysequence {48294057-70b2-11ee-9c25-9e34ad6831ea} displaymessageoverride Recovery recoveryenabled Yes isolatedcontext Yes allowedinmemorysettings 0x15000075 osdevice partition=C: systemroot \WINDOWS resumeobject {48294053-70b2-11ee-9c25-9e34ad6831ea} nx OptIn bootmenupolicy Standard hypervisorlaunchtype Auto Windows 启动加载器 ------------------- 标识符 {current} device partition=C: path \WINDOWS\system32\winload.efi description Win10NoHyperV locale zh-CN inherit {bootloadersettings} recoverysequence {48294057-70b2-11ee-9c25-9e34ad6831ea} displaymessageoverride Recovery recoveryenabled Yes isolatedcontext Yes allowedinmemorysettings 0x15000075 osdevice partition=C: systemroot \WINDOWS resumeobject {48294053-70b2-11ee-9c25-9e34ad6831ea} nx OptIn bootmenupolicy Standard hypervisorlaunchtype Off
可以通过msconfig
命令打开系统引导窗口,修改一下默认启动的系统和等待时间间隔。
现在重启操作系统,就会有两个系统供你选择,在Win10_nohyperv系统中就关闭了HyperV的虚拟化功能,可以流畅地使用VMware和wsl1,但不能使用wsl2。
最后,在开启了HyperV虚拟化的系统里,重新恢复注册wsl2子系统即可。