存储常用测试工具(一)--- FIO

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

也欢迎大家点赞关注我的微信公众号:大滨读书健身(全网同名)

会分享读书、健身、投资等心得体会,人生除了代码还有生活!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值