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 命令,而是:

    虚拟磁盘类型(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?)

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