FIO
1 简介
FIO---Flexible IO Tester:
是测试IOPS、吞吐量和延迟的非常简单易用的命令行工具。它可以通过设置不同的块大小和多线程并发来执行特定的IO操作,以此对磁盘和存储系统进行功能验证和压力测试。也可以通过配置文件管理。
2 使用方式
2.1 命令行直接执行
[root@docker test]# fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -runtime=60
2.2 保存到文件调用
fio_write.txt
[global]
name=rewrite
ioengine=libaio
exitall_on_error=1
invalidate=1
direct=1
allow_file_create=0
refill_buffers=1
bs=64k
rw=write
verify=crc32c
do_verify=1
group_reporting=1
iodepth_batch_submit=2
iodepth_low=16
iodepth=16
verify_header_extra_pattern=0XA3B917CC
rand_verify_seed=907
buffer_compress_percentage=85
dedupe_percentage=50
[/dev/sda]
filename=/dev/sda
size=5g
offset=0
numjobs=1
3 常用参数介绍
filename=/dev/sdb 测试文件名称,测试盘data目录
ioengine=libaio 指定IO引擎使用方式。libaio:Linux异步IO(a:async)
direct=1 是否使用directIO;绕过OS自带buffer,即不写缓存,直接读写磁盘
bs=4k 最重要的参数之一;指定IO数据块文件的大小
rw=randrw 最重要的参数之二;指定IO是随机读写;还是顺序读写;还是混合
iodepth=16 最重要的参数之三;队列的深度;是每个线程的队列深度;
如果iodepth=16;numjobs=10,总IO并发数是16*10=160
size=1G 指定每个线程读写文件的大小
runtime=1000 指定测试时长,单位为秒;如果不写则将指定size的文件按bs大小写完为止
numjobs=1 指定每个job(任务)用多少个线程
4 常见测试用例
4.1 顺序读写
fio -ioengine=libaio -bs=4k(8k,32k,256k,1mb) -direct=1 -thread -rw=read -filename=/dev/sda -name="read_test" -iodepth=16 -runtime=60
fio -ioengine=libaio -bs=4k(8k,32k,256k,1mb) -direct=1 -thread -rw=write -filename=/dev/sda -name="write_test" -iodepth=16 -runtime=60
4.2 随机读写
fio -ioengine=libaio -bs=4k(8k,32k,256k,1mb) -direct=1 -thread -rw=randread -filename=/dev/sda -name="randread_test" -iodepth=16 -runtime=60
fio -ioengine=libaio -bs=4k(8k,32k,256k,1mb) -direct=1 -thread -rw=randwrite -filename=/dev/sda -name="randw_test" -iodepth=16 -runtime=60
4.3 七读三写
4.3.1 七读三写顺序读写
fio -ioengine=libaio -bs=4k(8k,32k,256k,1mb) -direct=1 -thread -rw=rw -rwmixread=70 -rwmixwrite=30 -filename=/dev/sda -name="test" -iodepth=16 -runtime=60
4.3.2 七读三写随机读写
fio -ioengine=libaio -bs=4k(8k,32k,256k,1mb) -direct=1 -thread -rw=randrw -rwmixread=70 -rwmixedwrite=30 -filename=/dev/sda -name="test" -iodepth=16 -runtime=60
4.4 OLTP常见混合随机读写
数据库常见workload:8k文件大小,16个并发线程,随机7读3写
fio -ioengine=libaio -bs=8k -direct=1 -thread -rw=rw -rwmixread=70 -rwmixwrite=30 -filename=/dev/sda -name="read_test" -iodepth=32 -numjobs=16 -runtime=300
4.5 KIMI上的例子
一、fio 复杂场景 5 例(可直接落地)
| 场景 | 业务特征 | fio 关键参数示例 | 说明 |
|---|---|---|---|
| 1. OLTP 随机读写混合 | 小块、高并发、读写比 7:3 | `fio --name=oltp --ioengine=libaio --iodepth=32 --rw=randrw --rwmixread=70 --bs=8k --size=50G --numjobs=16 --runtime=300 --time_based --direct=1 --group_reporting` | 模拟 16 个并发线程,8 KB 随机 IO,MySQL/PostgreSQL 最常见 workload。 |
| 2. 大规模批量导入 | 顺序写、吞吐敏感 | `fio --name=load --ioengine=libaio --iodepth=64 --rw=write --bs=1m --size=500G --numjobs=4 --direct=1` | 测试 ETL/备份导入时的磁盘带宽极限。 |
| 3. 日志刷盘延迟 | 同步 + O_DIRECT、低延迟 | `fio --name=redo --ioengine=sync --fsync=1 --rw=randwrite --bs=4k --size=2G --numjobs=1 --thinktime=100us --thinktime_blocks=1` | 每次写 4 KB 后强制 fsync,评估 redo/ WAL 延迟。 |
| 4. 网络存储(iSCSI/NFS) | 网络抖动对 IO 的影响 | `fio --name=nfs --ioengine=libaio --iodepth=8 --rw=randread --bs=16k --size=10G --numjobs=4 --runtime=60 --time_based --group_reporting` | 在客户端挂载 NFS 后运行,观察带宽与 RTT 的关系。 |
| 5. NUMA/多核扩展性 | 多 job + CPU 亲和 | `fio --name=cpu_bind --ioengine=libaio --iodepth=16 --rw=randrw --bs=4k --size=20G --numjobs=8 --cpus_allowed=0-7 --group_reporting` | 评估跨 NUMA 节点对 NVMe 延迟的影响。 |
────────────────────
二、OLTP / 数据库场景下 fio 常用参数清单
| 参数类别 | 推荐值/范围 | 原因 |
|---|---|---|
| `--rw` | `randrw`(7:3 读写比) | 绝大多数 OLTP 都是读写混合。 |
| `--bs` | 4k – 16k | InnoDB 页 16 k,PostgreSQL 8 k;8 k 折中。 |
| `--iodepth` | 8 – 32 | NVMe/RAID 控制器并发高,机械盘 8 以内。 |
| `--numjobs` | CPU 核心数 × 0.5 – 1 | 模拟真实并发连接,又不把 CPU 跑满。 |
| `--size` | 大于内存 1.5 – 2 倍 | 避免 Page Cache 命中,测试真实磁盘 IO。 |
| `--direct=1` | 必须打开 | 跳过页缓存,模拟数据库 O_DIRECT。 |
| `--fsync` / `--fdatasync` | 每秒 1 次或每次 | 评估 redo/ WAL 刷盘延迟。 |
| `--time_based` + `--runtime` | 300 – 600 s | 足够长以观察稳态 IOPS 与尾延迟。 |
| `--group_reporting` | 打开 | 多线程后汇总输出,方便看总体指标。 |
参考:
官方文档:https://fio.readthedocs.io/en/latest/fio_doc.html
也欢迎大家点赞关注我的微信公众号:大滨读书健身(全网同名)
会分享读书、健身、投资等心得体会,人生除了代码还有生活!
3726

被折叠的 条评论
为什么被折叠?



