fio测磁盘真实IOPS需-direct=1绕缓存,numjobs×iodepth协同调并发,按业务选rw/bs(如数据库用randrw+8k),结果只看iops、bw和clat 99%值。

直接用 fio 模拟真实随机访问压力,重点配好 numjobs、iodepth 和 bs,绕过缓存并启用异步 IO,才能打到存储真正的随机读写 IOPS 极限。
必须绕开系统缓存,测纯磁盘能力
fio 默认会走 page cache,结果反映的是内存速度而非磁盘性能。必须加参数:
- -direct=1:强制绕过内核页缓存,数据直通设备层
- 不加这个,哪怕跑出 50 万 IOPS,也只是在测内存带宽
并发深度要协同设置,不能只调单个参数
随机 IOPS 极限取决于“并发请求数”,它由两个参数共同决定:
- -numjobs=N:启动 N 个独立 IO 进程(不是线程)
- -iodepth=M:每个进程维持 M 个未完成请求(即队列深度)
- 真实并发路数 = N × M。例如 numjobs=32 iodepth=64 → 2048 路并发
- 只增 numjobs 不调 iodepth,或反之,都压不出 SSD/NVMe 的真实潜力
按场景选对 IO 模式和块大小
随机读写测试不是“随便 randread 就行”,关键匹配业务特征:
- 数据库类负载:用 -rw=randrw -rwmixread=70 -bs=8k(如 PostgreSQL 默认页面大小)
- 小文件元数据密集型:用 -rw=randread -bs=4k,搭配高 iodepth(≥32)
- 避免伪随机:加 -norandommap,防止反复打同一片 LBA 区域,让压力更均匀
结果里只盯这三个数字
fio 输出信息繁杂,真正决定 IOPS 极限的只有三行:
- bw=xxx KiB/s → 换算成 MB/s(÷1024),是吞吐量上限
- iops=xxx → 直接就是每秒操作次数,即 IOPS 极限值
- clat avg=xxx μs → 平均完成延迟;再看 clat 99% 值,若远高于 avg(比如高 5 倍以上),说明存在长尾抖动,IOPS 可能不可靠


















