虚拟机硬盘性能慢,多半不是虚拟化软件的问题,而是虚拟磁盘类型、缓存策略和存储介质这三层没有匹配好先换虚拟SCSI控制器并开启写入缓存,多数情况下读写速度能提升一大截。
虚拟机跑着跑着就卡顿,开机转圈转到怀疑人生,拷贝文件速度还没U盘快,这些现象几乎每个玩过虚拟机的人都遇到过,问题在于,很多人把精力花在调CPU核数、加内存上,却忽略了硬盘这条真正的“瓶颈水管”,下面这套优化思路,从最基础的接口选择到进阶的IOPS调优,一步一步拆开讲。
换对接口和控制器:虚拟机磁盘读写速度慢怎么解决
虚拟机的虚拟硬盘,默认用的接口类型往往是最保守的IDE,IDE本身就是1990年代的设计,传输速率上限低,I/O队列深度浅,你给虚拟机装了SSD,跑在IDE接口下,速度照样被按在地上摩擦。
把默认的IDE接口换成虚拟SCSI
行业共识认为,虚拟SCSI控制器的队列深度和并发能力远高于IDE,在读写负载较高时性能差距明显。
VMware Workstation操作路径:
- 关闭虚拟机,右键虚拟机设置,选中当前硬盘。
- 移除现有硬盘(注意勾选“从磁盘删除”时别点错,这里只移除设备,不删文件)。
- 点击“添加”,选择“SCSI硬盘”,再选择“使用现有虚拟磁盘”,把刚才那个vmdk文件重新挂载到SCSI控制器上。
- 开机安装驱动,Windows系统通常会自动识别,Linux需要确认内核包含mptspi或vmw_pvscsi模块。
另一条路是直接改vmx配置文件,在虚拟机关机状态下用文本编辑器打开vmx文件,把scsi0:0.deviceType相关参数补上,但新手用图形界面更稳妥,改完后用CrystalDiskMark测一段随机4K读写,提升幅度相当直观。
Hyper-V环境同样别用IDE
Hyper-V的默认控制器是标准ATA,性能同样受限,在虚拟机设置里把硬盘从“IDE控制器”迁移到“SCSI控制器”,操作也很简单:
- 关机,进入虚拟机设置。
- 删除现有IDE硬盘,在SCSI控制器下新建虚拟硬盘,指向同一个vhdx文件。
- 开机后更新驱动即可。
缓存策略和磁盘格式:vmware虚拟机硬盘性能优化必须关注的细节
接口换完之后,
接下来看虚拟磁盘本身的“脾气”,很多人建虚拟机图省事,直接选了精简置备(Thin Provision),用多少占多少,这个模式在刚建好时体验还行,但随着虚拟机内文件不断创建、删除,磁盘块分配越来越散,写性能会明显劣化,厚置备(Thick Provision)虽然一次性占用全部空间,但I/O路径更直接,不需要每次写入都去查映射表,稳定性好得多。
厚置备固定比精简置备跑得更稳
VMware创建虚拟机时,四类虚拟磁盘类型中,厚置备延迟置零和厚置备立即置零性能优于精简置备,尤其适合数据库、编译缓存这类高频写场景,已存在的精简盘可以这样转换:
- 加载VMware vCenter Converter,选择原虚拟机。
- 目标磁盘类型选“厚置备延迟置零”。
- 等待转换完成后替换旧磁盘。
Hyper-V类似,vhdx文件可以转换成固定大小VHDX:
Optimize-VHD -Path "D:vmstest.vhdx" -Mode Full
这个命令把动态扩展盘内部所有空白块清零并压缩,-Mode Full还会重建映射结构,跑完之后虚拟机内部再做一次磁盘碎片整理,写速度会回到接近新盘的水平。
写入缓存要分清虚拟机和宿主机两层
VMware虚拟机设置里,硬盘的高级选项有两个关键开关:“独立”模式和“写入缓存”模式,开启“写入缓存”后,虚拟机对磁盘的写入会先落到宿主机内存,再由宿主机批量刷入物理盘,这样连续小文件写入的场景速度提升明显,但宿主机意外断电的丢数据风险会增大,行业内的平衡做法是:开发测试环境放开了开,生产环境只在有UPS保证的机房里开,Hyper-V方面,动态内存开启时系统会自动启用存储缓冲,普通桌面用户不用手动额外调整。
hyper-v虚拟硬盘性能优化设置:网络和存储的联动细节
Hyper-V里还有一个容易被忽略的点,就是虚拟机的虚拟网卡流量会占用vSwitch进程的CPU时间,如果同时跑多台虚拟机做网络传输,性能瓶颈会跑进存储阶段,看起来像硬盘慢,实际上是网络IO占用了大量资源,以下几个设置值得按顺序过一遍:
- 打开PowerShell,给虚拟网卡开启VMMQ(虚拟机多队列):
Set-VMNetworkAdapter -VMName "你的虚拟机" -VmmqEnabled $true,这在Windows 2019及以上版本里实测有效。
- 把虚拟机的系统盘和数据盘拆开,vhdx分别放在不同的物理硬盘或不同的NVMe分区上,避免单块硬盘的磁头打架。
- 如果宿主机内存充足(32GB以上),给虚拟机分配尽可能高的内存,大幅减轻虚拟内存和磁盘交换的频率。
固定VHDX比动态VHDX更稳
Hyper-V里动态扩展vhd的问题和VMware精简盘类似,频繁扩容会触发物理磁盘碎片,把动态vhdx转成固定vhdx后,虚拟机的随机读取等待时间通常能缩短不少:
- 关闭虚拟机。
- 管理员身份打开PowerShell:
Convert-VHD -Path "D:vmdisk-dynamic.vhdx" -DestinationPath "D:vmdisk-fixed.vhdx" -VHDType Fixed。 - 转换完成后,在虚拟机设置里替换硬盘路径。
宿主机杀毒软件排除项务必设置
杀毒软件实时监控是虚拟磁盘性能的隐形杀手,Windows Defender和第三方安全软件如果默认扫描.vhdx、.vmdk文件,读写吞吐会严重下降,据微软官方文档建议,将虚拟磁盘文件扩展名以及虚拟机文件夹加入杀毒软件排除列表,重启宿主机即可生效,不需要排除整个盘符,只排除固定后缀名就够了。
虚拟机磁盘IOPS提升技巧:从传统方式到直通方案
接口和缓存搞定后,如果你的虚拟机跑的是高并发数据库、持续集成编译节点,还觉得硬盘不够快,就得往直通方向走了。
直通物理硬盘:把水龙头直接接到井里
VMware Workstation Pro支持把物理硬盘直接映射给虚拟机(Raw Device Mapping),Hyper-V也支持“直通磁盘”功能,这样做的好处是虚拟机跳过虚拟磁盘文件层,直接对物理扇区操作,IOPS损耗极小,具体操作路径:
- VMware:添加硬盘 → 选择物理磁盘 → 按提示勾选整块磁盘。
- Hyper-V:虚拟机设置 → SCSI控制器 → 添加硬盘 → 虚拟硬盘类型选“物理硬盘”。
注意:直通后,这块物理盘不能同时挂给宿主机用,而且是整盘占用,如果只是装个普通办公系统,直通完全是浪费;数据库或测试跑性能压测时,这招才能发挥价值。
用NVMe模拟器和virtio-blk
KVM环境(如Proxmox VE)里,虚拟磁盘默认的IDE或SATA模拟性能很差,改用
virtio-blk驱动后IOPS提升近乎翻倍,如果是跑Windows虚拟机,记得先装Red Hat VirtIO驱动,再切换总线类型,Proxmox VE Web管理界面中,磁盘总线类型选VirtIO Block即可,简单直接。
物理层缓存策略
宿主机BIOS里SATA控制器或NVMe SSD的写缓存策略,也直接影响虚拟磁盘的性能,绝大多数主板默认打开了Buffer/Written Back,但部分服务器型号出厂会关闭,进入RAID控制器或BIOS存储设置,把“Write Back Cache”开启,虚拟机的写入延迟能改善不少,前提是服务器有电池或电容保护,否则慎用。
Q&A:虚拟机硬盘性能常见疑问整理
为什么虚拟机里看到的是SSD,速度还是很慢?
虚拟机里看到“固态硬盘”通常是虚拟化的假象,VMware会用Virtual SSD来标记部分已用空间,但底层物理硬盘如果是机械盘,虚拟机的实际读写依然受限于物理盘转速,可以先在宿主机上用CrystalDiskInfo或smartctl -a确认底层盘类型,再用DD命令测试宿主机裸磁盘速度,宿主机本身速度不达标,虚拟机内做任何优化都白搭。
虚拟机放在移动硬盘或U盘里用会比内置硬盘慢很多吗?
差距非常大,USB 3.0移动硬盘顺序读写约400MB/s,但4K随机读写可能只有个位数MB/s,虚拟机系统启动和软件加载都依赖随机读写,卡顿是必然结果,建议至少把虚拟机文件放在内置SATA SSD或NVMe盘上,U盘只适合做PE启动盘,不适合当运行盘。
扩容虚拟磁盘后硬盘性能反而下降了,怎么回事?
动态扩展盘在扩容后,新增空间位于物理硬盘的不同区域,磁盘碎片加剧,随机读写性能会下降,此时虚拟机关机后,在宿主机上执行碎片整理工具,或把动态盘转换为固定盘,再开机进虚拟机系统内部做一次“碎片整理和优化驱动器”,特别注意,这一步在虚拟机内部做通常效果有限,关键还是要整理宿主机物理层。
优化虚拟机硬盘的性能,最有效的三件事永远是:换虚拟SCSI或VirtIO接口、把动态盘改成固定大小、把虚拟磁盘落到SSD上,这三步做完,绝大多数慢的问题已经解决,剩下的直通、多队列,都是压榨极限性能的加分项,按需取舍就好。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/626172.html





