TECH

Fio 磁盘性能测试指南

从安装到实战,全面讲解 fio 测试磁盘 IOPS、吞吐量、延迟的方法,包含 NVMe / SSD / HDD 测试参数与结果解读。

#fio#Linux#磁盘测试#IOPS#运维

Fio 磁盘性能测试指南#

适用环境:Linux (Ubuntu / CentOS / Debian) / fio 3.x 编写日期:2026-07-08 适用场景:SSD / NVMe / HDD 性能评估、云盘选型、存储压测


0. 为什么用 fio#

fio (Flexible I/O Tester) 是业界标准的磁盘性能测试工具,原因:

  • 灵活:支持十几引擎,参数可任意组合
  • 准确:直接调用 libaio / io_uring,绕过缓存干扰
  • 通用:Linux / Windows / macOS 全平台
  • 权威:云厂商(AWS / 阿里云 / 腾讯云)官方测试均用 fio

常见误区:用 dd 测磁盘。dd 只能测顺序写,且受 page cache 影响极大,结果偏差严重。专业测试请用 fio。


1. 安装#

Ubuntu / Debian#

sudo apt update && sudo apt install -y fio

CentOS / RHEL#

sudo yum install -y fio
# 或
sudo dnf install -y fio

源码编译(需要最新版时)#

git clone https://github.com/axboe/fio.git
cd fio
./configure
make -j$(nproc)
sudo make install

验证#

fio --version
# fio-3.36

2. 核心概念#

测试前必须理解这几个概念,否则结果会误读。

概念说明
IOPS每秒 I/O 次数,衡量小文件 / 随机读写能力
吞吐量 (Throughput)每秒传输数据量 (MB/s),衡量大文件 / 顺序读写能力
延迟 (Latency)单次 I/O 响应时间 (μs / ms),衡量响应速度
队列深度 (iodepth)同时提交的 I/O 请求数,高并发场景需调大
numjobs并发线程数,模拟多进程负载
direct=1绕过 page cache,直接读写磁盘(测试真实性能必须开启)

3. 基础测试#

3.1 顺序读写(测吞吐量)#

测大文件传输、备份场景的吞吐能力。

# 顺序写
fio --name=seq-write \
    --filename=/data/fio-test \
    --rw=write \
    --bs=1M \
    --size=10G \
    --direct=1 \
    --numjobs=1 \
    --iodepth=1 \
    --group_reporting

# 顺序读
fio --name=seq-read \
    --filename=/data/fio-test \
    --rw=read \
    --bs=1M \
    --size=10G \
    --direct=1 \
    --numjobs=1 \
    --iodepth=1 \
    --group_reporting

参数解释

  • --bs=1M:块大小 1MB(大块 → 高吞吐)
  • --size=10G:测试文件 10GB
  • --direct=1:绕过缓存,测真实磁盘性能
  • --group_reporting:多 job 时汇总输出

3.2 随机读写(测 IOPS)#

测数据库、小文件场景的 IOPS。

# 随机写
fio --name=rand-write \
    --filename=/data/fio-test \
    --rw=randwrite \
    --bs=4k \
    --size=10G \
    --direct=1 \
    --numjobs=1 \
    --iodepth=32 \
    --group_reporting

# 随机读
fio --name=rand-read \
    --filename=/data/fio-test \
    --rw=randread \
    --bs=4k \
    --size=10G \
    --direct=1 \
    --numjobs=1 \
    --iodepth=32 \
    --group_reporting

参数解释

  • --bs=4k:块大小 4KB(小块 → 测 IOPS)
  • --iodepth=32:队列深度 32,让磁盘满负载
  • --rw=randwrite/randread:随机读写

3.3 混合读写(模拟真实负载)#

实际业务多为读写混合(如数据库 70% 读 + 30% 写)。

fio --name=mixed \
    --filename=/data/fio-test \
    --rw=randrw \
    --rwmixread=70 \
    --bs=4k \
    --size=10G \
    --direct=1 \
    --numjobs=4 \
    --iodepth=32 \
    --group_reporting

参数解释

  • --rwmixread=70:读占比 70%
  • --numjobs=4:4 个并发线程

4. 进阶配置#

4.1 使用配置文件#

命令行参数太多时,用 job 文件更清晰。

创建 fio-test.fio

[global]
ioengine=libaio
direct=1
group_reporting
time_based
runtime=60

[random-write]
filename=/data/fio-test
rw=randwrite
bs=4k
size=10G
numjobs=4
iodepth=32

[random-read]
filename=/data/fio-test
rw=randread
bs=4k
size=10G
numjobs=4
iodepth=32

执行:

fio fio-test.fio

4.2 测试延迟#

关注 clat (completion latency) 字段:

fio --name=lat-test \
    --filename=/data/fio-test \
    --rw=randread \
    --bs=4k \
    --size=10G \
    --direct=1 \
    --numjobs=1 \
    --iodepth=1 \
    --group_reporting

iodepth=1 时测出的就是单次 I/O 延迟。

4.3 io_uring 引擎(Linux 5.1+)#

新版 Linux 推荐用 io_uring,性能比 libaio 更好:

fio --name=io-uring-test \
    --filename=/data/fio-test \
    --rw=randread \
    --bs=4k \
    --size=10G \
    --direct=1 \
    --ioengine=io_uring \
    --numjobs=4 \
    --iodepth=32 \
    --group_reporting

5. 结果解读#

fio 输出较长,关注以下几个关键行:

rand-write: (groupid=0, jobs=4): err= 0: pid=12345: Mon Jul  8 10:00:00 2026
  write: IOPS=85.2k, BW=332MiB/s (349MB/s)(19.0GiB/60010msec)
    slat (usec): min=2, max=4567, avg= 5.23, stdev= 3.12
    clat (usec): min=120, max=89234, avg=1456.78, stdev=823.45
     lat (usec): min=125, max=89240, avg=1462.01, stdev=823.56
    clat percentiles (usec):
     |  1.00th=[  832],  5.00th=[  968], 10.00th=[ 1064], 20.00th=[ 1208],
     | 30.00th=[ 1304], 40.00th=[ 1384], 50.00th=[ 1456], 60.00th=[ 1544],
     | 70.00th=[ 1640], 80.00th=[ 1752], 90.00th=[ 1928], 95.00th=[ 2128],
     | 99.00th=[ 3120], 99.50th=[ 3728], 99.90th=[ 7488], 99.95th=[ 9888],
     | 99.99th=[26048]

关键指标对照#

指标含义关注点
IOPS每秒 I/O 次数随机读写核心指标
BW带宽 (MB/s)顺序读写核心指标
slat提交延迟fio → 内核的时间,越小越好
clat完成延迟内核 → 磁盘完成的时间,反映磁盘真实性能
lat总延迟slat + clat,用户感知的响应时间
P9999 分位延迟长尾延迟,关注稳定性

常见磁盘性能参考值#

磁盘类型随机读 IOPS随机写 IOPS顺序读 MB/s延迟
7200rpm HDD100-200100-200100-1505-15ms
SATA SSD50k-100k30k-80k500-550100-500μs
NVMe SSD200k-500k200k-400k2000-350050-150μs
NVMe Gen4500k-1000k400k-800k5000-700020-80μs

6. 实战场景#

6.1 云盘选型对比#

测试腾讯云 / 阿里云不同云盘型号的真实性能:

cat > cloud-disk-test.fio << 'EOF'
[global]
ioengine=libaio
direct=1
group_reporting
time_based
runtime=60
size=20G

[rand-read-4k]
filename=/mnt/disk/fio-test
rw=randread
bs=4k
numjobs=4
iodepth=32

[rand-write-4k]
filename=/mnt/disk/fio-test
rw=randwrite
bs=4k
numjobs=4
iodepth=32

[seq-read-1m]
filename=/mnt/disk/fio-test
rw=read
bs=1m
numjobs=1
iodepth=1

[seq-write-1m]
filename=/mnt/disk/fio-test
rw=write
bs=1m
numjobs=1
iodepth=1
EOF

fio cloud-disk-test.fio

6.2 数据库场景压测#

模拟 MySQL / PostgreSQL 负载(4K 随机读写,读写比 7:3):

fio --name=db-workload \
    --filename=/data/mysql/fio-test \
    --rw=randrw \
    --rwmixread=70 \
    --bs=4k \
    --size=20G \
    --direct=1 \
    --numjobs=8 \
    --iodepth=64 \
    --group_reporting \
    --time_based \
    --runtime=120

6.3 检测磁盘是否达到标称值#

云厂商标称 IOPS 往往是”峰值”,实际持续性能可能打折:

# 持续测试 5 分钟,观察性能是否衰减
fio --name=endurance-test \
    --filename=/data/fio-test \
    --rw=randwrite \
    --bs=4k \
    --size=50G \
    --direct=1 \
    --numjobs=4 \
    --iodepth=32 \
    --group_reporting \
    --time_based \
    --runtime=300 \
    --log_avg_msec=1000 \
    --write_bw_log=fio-result

生成的 fio-result_bw.1.log 可绘制性能随时间变化的曲线。


7. 注意事项#

7.1 测试前准备#

# 1. 测试文件要足够大(至少 10G),避免被缓存
# 2. 测试前先填充数据(特别是随机读测试)
fio --name=prep \
    --filename=/data/fio-test \
    --rw=write \
    --bs=1M \
    --size=10G \
    --direct=1

# 3. 测试完清理
rm -f /data/fio-test

7.2 避免测试生产数据#

# ❌ 危险:直接测有数据的分区
fio --filename=/dev/sda1 --rw=randwrite ...

# ✅ 安全:测挂载点下的测试文件
fio --filename=/data/fio-test --rw=randwrite ...

7.3 理解缓存影响#

场景是否测到真实磁盘性能
direct=1✅ 绕过 page cache,测真实性能
direct=0❌ 受 page cache 影响,测到内存速度
云盘 + 缓存可能有分布式缓存层,需长时间测试

7.4 测试环境对齐#

  • CPU 状态:测试时关闭 CPU 省电模式(cpupower frequency-set -g performance
  • 文件系统:ext4 / xfs 性能有差异,需注明
  • 挂载参数noatime 可减少额外写操作

8. 速查命令#

# 一键测试(顺序 + 随机)
fio --name=quick \
    --filename=/data/fio-test \
    --rw=randrw --rwmixread=70 \
    --bsrange=4k-1m \
    --size=10G --direct=1 \
    --numjobs=4 --iodepth=32 \
    --group_reporting --runtime=60 --time_based

# 只看关键结果
fio ... | grep -E "IOPS|BW|lat|percentiles"

# JSON 格式输出(方便脚本处理)
fio --output-format=json ... > result.json

9. 总结#

测试目标块大小读写模式关键指标
吞吐量1M顺序读写BW (MB/s)
IOPS4k随机读写IOPS
延迟4k随机读写 (iodepth=1)clat (μs/ms)
稳定性4k随机读写 (长时间)P99 / 性能衰减
真实负载混合randrw (7:3)综合

记住:没有”放之四海皆准”的测试参数,根据你的实际业务场景选择块大小、读写比、并发数,测出来的数据才有参考价值。

📑 文章目录(29 节)
  1. 0. 为什么用 fio#
  2. 1. 安装#
  3. Ubuntu / Debian#
  4. CentOS / RHEL#
  5. 源码编译(需要最新版时)#
  6. 验证#
  7. 2. 核心概念#
  8. 3. 基础测试#
  9. 3.1 顺序读写(测吞吐量)#
  10. 3.2 随机读写(测 IOPS)#
  11. 3.3 混合读写(模拟真实负载)#
  12. 4. 进阶配置#
  13. 4.1 使用配置文件#
  14. 4.2 测试延迟#
  15. 4.3 io_uring 引擎(Linux 5.1+)#
  16. 5. 结果解读#
  17. 关键指标对照#
  18. 常见磁盘性能参考值#
  19. 6. 实战场景#
  20. 6.1 云盘选型对比#
  21. 6.2 数据库场景压测#
  22. 6.3 检测磁盘是否达到标称值#
  23. 7. 注意事项#
  24. 7.1 测试前准备#
  25. 7.2 避免测试生产数据#
  26. 7.3 理解缓存影响#
  27. 7.4 测试环境对齐#
  28. 8. 速查命令#
  29. 9. 总结#

← 回到首页

评论

评论功能未启用。在 .env 中配置 4 个 PUBLIC_GISCUS_* 变量即可启用。

📋 30 秒开通步骤
  1. 打开 github.com/apps/giscus → Install → 选 iiiiber/blog-comments
  2. 打开 giscus.app/zh-CN
  3. 仓库填 iiiiber/blog-comments,页面分类选 General
  4. 把页面生成的 data-repodata-repo-iddata-categorydata-category-id 4 个值填到 .env
  5. 重启 npm run dev,评论区自动出现