Hyper-V 解除IOPS限制的方法
下面是对你这段 iostat -x 输出的深入分析,以及 是否可以解除 Hyper-V 限制 的结论。
✅ 一、iostat 输出说明了什么?
从多次采样来看,关键指标如下:
| 指标 | 数值 | 说明 |
|---|---|---|
| w/s | 430~460 次/s | 写操作 QPS,很低 |
| wkB/s | 4300~5900 KB/s(≈4–6 MB/s) | 吞吐量极低 |
| svctm | 2.0~2.3 ms | 单次 IO 服务时间偏慢 |
| await | 2.3~2.8 ms | IO 等待时间偏慢 |
| %util | 90%~99% | 磁盘已跑满(队列挤爆) |
| aqu-sz | 1.0~1.2 | 队列排队明显 |
| wrqm/s | 500~580 | 合并写非常多 → 超过 50% |
✔ 结论:你的磁盘(虚拟磁盘)读写能力极弱,被 Hyper-V 虚拟化能力完全限制住了
因为:
-
物理 SSD 最起码应该能提供几十万 IOPS(NVMe)或至少 5k–10k IOPS(SATA SSD)
但你这里只能跑到 ~450 IO/s(写),属于 机械硬盘都嫌丢人的速度。 -
util 达到 90%~99% → 表示 磁盘队列已经满了,磁盘瓶颈已出现。
-
Hyper-V 默认给虚拟机的磁盘 严重受限(存储 QoS 默认值、虚拟磁盘类型、控制器类型等)。
⚠ 这不是 fio 的问题,而是 Hyper-V 层限制虚拟机磁盘性能
✅ 二、为什么 fio 测试只有 17k IOPS,而 iostat 中只有 450 IOPS?
因为:
fio 测的是 随机读 IOPS
→ Hyper-V 读缓存 影响非常大
iostat 测的是 真实落盘写 IOPS
→ Hyper-V 关闭写缓存(默认)+ VHDX 文件 + virtual SCSI 单队列
→ 写性能极差
读(fio)与写(iostat)完全不是同一类型 I/O,不会表现一致。
🚫 三、是否可以解除 Hyper-V 限制?— 可以!
下面给你完整的解锁方案,从影响最大到最小排序。
⭐ 方案 1:关闭 Hyper-V 存储 QoS 限制(最重要)
检查当前限制:
Get-VM | Get-VMHardDiskDrive | Get-StorageQoSFlow
如果看到 I/O Read/Write Limit(如 500 IOPS),说明被限速了。
关闭限速:
Set-VMHardDiskDrive -VMName "YourVM" -ControllerType SCSI -QoSPolicyID $null
⭐ 方案 2:使用固定大小 VHDX(Fixed VHDX)
千万不要用动态扩展的 VHDX(Dynamic),会严重影响 IOPS
查看 VHD 类型:
Get-VHD -Path "D:\VM\xxx.vhdx"
如果是 Dynamic → 性能差
转换为 Fixed:
Convert-VHD -Path "xxx.vhdx" -DestinationPath "xxx-fixed.vhdx" -VHDType Fixed
⭐ 方案 3:使用 NVMe 直通(如果物理机支持)
Hyper-V 支持 “PCIe Pass-through(DDA)”,可直通 NVMe 到虚拟机
性能 = 物理盘性能 × 100%
⭐ 方案 4:给虚拟机磁盘启用写缓存
Set-VMHardDiskDrive -VMName VMName -DiskNumber X -SupportPersistentReservations $True
宿主机设备管理器中:
存储控制器 → 属性 → 策略
✔ 勾选 启用写缓存
⭐ 方案 5:使用 SCSI 控制器而不是 IDE
Hyper-V 建议:
-
IDE:仅用于引导盘(性能差)
-
SCSI:用于数据盘(多队列支持更好)
⭐ 方案 6:提高虚拟机队列深度
在 VM 中:
echo 1024 | sudo tee /sys/block/sdb/queue/nr_requests
⭐ 方案 7:把 VHD 放在独立 NVMe 或 RAID10 上
如果 VHD 在 SATA 盘或 NAS 上 → 性能必然差
🧪 四、判断 Hyper-V 是否仍然限制的方法
运行:
fio --name=readtest --filename=/dev/sdb --rw=randread --bs=4k --iodepth=64 --numjobs=4 --runtime=10 --ioengine=libaio --direct=1
如果 IOPS < 50k(NVMe)或 < 8k(SATA SSD) → 仍然存在虚拟化限制
📌 五、你的情况总结
你的真实表现:
● fio 随机读:17k IOPS
可以,但偏低(NVMe 应 300k+)
● iostat 实际写入:460 IOPS
极低 → 大概率原因:
-
虚拟磁盘为 动态 VHDX
-
Hyper-V 存储 QoS 默认限速
-
宿主写缓存被禁用
-
虚拟磁盘挂在 IDE 控制器上
✅ 我可以根据你的 Hyper-V 配置(VM 设置截图 或 Get-VHD 输出)为你制定解除限速的精准方案。
如果方便,请贴出:
Get-VHD -Path yourdisk.vhdx
Get-VMHardDiskDrive -VMName YourVM
Get-StorageQoSFlow
我可以直接告诉你哪一项限制了性能、如何解除。