Ubuntu 18.04 下测试硬盘 IOPS 上限的工具及hyper对iosp限制的优化
在 Ubuntu 18.04 下测试硬盘 IOPS 上限,最标准、准确的工具是:
✅ 首选:fio(Linux 官方推荐 I/O 压测工具)
Ubuntu18.04 自带 apt 包,可直接安装:
sudo apt-get update
sudo apt-get install fio
🚀 一条命令测试硬盘 IOPS 上限(随机 4K)
1)随机写 IOPS 上限(4K)
fio --name=4k-randwrite --filename=/data/testfile --size=2G \
--bs=4k --rw=randwrite --iodepth=32 --numjobs=4 --direct=1 --time_based \
--runtime=30 --group_reporting
2)随机读 IOPS 上限(4K)
fio --name=4k-randread --filename=/data/testfile --size=2G \
--bs=4k --rw=randread --iodepth=32 --numjobs=4 --direct=1 --time_based \
--runtime=30 --group_reporting
参数说明(关键):
-
--bs=4k→ 4K 块,测数据库最常用 IOPS -
--rw=randread或randwrite→ 随机读/写 -
--numjobs=4→ 相当于 4 个线程(可根据 CPU 增加) -
--iodepth=32→ 队列深度 -
--direct=1→ 绕过缓存,真实测试磁盘 -
--runtime=30→ 运行 30 秒 -
--group_reporting→ 整合输出
🔥 测 IOPS 上限的最强命令(压榨到极限)
适用于 NVMe / RAID / SSD:
fio --name=max-iops --filename=/data/home/testfile --size=4G \
--rw=randread --bs=4k --numjobs=8 --iodepth=64 --direct=1 \
--time_based --runtime=60 --ioengine=libaio --group_reporting
适合直接看你的硬盘理论上限。
✨ 输出中重点看:
-
IOPS(最关键)
-
lat (usec)平均延迟 -
clat99%、99.99% 延迟 -
bw(带宽)
🧪 附:连续写(顺序写)带宽测试
顺序写:
fio --name=seqwrite --filename=/data/testfile --size=4G \
--bs=1M --rw=write --direct=1 --runtime=30 --group_reporting
顺序读:
fio --name=seqread --filename=/data/testfile --size=4G \
--bs=1M --rw=read --direct=1 --runtime=30 --group_reporting
❗注意事项
-
测试前必须确保目录里有足够空间
-
测试会产生文件(测试后删除即可)
-
如果是生产服务器,请避免测试期间影响业务
-
--direct=1必须开启,否则测试的是缓存不是磁盘
如果你愿意
你可以把 fio 输出发给我,我能帮你分析:
✔ IOPS 是否正常
✔ 是否被 CPU / RAID / 控制器限制
✔ 能否进一步优化 IO 性能(比如调整 iodepth/numjobs)
随时发我即可。
下面根据你的 fio 测试结果、Hyper-V 架构特点、虚拟机磁盘类型 等,分析是否存在瓶颈、是否能“解除 Hyper-V 限制”,以及实际可优化点。
✅ 结论:你看到的 IOPS ≈ 17k,属于 Hyper-V 虚拟化下的典型瓶颈,确实可以继续优化,但无法完全突破虚拟层的结构限制。
IOPS 低的主要原因不是 fio 命令,而是:
-
虚拟磁盘类型(VHD/VHDX)造成的性能损耗
-
Hyper-V 控制器结构(虚拟化开销)
-
未启用 write-back cache / 未使用直通磁盘
-
宿主机物理磁盘性能也被虚拟化稀释
下面按实际能提升的方向给你完整方案。
📉 你的 fio IOPS(17K)说明的问题
read: IOPS=17.4k, BW=67.8MiB/s
99% 延迟 > 10ms,最大甚至 >1sec
磁盘利用率 util = 100%
这说明:
-
宿主机磁盘排队严重(in_queue=9393724)
-
虚拟磁盘队列深度被 Hyper-V 限制
-
I/O 上下文切换高、虚拟化开销大
即使你的宿主机 NVMe 能 300K~600K IOPS,虚机里一般只能看到 1万~3万 IOPS(典型值)。
你现在 17k 已经属于“典型 Hyper-V IOPS 区间”,不是异常。
🧨 能否解除 Hyper-V 对 IOPS 的限制?
⚠ 坦率说:"完全解除" 不可能。
但能通过多项优化 从 17K 提升到 50K~100K IOPS(甚至更高),取决于宿主 NVMe 性能。
🚀 Hyper-V 提升 IOPS 的实用优化方案(按提升幅度排序)
① 使用直通磁盘(Pass-through Disk)—— IOPS 提升幅度最大(2~10 倍)
如果你把虚拟机磁盘改成:
✔ 直通物理磁盘
✔ 直接映射 NVMe
你能直接看到宿主磁盘的全部性能。
配置方法:
-
Hyper-V 管理器 → 选择虚拟机 → 设置
-
SCSI 控制器 → 添加磁盘
-
选择 物理硬盘(Pass-Through Disk)
IOPS 能从 17k → 150k~300k+
② 使用固定大小 VHDX(Fixed VHDX)而不是动态磁盘(Dynamic VHDX)
动态扩展 VHDX 性能最差,会导致:
-
额外的元数据更新
-
写放大
-
队列阻塞
📈 固定大小 VHDX(Fixed-size VHDX)性能可提升 1.5~3倍
③ 启用 Write-Back Cache(主机与虚机都要打开)
在虚机存储控制器选择:
✔ “启用磁盘写缓存(Enable write caching)”
在 Windows 宿主机磁盘属性:
✔ “启用设备上的写缓存”
✔ “关闭 Windows 写缓存刷新策略”(慎用,有掉电风险)
📈 可提升 20–100% IOPS
④ 使用 SCSI 控制器(不要用 IDE)
你 fio 跑到 17k 说明可能已经是 SCSI。
如果你现在是 IDE → 立即换 SCSI:
✔ IDE = 单队列
✔ SCSI (VHBA) = 多队列并支持更大队列深度
⑤ 使用多虚拟磁盘 + 多 fio jobs
Hyper-V 单 VHDX 队列深度有限。
如果你:
-
增加 4 个 VHDX
-
每个还有自己的队列
-
fio 分别测试
IOPS 能翻倍甚至更多。
⑥ 宿主机 BIOS 打开 NVMe 的 ASPM + 高性能模式
BIOS 设置:
-
NVMe ASPM → off 或 L0s/L1 优化
-
PCIe Active State Power Management → off
-
CPU C-states → off
-
CPU performance → high performance
⑦ 虚拟机 OS 端优化 fio 参数
你用:
iodepth=64
numjobs=8
可以进一步调:
--iodepth=128 --numjobs=16 --ioengine=io_uring
如果内核支持 (uname -r 5.4+ 才有 io_uring)
io_uring IOPS 能比 libaio 高 20~200%
🧪 确认宿主机 NVMe 性能(关键)
你虚拟机里 17k IOPS 很可能是因为:
-
宿主机本身的磁盘性能一般(如 SATA SSD 只能 50k TPS)
👉 请在 Windows 宿主机测一下:
diskspd -c3G -d30 -r -w0 -b4K -o32 -t4 C:\test.dat
告诉我 host 的 IOPS,我能更准确判断瓶颈。
📌 你的结果说明什么?
-
高延迟(>30ms)
-
util = 100% 表示 I/O 阻塞
-
Hyper-V 队列被打满
-
在你的虚拟化配置下,17k 已经是正常水平
要真正突破到 100k+ IOPS,需要:
✔ 固定 VHDX / 直通磁盘
✔ Write-Back cache
✔ io_uring
✔ 多磁盘并行
📥 如果你愿意,我可以:
-
帮你写一个优化 Hyper-V 虚拟机磁盘性能的 完整调优脚本(含 PowerShell+Linux)
-
帮你设计 fio 的 最大 IOPS 测试方案
-
帮你分析宿主机硬盘瓶颈
只需要你补充:
-
宿主机硬盘型号(例如 NVMe/SATA?)
-
VHDX 类型(Fixed / Dynamic?)
-
存储方式(本地磁盘 / SAN / iSCSI?)
我可以立即给你个精准的优化建议。