本帖最后由 郑全 于 2026-7-19 11:41 编辑
新上系统时,我们一定听说过存储压测,有些厂家有自己得压测工具,有一些没有。其实,业界有一个标准得压测工具,那就是FIO,不管对方是否提供,我们可以使用 FIO来测试。下面我们来看看这个FIO的标准流程:
fio :Flexible I/O Tester
一、简介
fio 是业界标准磁盘 / 块设备 IO 压测工具,用来测 SSD/HDD、云盘、存储阵列的 IOPS、带宽、读写延迟,模拟数据库、日志、大文件、随机小 IO 等真实业务负载,Linux/Windows/macOS 全平台支持。
适用场景
- 数据库:4K/8K 随机读写(OLTP,看 IOPS)
- 日志存储:128K/1M 顺序读写(看带宽)
- 对象存储 / 缓存:混合随机读写
- 存储硬件选型、云盘性能验收、IO 调优
二、安装
CentOS/RHEL
yum install fio libaio-devel -y
Debian/Ubuntu
apt install fio libaio-dev -y
验证
fio --version
三、核心参数大全基础通用| 参数 | 含义 | 常用值 | | --name=xxx | 测试任务名称 | rand4k、seq128k | | --filename=/xxx | 测试目标(文件 / 裸盘 | /mnt/test/fio.tmp 或 /dev/vdb | | --direct=1 | 绕过 OS PageCache,测真实硬件性能(必加) | 1 | | --ioengine=libaio | Linux 异步 IO 引擎(数据库标准) | libaio | | --bs=4k | 单次 IO 块大小 | 4k (数据库)、128k (顺序日志)、1M (大文件) | | --size=10G | 总测试数据量(大于内存防缓存) | 8G/10G/20G | | --runtime=60 | 测试时长(秒) | 60/120 | | --time_based | 按时间跑,而非写完 size 就停 | 必加 | | --group_reporting | 合并所有线程输出汇总结果 | 必加 |
IO 负载模式 --rw=
- read:顺序读
- write:顺序写
- randread:随机读(数据库查询)
- randwrite:随机写(数据库更新)
- randrw:混合随机读写;--rwmixread=70 读 70% 写 30%
- rw:顺序混合读写
并发与队列深度
- --iodepth=32:单线程 IO 队列深度(异步 libaio 生效)
- --numjobs=4:并发线程数
- 总并发 IO 队列 ≈ numjobs × iodepth
四、高频实战命令
安全提示:不要直接 --filename=/dev/sda(系统盘会销毁数据),优先用挂载目录下的测试文件。
1)数据库场景:4K 随机读(看读 IOPS)
fio --name=4k_randread \
--filename=/data/fio.test \--direct=1 \
--ioengine=libaio \
--bs=4k \
--rw=randread \
--iodepth=32 \
--numjobs=4 \
--size=10G \
--runtime=60 \
--time_based \
--group_reporting
2)数据库:4K 随机写(写 IOPS)
fio --name=4k_randwrite \
--filename=/data/fio.test \
--direct=1 \
--ioengine=libaio \
--bs=4k \
--rw=randwrite \
--iodepth=32 \
--numjobs=4 \
--size=10G \
--runtime=60 \
--time_based \
--group_reporting
3)日志 / 归档:128K 顺序写(测带宽 MB/s)
fio --name=128k_seq_write \
--filename=/data/fio.test \
--direct=1 \
--ioengine=libaio \
--bs=128k \
--rw=write \
--iodepth=128 \
--numjobs=1 \
--size=10G \
--runtime=60 \
--time_based \
--group_reporting
4)混合 7:3 随机读写(线上业务模拟)
fio --name=randrw_70r30w \
--filename=/data/fio.test \
--direct=1 \
--ioengine=libaio \
--bs=8k \
--rw=randrw \
--rwmixread=70 \
--iodepth=32 \
--numjobs=4 \
--size=10G \
--runtime=60 \
--time_based \
--group_reporting
五、输出结果关键字段解读
read: IOPS=15600, BW=60.9MiB/s (63.9MB/s)(3654MiB/60sec)
write: IOPS=4200, BW=16.4MiB/s (17.2MB/s)(986MiB/60sec)
lat (usec): min=80, max=4200, avg=245, stdev=186
- IOPS:每秒读写次数(数据库核心指标,4K 随机越高越好)
- BW:带宽(顺序场景看这个,单位 MiB/s)
- lat 延迟(微秒 us)
- avg:平均延迟
- max:尾延迟(数据库最怕高尾延迟)
- slat:提交延迟;clat:设备完成延迟;lat = slat+clat
六、Job 配置文件
新建 fio-test.conf
[global]
direct=1
ioengine=libaio
size=10G
runtime=60
time_based
group_reporting
filename=/data/fio.test
[4k-rand-read]
bs=4k
rw=randread
iodepth=32
numjobs=4
[4k-rand-write]
bs=4k
rw=randwrite
iodepth=32
numjobs=4
运行全部任务:
fio fio-test.conf
|