FIO 实战详解:安全测试 Linux 磁盘 IOPS 的正确方法
在性能测试中,磁盘 IOPS(Input/Output Operations Per Second) 是衡量存储系统性能的重要指标。 但很多人拿到 fio 命令后就直接对 /dev/sdX 开始“无脑测试”,结果数据全毁、分区损坏、系统宕机。
本文将系统讲解 fio 的正确使用方式,以及 如何安全地测试磁盘性能。
一、fio 简介
fio(Flexible I/O Tester) 是 Linux 下最常用的磁盘性能测试工具,支持多线程、多种 I/O 模式(顺序、随机、混合)和多种 I/O 引擎。 它既能测试裸盘性能,也能测试挂载后的文件系统性能。
但这两种模式的风险完全不同:

结论:除非你明确知道自己在做什么,否则不要用 fio 测试裸盘或带文件的分区。
二、fio 为什么会“毁盘”?
例如以下命令:
fio -filename=/dev/sdb1 -rw=randwrite -bs=4k -size=10G -ioengine=libaio -direct=1 -name=test
这条命令会从 sdb1 的第一个扇区 开始随机写入数据,直接覆盖原有内容。
执行后的文件系统展示如下(df -h),如果存有重要数据,我想你应该是崩溃的:

如果该分区已有文件系统(ext4、xfs 等),文件系统的元数据会被破坏,结果就是:
- 分区无法挂载;
- 文件系统损坏;
- 实例宕机或进入紧急修复模式;
- 容量显示异常(例如“64Z”)。
因此,一定要使用文件系统路径测试。
三、安全的 fio 测试方式
1、安装 fio
# 推荐直接使用 yum 安装
yum install -y fio libaio-devel
或手动安装:
wget http://brick.kernel.dk/snaps/fio-2.2.10.tar.gz
tar -zxvf fio-2.2.10.tar.gz
cd fio-2.2.10
make && make install
2、编写测试配置文件
新建一个配置文件 fio.conf(示例):
[global]
ioengine=libaio
direct=1
thread=1
norandommap=1
randrepeat=0
runtime=60
ramp_time=6
size=1g
directory=/data2 # 修改为测试硬盘挂载目录
[read4k-rand]
stonewall
group_reporting
bs=4k
rw=randread
numjobs=8
iodepth=32
[read64k-seq]
stonewall
group_reporting
bs=64k
rw=read
numjobs=4
iodepth=8
[write4k-rand]
stonewall
group_reporting
bs=4k
rw=randwrite
numjobs=2
iodepth=4
[write64k-seq]
stonewall
group_reporting
bs=64k
rw=write
numjobs=2
iodepth=4
执行测试:
fio fio.conf
这样 fio 会在 /data2 下自动生成测试文件,测试结束后可删除,不会破坏现有系统。
四、常见手动测试命令
若需快速压测,可使用以下示例命令:
# 顺序读
fio -filename=/mnt/data/testfile -direct=1 -iodepth=1 -thread -rw=read \
-ioengine=psync -bs=16k -size=10G -numjobs=4 -runtime=60 -group_reporting -name=seq-read
# 顺序写
fio -filename=/mnt/data/testfile -direct=1 -iodepth=1 -thread -rw=write \
-ioengine=psync -bs=16k -size=10G -numjobs=4 -runtime=60 -group_reporting -name=seq-write
# 随机读
fio -filename=/mnt/data/testfile -direct=1 -iodepth=1 -thread -rw=randread \
-ioengine=psync -bs=4k -size=10G -numjobs=4 -runtime=60 -group_reporting -name=rand-read
# 随机写
fio -filename=/mnt/data/testfile -direct=1 -iodepth=1 -thread -rw=randwrite \
-ioengine=psync -bs=4k -size=10G -numjobs=4 -runtime=60 -group_reporting -name=rand-write
# 混合随机读写(70%读 / 30%写)
fio -filename=/mnt/data/testfile -direct=1 -iodepth=1 -thread -rw=randrw -rwmixread=70 \
-ioengine=psync -bs=4k -size=10G -numjobs=4 -runtime=60 -group_reporting -name=randrw
✅ 注意:filename 必须指向挂载点内的测试文件或目录,不要直接写 /dev/sdX。
五、结果解读
测试结束后,fio 会输出如下信息:
IOPS=54123, BW=211MiB/s, Latency=1.23ms
关键指标说明:

六、总结
- 不要直接对 /dev/sdX 执行 fio 测试,那是“物理毁灭”级操作;
- 推荐在挂载目录内测试,fio 会自动生成并删除测试文件;
- 对比不同存储介质(SATA SSD、NVMe、RAID、云盘)性能时,务必保持同样的配置参数;
- 最后测试完记得 rm -f testfile 清理文件。
📘 小结一句话:
用 fio 测试磁盘性能没问题,问题是你要知道“写到哪儿”。 写到分区头就是毁盘,写到文件里才是压测。