一、FIO 概念
FIO(Flexible I/O Tester)是一个开源、跨平台的高性能 I/O 存储测试工具,用于测量块设备或文件系统的 IOPS、吞吐量(带宽)和时延(延迟),支持随机/顺序读写、多线程并发及异步 I/O 引擎(如 libaio)。
二、参数介绍
|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|----|
| 参数 | 含义 | 必选 |
| --name=xxx | 测试任务名称 | |
| --numjobs=1 | 并发线程数 | ✔ |
| --iodepth=32 | IO 队列深度,SSD 常用 32/64,机械盘 1~4 | ✔ |
| --direct=1 | 绕过 OS PageCache,裸盘真实性能 | ✔ |
| --ioengine=libaio | Linux 异步 IO(最常用;内核≥5.1 可用io_uring) | ✔ |
| --sync=1 | 写完强制 fsync 落盘 | |
| --rw=randread | 读写策略,默认随机读,例如: 1. randwrite:随机写; 2. randread:随机读; 3. read:顺序读; 4. write:顺序写; 5. randrw:随机混合读写; 6. readwrite:顺序混合读写; 7. 70:30:7 读 3 写混合。 | ✔ |
| --rwmixread=70 | 当 rw=randrw或者readwrite时生效;默认读写各占50%; 1. --rwmixread与--rwmixwrite 互斥; 2. 若同时指定,FIO 以 --rwmixread 为准 | |
| --bs=4K | IO 块大小,默认使用 4k,例如: 1. --bs=4k,128k:表示读4k、写128k; 2. --bsrange=4k-1m:支持范围; 3. --bssplit=4k/50:128k/50:混合比。 | ✔ |
| --size=1G | 测试生成文件大小 | ✔ |
| --time_based | 完成所有指定大小的 I/O 后即停止,默认为0 | |
| --runtime | 读写测试的运行时长,默认 unset(即无限制),单位:秒 | |
| --directory=/path | 裸盘路径;测文件填 ./test.fio | ✔ |
说明:
- 建议 bs 为 512B 或 4K 的整数倍以避免对齐开销,现代存储设备(HDD/SSD)的物理扇区通常为 4K,而逻辑接口常兼容 512B 模式;未对齐的 I/O 会跨越物理扇区边界,触发"读-修改-写"循环,增大耗时。
- FIO 中 --time_based 的默认值为 0(禁用),--runtime 的默认值为无限(即不设限),测试在完成指定 I/O 量后自动结束。若未设置 --time_based=1,即使指定了 --runtime,FIO 仍会在 I/O 完成(如写满 --size 指定的空间)后立即退出,不会等待 runtime 到期。
- --time_based:默认 不启用(等价于 --time_based=0),表示测试在完成所有指定大小(--size 或文件/设备容量)的 I/O 后即停止;若启用(--time_based=1),则即使 I/O 完成,也会循环运行至 --runtime 时间结束。
- --runtime:默认 无限制(不设值时忽略),测试由 --size 或目标文件/设备容量决定结束时机;若显式设置(如 --runtime=60),则测试最多运行该时长,但仅当同时启用 --time_based 时才会强制跑满此时间。
- 严禁在系统盘 /dev/sda 执行写测试,会损坏系统!
- --rwmixread 是 FIO 中用于在混合读写模式(rw=randrw 或 rw=rw)下指定读操作所占百分比的参数,取值范围为 0 ~ 100,默认为 50。
三、使用方式
1、命令行
fio --name=Fio --numjobs=1 --iodepth=32 --direct=1 --ioengine=libaio --sync=1 --rw=randrw --rwmixread=60 --bs=4K --size=3G --time_based=0 --directory=/path/to/directory
2、Job 配置
单个配置
文件名:fio.ini,调用命令 fio fio.ini
global
ioengine=libaio
direct=1
iodepth=32
group_reporting
runtime=60
rand4k-read
rw=randread
bs=4k
numjobs=4
size=15G
filename=/data/test
批量配置
global
ioengine=libaio
direct=1
group_reporting
runtime=120
size=40G
filename=/mnt/fio.test
ssd_4k_r
rw=randread
bs=4k
iodepth=64
numjobs=8
ssd_4k_w
rw=randwrite
bs=4k
iodepth=64
numjobs=8
ssd_1M_seq
rw=readwrite
rwmixread=50
bs=1M
iodepth=16
numjobs=4
四、案例说明

测试场景:4K 随机混合读写(大约读 60%/ 写 40%),iodepth=32,direct=1,libaio
逐行逐句翻译 + 分析
Fio: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=32
g=0:任务组 IDrw=randrw:随机混合读写bs=4096B:读写块大小都是 4Kioengine=libaio:Linux 异步 IOiodepth=32:IO 队列深度 32
fio-3.7
- FIO 版本 3.7
Starting 1 process
- 启动 1 个进程 / 线程(numjobs=1)
Fio: Laying out IO file (1 file / 3072MiB)
- 创建测试文件:1 个文件,大小 3GB
Jobs: 1 (f=1): m(1)100.0%r=57.6MiB/s,w=38.0MiB/sr=14.7k,w=9732 IOPSeta 00m:00s
m(1):混合读写任务 1 个100%:测试完成- 读速度:57.6MB/s,写速度:38MB/s
- 读 IOPS:14.7k,写 IOPS:9.7k
- 已跑完,无剩余时间
Fio: (groupid=0, jobs=1): err= 0: pid=529013: Fri Jun 5 11:49:17 2026
- 任务组 0,1 个任务
err=0:无任何错误,测试完全正常- 进程 ID + 结束时间
读性能部分(READ)
read: IOPS=14.9k, BW=58.0MiB/s (60.9MB/s)(1842MiB/31738msec)
- 读:IOPS=14900
- 读带宽:58MB/s
- 31 秒读了 1842MB
slat (usec): min=3, max=3066, avg= 9.46, stdev=27.94
- 提交延迟 (发给内核):submission latency
- 平均 9.46 微秒,非常快
clat (usec): min=105, max=5899, avg=654.10, stdev=622.89
- 磁盘完成延迟(核心):completion latency
- 平均:654us = 0.65ms
- 最大 5.8ms(写影响导致波动变大)
- stdev=622:延迟抖动明显(因为混合读写)
lat (usec): min=121, max=5916, avg=663.79, stdev=622.80
- 总 IO 延迟 = 提交 + 完成:total latency
- 平均 0.66ms
clat percentiles (usec):
| 1.00th= 174, 5.00th= 217, 10.00th= 249, 20.00th= 302,
| 30.00th= 343, 40.00th= 383, 50.00th= 429, 60.00th= 474,
| 70.00th= 545, 80.00th= 734, 90.00th= 1565, 95.00th= 2311,
| 99.00th= 2802, 99.50th= 2933, 99.90th= 3228, 99.95th= 4359,
| 99.99th= 5342
- 读延迟百分位(关键)
- 50% 延迟 < 0.43ms
- 90% 延迟 < 1.56ms
- 99% 延迟 < 2.8ms
- 99.9% < 3.2ms
- 长尾延迟明显上升(混合读写正常现象)
bw ( KiB/s): min=55880, max=64656, per=99.96%, avg=59403.62, stdev=1402.59, samples=63
- 读带宽稳定,波动小
iops : min=13970, max=16164, avg=14850.89, stdev=350.64, samples=63
- 读 IOPS 稳定在 1.4 万左右
写性能部分(WRITE)
write: IOPS=9921, BW=38.8MiB/s (40.6MB/s)(1230MiB/31738msec)
- 写:IOPS=9921
- 写带宽:38.8MB/s
slat (usec): min=4, max=2896, avg=11.73, stdev=42.89
- 提交延迟,平均 11us,正常
clat (usec): min=250, max=19733, avg=2215.17, stdev=1142.32
- 写延迟(最重要)
- 平均:2215us = 2.2ms
- 最大:19.7ms
- stdev=1142:抖动非常大(典型混合读写特征)
lat (usec): min=260, max=19744, avg=2227.14, stdev=1142.51
- 写总延迟:平均 2.2ms
clat percentiles (usec):
| 1.00th= 685, 5.00th= 898, 10.00th= 1029, 20.00th= 1205,
| 30.00th= 1401, 40.00th= 1663, 50.00th= 1958, 60.00th= 2278,
| 70.00th= 2769, 80.00th= 3195, 90.00th= 3621, 95.00th= 4047,
| 99.00th= 5800, 99.50th= 6128, 99.90th= 6718, 99.95th= 8586,
| 99.99th=17433
- 写延迟百分位
- 50% < 1.95ms
- 90% < 3.6ms
- 99% < 5.8ms
- 99.9% < 6.7ms
- 99.99% < 17.4ms
- 写长尾延迟很高,这是混合读写下的正常表现
bw ( KiB/s): min=37704, max=41976, per=99.95%, avg=39665.22, stdev=808.87, samples=63
iops : min= 9426, max=10494, avg=9916.29, stdev=202.25, samples=63
- 写带宽 / IOPS 都很稳定
全局延迟统计
lat (usec) : 250=6.19%, 500=32.49%, 750=10.22%, 1000=5.20%
lat (msec) : 2=21.64%, 4=22.12%, 10=2.13%, 20=0.01%
- 延迟(latency)以微秒(microseconds)为单位的统计值
- 6.19% IO < 250us
- 32% < 500us
- 延迟(latency)以毫秒(milliseconds)为单位的统计值
- 21% 在 1~2ms
- 22% 在 2~4ms
- 2% 在 4~10ms
- 整体延迟中等
CPU & 上下文切换
cpu : usr=8.81%, sys=21.95%, ctx=149530, majf=0, minf=92
- 用户 CPU:8.8%
- 系统 CPU:21.9%
- 上下文切换 14 万(正常)
- 无主缺页异常,系统健康
IO 队列深度
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
- 队列深度一直跑满 32
- 压力完全打满,测试有效
submit : 0=0.0%, 4=100.0%
complete : 0=0.0%, 4=100.0%
- IO 提交 / 完成 都正常
issued rwts: total=471550,314882,0,0 short=0,0,0,0 dropped=0,0,0,0
- 总读 IO:47 万
- 总写 IO:31 万
- short=0,dropped=0:无丢失、无失败、无截断 IO,存储绝对健康
latency : target=0, window=0, percentile=100.00%, depth=32
- 无延迟限制,队列深度 32
最终运行状态
Run status group 0 (all jobs):
READ: bw=58.0MiB/s, io=1842MiB, run=31738msec
WRITE: bw=38.8MiB/s, io=1230MiB, run=31738msec
- 读:58MB/s
- 写:38.8MB/s
- 总耗时约 31 秒
磁盘利用率(关键)
dm-0: util=99.53%
sda: util=97.76%
- 磁盘利用率 97%~99%
- 说明测试已经跑满存储性能
- 结果真实有效
关键结论
- 混合读写比例 :大约 读 60% / 写 40%
- 读性能
- IOPS:1.49 万
- 平均延迟:0.65ms
- 99% 延迟:2.8ms → 良好
- 写性能
- IOPS:9921
- 平均延迟:2.2ms
- 99% 延迟:5.8ms → 中等,长尾偏高(混合读写正常)
- 整体
- 磁盘跑满
- 无 IO 错误
- 性能稳定
- 属于企业级 SSD / 高性能存储水平