# Ubuntu 18.04 下测试硬盘 IOPS 上限的工具及hyper对iosp限制的优化

在 **Ubuntu 18.04** 下测试硬盘 **IOPS 上限**，最标准、准确的工具是：

# ✅ **首选：fio（Linux 官方推荐 I/O 压测工具）**

Ubuntu18.04 自带 apt 包，可直接安装：

```bash
sudo apt-get update
sudo apt-get install fio

```

---

# 🚀 **一条命令测试硬盘 IOPS 上限（随机 4K）**

## **1）随机写 IOPS 上限（4K）**

```bash
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）**

```bash
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：

```bash
# 随机读 4k极限测试
fio --name=max-iops --filename=/home/testfile --size=4G \
--rw=randread --bs=4k --numjobs=8 --iodepth=64 --direct=1 \
--time_based --runtime=60 --ioengine=libaio --group_reporting

# 随机读 减少并发，更适合HDD
fio --name=test --filename=/home/testfile --size=4G \
    --rw=randread --bs=64k --numjobs=4 --iodepth=16 \
    --direct=1 --runtime=60 --ioengine=libaio --group_reporting

# 随机写 更接近 MySQL / 日志型业务
fio --name=real-write \
--filename=/home/testfile \
--size=10G \
--rw=randwrite \
--bs=4k \
--numjobs=4 \
--iodepth=16 \
--direct=1 \
--time_based \
--runtime=60 \
--ioengine=libaio \
--group_reporting
```

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

---

# ✨ 输出中重点看：

- **IOPS**（最关键）
- `lat (usec)` 平均延迟
- `clat` 99%、99.99% 延迟
- `bw`（带宽）

---

# 🧪 **附：连续写（顺序写）带宽测试**

顺序写：

```bash
fio --name=seqwrite --filename=/data/testfile --size=4G \
--bs=1M --rw=write --direct=1 --runtime=30 --group_reporting

```

顺序读：

```bash
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，我能更准确判断瓶颈。

---

# 📌 **你的结果说明什么？**

- 高延迟（&gt;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？）

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