Skip to main content

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=randreadrandwrite → 随机读/写

  • --numjobs=4 → 相当于 4 个线程(可根据 CPU 增加)

  • --iodepth=32 → 队列深度

  • --direct=1 → 绕过缓存,真实测试磁盘

  • --runtime=30 → 运行 30 秒

  • --group_reporting → 整合输出


🔥 测 IOPS 上限的最强命令(压榨到极限)

适用于 NVMe / RAID / SSD:

fio --name=max-iops --filename=/data/testfile --size=4G \
--rw=randread --bs=4k --numjobs=8 --iodepth=64 --direct=1 \
--time_based --runtime=60 --ioengine=libaio --group_reporting

适合直接看你的硬盘理论上限。


✨ 输出中重点看:

  • IOPS(最关键)

  • lat (usec) 平均延迟

  • clat 99%、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 命令,而是:

  1. 虚拟磁盘类型(VHD/VHDX)造成的性能损耗

  2. Hyper-V 控制器结构(虚拟化开销)

  3. 未启用 write-back cache / 未使用直通磁盘

  4. 宿主机物理磁盘性能也被虚拟化稀释

下面按实际能提升的方向给你完整方案。


📉 你的 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

你能直接看到宿主磁盘的全部性能。

配置方法:

  1. Hyper-V 管理器 → 选择虚拟机 → 设置

  2. SCSI 控制器 → 添加磁盘

  3. 选择 物理硬盘(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 测试方案

  • 帮你分析宿主机硬盘瓶颈

只需要你补充:

  1. 宿主机硬盘型号(例如 NVMe/SATA?)

  2. VHDX 类型(Fixed / Dynamic?)

  3. 存储方式(本地磁盘 / SAN / iSCSI?)

我可以立即给你个精准的优化建议。