三、存储测试工具 FIO

一、FIO 概念

FIO(Flexible I/O Tester)是一个开源、跨平台的高性能 I/O 存储测试工具,用于测量块设备或文件系统的 IOPS、吞吐量(带宽)和时延(延迟),支持随机/顺序读写、多线程并发及异步 I/O 引擎(如 libaio)。

二、参数介绍

|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|----|
| 参数 | 含义 | 必选 |
| --name=xxx | 测试任务名称 | |
| --numjobs=1 | 并发线程数 | ✔ |
| --iodepth=32 | IO 队列深度,SSD 常用 32/64,机械盘 1~4 | ✔ |
| --direct=1 | 绕过 OS PageCache,裸盘真实性能 | ✔ |
| --ioengine=libaio | Linux 异步 IO(最常用;内核≥5.1 可用io_uring) | ✔ |
| --sync=1 | 写完强制 fsync 落盘 | |
| --rw=randread | 读写策略,默认随机读,例如: 1. randwrite:随机写; 2. randread:随机读; 3. read:顺序读; 4. write:顺序写; 5. randrw:随机混合读写; 6. readwrite:顺序混合读写; 7. 70:30:7 读 3 写混合。 | ✔ |
| --rwmixread=70 | 当 ‌rw=randrw或者readwrite‌时生效;默认读写各占50%; 1. --rwmixread与--rwmixwrite 互斥; 2. 若同时指定,FIO 以 --rwmixread 为准 | |
| --bs=4K | IO 块大小,默认使用 4k,例如: 1. --bs=4k,128k:表示读4k、写128k; 2. --bsrange=4k-1m:支持范围; 3. --bssplit=4k/50:128k/50:混合比。 | ✔ |
| --size=1G | 测试生成文件大小 | ✔ |
| --time_based | 完成所有指定大小的 I/O 后即停止,默认为0 | |
| --runtime | 读写测试的运行时长,默认 unset(即无限制),单位:秒 | |
| --directory=/path | 裸盘路径;测文件填 ./test.fio | ✔ |

说明:

  • 建议 bs 为 512B 或 4K 的整数倍以避免对齐开销,现代存储设备(HDD/SSD)的物理扇区通常为 4K,而逻辑接口常兼容 512B 模式;未对齐的 I/O 会跨越物理扇区边界,触发"读-修改-写"循环,增大耗时。
  • FIO 中 --time_based 的默认值为 0(禁用),--runtime 的默认值为无限(即不设限),测试在完成指定 I/O 量后自动结束。若未设置 --time_based=1,即使指定了 --runtime,FIO 仍会在 I/O 完成(如写满 --size 指定的空间)后立即退出,不会等待 runtime 到期。
    • --time_based:默认 ‌不启用‌(等价于 --time_based=0),表示测试在完成所有指定大小(--size 或文件/设备容量)的 I/O 后即停止;若启用(--time_based=1),则即使 I/O 完成,也会循环运行至 --runtime 时间结束。
    • --runtime:默认 ‌无限制‌(不设值时忽略),测试由 --size 或目标文件/设备容量决定结束时机;若显式设置(如 --runtime=60),则测试最多运行该时长,但仅当同时启用 --time_based 时才会强制跑满此时间。
  • 严禁在系统盘 /dev/sda 执行写测试,会损坏系统!
  • --rwmixread 是 FIO 中用于在混合读写模式(rw=randrw 或 rw=rw)下指定读操作所占百分比的参数,取值范围为 0 ~ 100,默认为 50。

三、使用方式

1、命令行

fio --name=Fio --numjobs=1 --iodepth=32 --direct=1 --ioengine=libaio --sync=1 --rw=randrw --rwmixread=60 --bs=4K --size=3G --time_based=0 --directory=/path/to/directory

2、Job 配置

单个配置

文件名:fio.ini,调用命令 fio fio.ini

global

ioengine=libaio

direct=1

iodepth=32

group_reporting

runtime=60

rand4k-read

rw=randread

bs=4k

numjobs=4

size=15G

filename=/data/test

批量配置

global

ioengine=libaio

direct=1

group_reporting

runtime=120

size=40G

filename=/mnt/fio.test

ssd_4k_r

rw=randread

bs=4k

iodepth=64

numjobs=8

ssd_4k_w

rw=randwrite

bs=4k

iodepth=64

numjobs=8

ssd_1M_seq

rw=readwrite

rwmixread=50

bs=1M

iodepth=16

numjobs=4

四、案例说明

测试场景:4K 随机混合读写(大约读 60%/ 写 40%),iodepth=32,direct=1,libaio


逐行逐句翻译 + 分析

Fio: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=32

  • g=0:任务组 ID
  • rw=randrw随机混合读写
  • bs=4096B:读写块大小都是 4K
  • ioengine=libaio:Linux 异步 IO
  • iodepth=32:IO 队列深度 32

fio-3.7

  • FIO 版本 3.7

Starting 1 process

  • 启动 1 个进程 / 线程(numjobs=1)

Fio: Laying out IO file (1 file / 3072MiB)

  • 创建测试文件:1 个文件,大小 3GB

Jobs: 1 (f=1): m(1)100.0%r=57.6MiB/s,w=38.0MiB/sr=14.7k,w=9732 IOPSeta 00m:00s

  • m(1):混合读写任务 1 个
  • 100%:测试完成
  • 读速度:57.6MB/s,写速度:38MB/s
  • 读 IOPS:14.7k,写 IOPS:9.7k
  • 已跑完,无剩余时间

Fio: (groupid=0, jobs=1): err= 0: pid=529013: Fri Jun 5 11:49:17 2026

  • 任务组 0,1 个任务
  • err=0无任何错误,测试完全正常
  • 进程 ID + 结束时间

读性能部分(READ)

read: IOPS=14.9k, BW=58.0MiB/s (60.9MB/s)(1842MiB/31738msec)

  • 读:IOPS=14900
  • 读带宽:58MB/s
  • 31 秒读了 1842MB

slat (usec): min=3, max=3066, avg= 9.46, stdev=27.94

  • 提交延迟 (发给内核):submission latency
  • 平均 9.46 微秒,非常快

clat (usec): min=105, max=5899, avg=654.10, stdev=622.89

  • 磁盘完成延迟(核心):completion latency
  • 平均:654us = 0.65ms
  • 最大 5.8ms(写影响导致波动变大)
  • stdev=622:延迟抖动明显(因为混合读写)

lat (usec): min=121, max=5916, avg=663.79, stdev=622.80

  • 总 IO 延迟 = 提交 + 完成:total latency
  • 平均 0.66ms

clat percentiles (usec):

| 1.00th= 174, 5.00th= 217, 10.00th= 249, 20.00th= 302,

| 30.00th= 343, 40.00th= 383, 50.00th= 429, 60.00th= 474,

| 70.00th= 545, 80.00th= 734, 90.00th= 1565, 95.00th= 2311,

| 99.00th= 2802, 99.50th= 2933, 99.90th= 3228, 99.95th= 4359,

| 99.99th= 5342

  • 读延迟百分位(关键)
  • 50% 延迟 < 0.43ms
  • 90% 延迟 < 1.56ms
  • 99% 延迟 < 2.8ms
  • 99.9% < 3.2ms
  • 长尾延迟明显上升(混合读写正常现象)

bw ( KiB/s): min=55880, max=64656, per=99.96%, avg=59403.62, stdev=1402.59, samples=63

  • 读带宽稳定,波动小

iops : min=13970, max=16164, avg=14850.89, stdev=350.64, samples=63

  • 读 IOPS 稳定在 1.4 万左右

写性能部分(WRITE)

write: IOPS=9921, BW=38.8MiB/s (40.6MB/s)(1230MiB/31738msec)

  • 写:IOPS=9921
  • 写带宽:38.8MB/s

slat (usec): min=4, max=2896, avg=11.73, stdev=42.89

  • 提交延迟,平均 11us,正常

clat (usec): min=250, max=19733, avg=2215.17, stdev=1142.32

  • 写延迟(最重要)
  • 平均:2215us = 2.2ms
  • 最大:19.7ms
  • stdev=1142:抖动非常大(典型混合读写特征)

lat (usec): min=260, max=19744, avg=2227.14, stdev=1142.51

  • 写总延迟:平均 2.2ms

clat percentiles (usec):

| 1.00th= 685, 5.00th= 898, 10.00th= 1029, 20.00th= 1205,

| 30.00th= 1401, 40.00th= 1663, 50.00th= 1958, 60.00th= 2278,

| 70.00th= 2769, 80.00th= 3195, 90.00th= 3621, 95.00th= 4047,

| 99.00th= 5800, 99.50th= 6128, 99.90th= 6718, 99.95th= 8586,

| 99.99th=17433

  • 写延迟百分位
  • 50% < 1.95ms
  • 90% < 3.6ms
  • 99% < 5.8ms
  • 99.9% < 6.7ms
  • 99.99% < 17.4ms
  • 写长尾延迟很高,这是混合读写下的正常表现

bw ( KiB/s): min=37704, max=41976, per=99.95%, avg=39665.22, stdev=808.87, samples=63

iops : min= 9426, max=10494, avg=9916.29, stdev=202.25, samples=63

  • 写带宽 / IOPS 都很稳定

全局延迟统计

lat (usec) : 250=6.19%, 500=32.49%, 750=10.22%, 1000=5.20%

lat (msec) : 2=21.64%, 4=22.12%, 10=2.13%, 20=0.01%

  • 延迟(latency)以微秒(microseconds)为单位的统计值
    • 6.19% IO < 250us
    • 32% < 500us
  • 延迟(latency)以毫秒(milliseconds)为单位的统计值
    • 21% 在 1~2ms
    • 22% 在 2~4ms
    • 2% 在 4~10ms
  • 整体延迟中等

CPU & 上下文切换

cpu : usr=8.81%, sys=21.95%, ctx=149530, majf=0, minf=92

  • 用户 CPU:8.8%
  • 系统 CPU:21.9%
  • 上下文切换 14 万(正常)
  • 无主缺页异常,系统健康

IO 队列深度

IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%

  • 队列深度一直跑满 32
  • 压力完全打满,测试有效

submit : 0=0.0%, 4=100.0%

complete : 0=0.0%, 4=100.0%

  • IO 提交 / 完成 都正常

issued rwts: total=471550,314882,0,0 short=0,0,0,0 dropped=0,0,0,0

  • 总读 IO:47 万
  • 总写 IO:31 万
  • short=0,dropped=0:无丢失、无失败、无截断 IO,存储绝对健康

latency : target=0, window=0, percentile=100.00%, depth=32

  • 无延迟限制,队列深度 32

最终运行状态

Run status group 0 (all jobs):

READ: bw=58.0MiB/s, io=1842MiB, run=31738msec

WRITE: bw=38.8MiB/s, io=1230MiB, run=31738msec

  • 读:58MB/s
  • 写:38.8MB/s
  • 总耗时约 31 秒

磁盘利用率(关键)

dm-0: util=99.53%

sda: util=97.76%

  • 磁盘利用率 97%~99%
  • 说明测试已经跑满存储性能
  • 结果真实有效

关键结论

  1. 混合读写比例 :大约 读 60% / 写 40%
  2. 读性能
    • IOPS:1.49 万
    • 平均延迟:0.65ms
    • 99% 延迟:2.8ms → 良好
  3. 写性能
    • IOPS:9921
    • 平均延迟:2.2ms
    • 99% 延迟:5.8ms → 中等,长尾偏高(混合读写正常)
  4. 整体
    • 磁盘跑满
    • 无 IO 错误
    • 性能稳定
    • 属于企业级 SSD / 高性能存储水平
相关推荐
ZStack开发者社区1 小时前
ZSTACK · 答客问 | 什么时候该升级,什么时候再等等
网络·云计算
2601_961875241 小时前
法考资料全套2026|客观题|主观题|资料已整理
阿里云·云计算·腾讯云·azure·七牛云存储·csdn开发云·火山引擎
SaaS_Product3 小时前
同步盘操作教程:如何自动同步文件
人工智能·云计算·saas·onedrive
精益数智小屋4 小时前
拆解项目管理计划的核心功能:用项目管理计划解决跨部门协作难题
大数据·人工智能·数据分析·云计算·软件工程
容器魔方7 小时前
Karmada v1.18 版本发布!新增混合云溢出式调度能力
人工智能·云原生·容器·华为云·云计算
AOwhisky8 小时前
学习自测与解析:Redis系列第一期与第二期核心知识点详解
运维·数据库·redis·学习·云计算
腾讯蓝鲸智云8 小时前
【运维自动化-监控平台】初识蓝鲸监控
运维·自动化·云计算·sass·paas
翼龙云_cloud9 小时前
阿里云代理商:阿里云 CPFS 通用版创建与删除全指南
阿里云·云计算·云服务器
佛系豪豪吖9 小时前
一台 Lighthouse 撑起 AI 全栈工作流:OpenClaw + 腾讯云生态深度实战
人工智能·经验分享·云计算·腾讯云·授权网关
youyu-youyu9 小时前
oss阿里云图片链接url高清图片设置为缩略图 vue 减少加载体积流量
前端·javascript·vue.js·阿里云·云计算