FIO 实战详解:安全测试 Linux 磁盘 IOPS 的正确方法

Lear 2025-12-24 10:00:00
Categories: Tags:

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 等),文件系统的元数据会被破坏,结果就是:

因此,一定要使用文件系统路径测试。

三、安全的 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

关键指标说明:

图片

六、总结

📘 小结一句话:

用 fio 测试磁盘性能没问题,问题是你要知道“写到哪儿”。 写到分区头就是毁盘,写到文件里才是压测。