存储测试工具FIO使用教程
存储测试工具—FIO
文章目录
前言
fio(Flexible I/O Tester) 是一款开源、跨平台的磁盘 I/O 性能测试工具,被广泛誉为“存储性能领域的瑞士军刀”
一、FIO是什么?
FIO(Flexible I/O Tester)是一款功能强大的开源 I/O 性能测试工具,它主要用来验证存储系统的性能。
通过模拟各种真实的负载场景,FIO 能够测量出存储设备的三大核心性能指标:
- IOPS (Input/Output Operations Per Second): 每秒读写次数,反映随机读写能力。
- 吞吐量 (Throughput/Bandwidth): 数据传输速率(如 MB/s),衡量顺序读写性能。 时延 (Latency):
I/O 操作的响应时间。
二、安装部署
1.快速部署-在线
CentOS/RHEL:安装命令:
sudo yum install fio -yUbuntu/Debian安装命令:
sudo apt update && sudo apt install fio -y
2.快速部署-离线
安装地址,可以根据不同镜像选择, 优先建议在线yum安装,可以避免很多依赖问题
链接: https://pkgs.org/download/fio
百度云 通过网盘分享的文件:fio-2.1.10.tar.gz
链接: https://pan.baidu.com/s/1Zmd20T1qpl9HjP0foYCihQ?pwd=8952
提取码: 8952
file fio-2.1.10.tar
tar -xvf fio-2.1.10.tar
cd fio-2.1.10
# fio 的旧版本通常不使用 ./configure 脚本,而是直接使用 make。
# 编译在源码目录下直接运行 make:
make
# 编译成功后,将二进制文件复制到系统路径:
sudo make install
3.验证安装
fio --version
二、使用步骤
1.参数说明
| 参数 | 含义 | 典型取值 | 避坑指南 |
|---|---|---|---|
| rw | I/O 模式 | read (顺序读), write (顺序写), randread (随机读), randrw (混合读写) | 测 SSD 极限性能常用 randread;测带宽常用 write。 |
| bs | 块大小 | 4k, 1M | 4k 是测试 IOPS 的标尺(模拟数据库);1M 是测带宽的标尺(模拟大文件拷贝)。 |
| iodepth | 队列深度 | 1, 32, 128 | 只有异步引擎(如 libaio)才有效。深度越大,并发压力越大,SSD 通常需要 32-128 才能跑满。 |
| numjobs | 并发线程数 | 1, 4, 8 | 模拟多用户同时操作。总并发数 ≈ numjobs × iodepth。可以参考lscpu获取逻辑核心数 |
| direct | 是否绕过缓存 | 1 (绕过), 0 (使用缓存) | 测试硬件真实性能必须设为 1,否则测的是内存速度。 |
2.使用场景
场景一:测试裸盘极限性能(最常用)
目标: 测试一块新挂载的数据盘(如 /dev/vdb)的 4K 随机读取 IOPS。
注意: 对裸盘(/dev/vdb)操作会清空数据,请确保盘是空的!
代码如下(示例):
fio --name=rand_read_test \
--ioengine=libaio \
--iodepth=32 \
--rw=randread \
--bs=4k \
--direct=1 \
--size=10G \
--numjobs=1 \
--filename=/dev/vdb \
--group_reporting
场景二:测试文件系统/目录性能(安全模式)
目标: 测试 /data 目录下的顺序写入带宽,不破坏磁盘数据。
fio --name=seq_write_test \
--ioengine=libaio \
--iodepth=64 \
--rw=write \
--bs=1M \
--direct=1 \
--size=5G \
--numjobs=4 \
--runtime=60 \
--time_based \
--filename=/data/testfile \
--group_reporting
场景三:模拟真实数据库负载
目标: 模拟 70% 读、30% 写的混合负载。
fio --name=mix_test \
--rw=randrw \
--rwmixread=70 \
--bs=4k \
--ioengine=libaio \
--direct=1 \
--size=10G \
--numjobs=2 \
--iodepth=16 \
--filename=./testdbfile \
--group_reporting
3.结果解读
test: (groupid=0, jobs=1): err= 0: pid=1009622: Fri Apr 3 11:09:39 2026
write: IOPS=40, BW=40.4MiB/s (42.4MB/s)(71.0GiB/1800002msec); 0 zone resets
slat (usec): min=278, max=109995, avg=24738.15, stdev=14921.46
clat (usec): min=834, max=4266.3k, avg=3140564.67, stdev=315007.80
lat (msec): min=2, max=4293, avg=3165.30, stdev=316.39
clat percentiles (msec):
| 1.00th=[ 2400], 5.00th=[ 2635], 10.00th=[ 2769], 20.00th=[ 2903],
| 30.00th=[ 2970], 40.00th=[ 3071], 50.00th=[ 3138], 60.00th=[ 3205],
| 70.00th=[ 3306], 80.00th=[ 3373], 90.00th=[ 3540], 95.00th=[ 3675],
| 99.00th=[ 3910], 99.50th=[ 3977], 99.90th=[ 4144], 99.95th=[ 4178],
| 99.99th=[ 4245]
bw ( KiB/s): min= 6144, max=102400, per=4.16%, avg=41407.70, stdev=8756.79, samples=3585
iops : min= 6, max= 100, avg=40.06, stdev= 8.54, samples=3585
lat (usec) : 1000=0.01%
lat (msec) : 4=0.01%, 100=0.01%, 250=0.01%, 500=0.01%, 750=0.02%
lat (msec) : 1000=0.01%, 2000=0.05%, >=2000=99.90%
cpu : usr=0.31%, sys=61.70%, ctx=40603, majf=0, minf=180694
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=99.9%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1%
issued rwts: total=0,72731,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=128
Run status group 0 (all jobs):
WRITE: bw=973MiB/s (1020MB/s), 40.3MiB/s-40.8MiB/s (42.3MB/s-42.8MB/s), io=1710GiB (1836GB), run=1800002-1800028msec
FIO 输出的一大堆数据,重点看这三行:
**read/write: IOPS=xxxx**
含义: 每秒处理多少次 I/O 请求。
关注点: 4K 随机读写时,这个数值最重要。数值越大,磁盘处理细碎文件的能力越强。
**bw=xxxx MiB/s**
含义: 带宽/吞吐量。
关注点: 1M 顺序读写时,关注这个数值。它代表大文件拷贝的速度。
**lat (usec/msec)**
含义: 延迟。
关注点: avg 是平均延迟,max 是最大延迟。对于数据库应用,延迟越低越好(通常要求毫秒级甚至微秒级)。
四、拓展知识
1.配置文件与多任务
当参数太多,命令行敲不下时,大神都会写配置文件(例如 test.fio)。
- 编写配置文件
创建一个 test.fio 文件
此处vXX代替实际盘符,谨慎写盘符,避免擦除用户数据
[global]
ioengine=libaio
direct=1
runtime=60
time_based
group_reporting
# 任务1:测随机读
[rand_read]
rw=randread
bs=4k
iodepth=32
filename=/dev/vXX
# 任务2:测顺序写
[seq_write]
rw=write
bs=1M
iodepth=16
filename=/dev/vXX
执行命令
fio test.fio
这样就能同时测试两块盘,或者同一个盘的不同性能指标。
2.AIO 与 DIO 的区别
AIO 和 DIO 是两个不同层面的概念,但在 FIO 测试中紧密相关。
AIO (Asynchronous I/O - 异步I/O):
这是一种 I/O 模型。使用 AIO 时,应用程序发出 I/O 请求后会立即返回,继续执行其他任务,而无需等待 I/O 操作完成。操作系统会在后台处理这些请求,并在完成后通知应用程序。这使得应用程序可以并发地处理大量 I/O 操作,极大地提升了效率。在 FIO 中,通过 ioengine=libaio 来使用 Linux 的异步 I/O 引擎。
DIO (Direct I/O - 直接I/O):
这是一种 I/O 访问方式。通常情况下,对文件的读写会经过操作系统的 Page Cache(页缓存)。DIO 则会绕过这个缓存层,直接在应用程序缓冲区和存储设备之间传输数据。
目的: 测试 DIO 的主要目的是为了绕过操作系统缓存,直接测量存储设备本身的真实性能,避免缓存对测试结果的干扰。
实现: 在 FIO 中,通过设置 direct=1 来启用直接 I/O。
简单来说,AIO 决定了“怎么发请求”(异步地、不等待),而 DIO 决定了“数据走哪条路”(绕过缓存、直达磁盘)。一个完整的性能测试通常会结合两者,即使用异步 I/O 引擎进行直接 I/O 测试。
1. 测试 DIO (Direct I/O) 性能
这条命令旨在测试绕过系统缓存后,存储设备本身的性能。这是进行存储基准测试时的标准做法。
fio -name=test \
-filename=/mnt/volume1/dio \
-ioengine=libaio \
-direct=1 \
-bs=1m \
-iodepth=128 \
-rw=write \
-numjobs=8 \
-runtime=100000 \
-time_based \
-size=200GB
- List item核心参数: direct=1 启用了直接 I/O。
- 测试目的: 测量存储设备在 1MB 块大小、128 队列深度、8 个并发线程下的顺序写入吞吐量。
2. 测试 Buffered I/O (缓存I/O) 性能
“aio” 实际上是测试 Buffered I/O 的性能。因为它缺少了 direct=1 参数,所以 I/O 会经过操作系统的 Page Cache。
fio -name=test \
-filename=/mnt/volume1/aio \
-ioengine=libaio \
-direct=0 \
-bs=1m \
-iodepth=128 \
-rw=write \
-numjobs=8 \
-runtime=100000 \
-time_based \
-size=200GB
- 添加了 -direct=0 以明确这是 Buffered I/O 测试。
- 测试目的: 这种测试衡量的是应用程序在实际运行中可能体验到的性能,因为它包含了操作系统缓存带来的加速效果。对于读操作,如果数据能被缓存,性能会非常高。
参数解读:
bs=1m: 1MB 的块大小通常用于测试顺序读写的吞吐量。
iodepth=128: 较大的队列深度用于向存储设备施加足够压力,以测出其峰值性能。
numjobs=8: 模拟多线程并发访问的场景。
runtime 和 time_based: 确保测试运行足够长的时间以获得稳定的结果。
重要提醒⚠️
1. 数据安全红线:
如果 filename 指向的是裸设备(如 /dev/sdb),FIO 会直接覆盖数据,没有任何回收站!
测试前务必执行 lsblk 确认盘符,确保没有挂载重要数据。
2. 缓存陷阱:
一定要加 –direct=1。如果不加,你测出来的速度可能是几百 GB/s,那是你的内存速度,不是硬盘速度。
3. 时间陷阱:
测试时间不要太短。建议至少跑 60 秒以上,让 SSD 的控制器进入稳定状态。
4. IO 引擎选择:
Linux 下首选 ioengine=libaio(异步)。如果测延迟极低的情况,可以用 ioengine=sync(同步)。
总结
以上就是今天要分享的内容,本文仅仅简单介绍了FIO的使用,工具还有更多使用方法可以探索,欢迎大家一起学习交流~~~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)