核心内容摘要
大雷动漫:点燃你的二次元热血,开启无限想象的奇幻之旅
fio 硬盘性能测试完整指南fioFlexible I/O Tester是一款开源、灵活的磁盘I/O性能测试工具支持多种I/O引擎、测试场景和参数配置可精准测量硬盘机械硬盘HDD、固态硬盘SSD、分区及文件系统的读写性能广泛应用于服务器存储测试、硬盘选型验证等场景。
本文涵盖从安装到实操、参数解读及问题排查的全流程适合新手快速上手。
fio 核心概念与测试指标
1 核心基础概念任务Jobfio的基本测试单元每个任务可配置独立的I/O模式、读写类型、线程数等参数支持单任务或多任务并发测试。
I/O引擎I/O Enginefio与操作系统交互的方式不同引擎适配不同场景直接影响测试结果的真实性。
块大小Block Size单次I/O操作的数据量对应不同业务场景如小文件读写用4K大文件传输用128K及以上。
队列深度Queue Depth同时提交给硬盘的未完成I/O请求数量队列深度越大越能发挥SSD的并行读写能力。
2 关键测试指标吞吐量Bandwidth单位时间内完成的I/O数据量常用单位MB/s兆字节/秒、GB/s吉字节/秒侧重大文件连续读写性能。
IOPSInput/Output Operations Per Second每秒完成的I/O操作次数侧重小文件随机读写性能如数据库场景核心指标SSD的IOPS远高于HDD。
延迟Latency单次I/O操作从发起至完成的时间分为读延迟、写延迟单位为毫秒ms或微秒us延迟越低硬盘响应越快。
CPU使用率测试过程中CPU的占用率反映硬盘I/O操作对CPU的消耗避免因CPU瓶颈影响测试结果。
fio 安装步骤fio支持Linux、Windows、macOS等主流系统优先推荐在Linux系统中测试兼容性更好、参数更全面各系统安装方法如下
1 Linux 系统Debian/Ubuntu 系列通过包管理器安装推荐sudo apt update sudo apt install fio -yCentOS/RHEL 系列sudo yum install epel-release -y # 依赖epel源 sudo yum install fio -y源码编译安装适合需要最新版本的场景# 下载源码可替换为最新版本wget https://github.com/axboe/fio/archive/refs/tags/fio-
3.
tar.gz解压并编译tar -zxvf fio-
3.
tar.gzcd fio-
36make sudo make install验证安装fio --version
2 Windows 系统官网下载压缩包https://github.com/axboe/fio/releases选择适配Windows的版本如fio-
36-windows.zip解压后进入目录通过CMD或PowerShell运行fio无需安装示例cd fio-
36-windows fio --version注意Windows系统部分I/O引擎不支持测试场景有限优先推荐Linux环境。
3 macOS 系统通过Homebrew安装需提前安装Homebrewbrew install fio
fio 基础测试流程fio测试分为「命令行直接测试」和「配置文件测试」两种方式命令行适合快速验证简单场景配置文件适合复杂场景多任务、自定义参数核心流程均为「配置参数→执行测试→分析结果」。
1 前置
注意事项测试前关闭目标硬盘上的其他读写任务如数据库、文件传输避免干扰测试结果尽量直接测试硬盘设备如/dev/sda而非挂载目录避免文件系统缓存影响结果测试SSD时建议先执行TRIM操作fstrim /挂载目录清除无效数据保证测试基准一致测试时长建议设置为60秒以上避免短期波动导致结果失真。
2 命令行直接测试常用场景命令行通过参数直接指定测试配置以下是4种核心场景的示例可直接替换设备路径如/dev/sdb或参数使用。
场景14K随机读数据库核心场景fio -filename/dev/sdb -direct1-iodepth16-thread -rwrandread -ioenginelibaio -bs4k -size10G -runtime60-group_reporting -name4k_randread场景24K随机写数据库、日志场景fio -filename/dev/sdb -direct1-iodepth16-thread -rwrandwrite -ioenginelibaio -bs4k -size10G -runtime60-group_reporting -name4k_randwrite场景3128K连续读大文件传输、视频渲染场景fio -filename/dev/sdb -direct1-iodepth8-thread -rwread -ioenginelibaio -bs128k -size50G -runtime60-group_reporting -name128k_seqread场景4128K连续写文件备份、数据写入场景fio -filename/dev/sdb -direct1-iodepth8-thread -rwwrite -ioenginelibaio -bs128k -size50G -runtime60-group_reporting -name128k_seqwrite
3 配置文件测试复杂场景当需要多任务并发如混合读写、多块硬盘同时测试时可编写配置文件后缀为.fio集中管理参数执行更灵活。
示例混合读写测试配置文件mixed.fio[global] filename/dev/sdb # 测试设备 direct1 # 跳过文件系统缓存直接读写硬盘 ioenginelibaio # I/O引擎Linux推荐libaio iodepth16 # 队列深度 bs4k # 块大小 size10G # 测试数据量 runtime60 # 测试时长秒 thread # 启用线程模式 group_reporting # 合并输出结果 time_based # 按时间结束测试优先于size [randread] rwrandread # 随机读任务 percentage_random100 # 随机读占比100% [randwrite] rwrandwrite # 随机写任务 percentage_random100 # 随机写占比100% stonewall # 等待前一个任务完成后执行执行配置文件fio mixed.fio
核心参数详解fio参数繁多以下梳理高频核心参数按功能分类说明方便按需配置
1 基础配置参数参数作用常用取值-filename指定测试目标硬盘设备或文件路径/dev/sda、/mnt/test.dat-name测试任务名称用于区分结果4k_randread、seq_write-runtime测试持续时间秒
120避免过短-size测试数据总量优先于runtimetime_based开启时相反10G、50G需大于内存避免缓存干扰-thread启用线程模式替代默认的进程模式降低资源消耗无取值直接添加参数-group_reporting合并所有任务的结果输出汇总信息无取值直接添加参数
2 I/O 模式与引擎参数参数作用常用取值-rw指定读写模式核心参数read连续读、write连续写、randread随机读、randwrite随机写、rw混合读写-ioengine指定I/O引擎决定fio与系统的交互方式libaioLinux异步I/O推荐、sync同步I/O、mmap内存映射-direct是否跳过文件系统缓存1跳过0启用1真实测试硬盘性能推荐、0测试缓存加速后的性能-iodepthI/O队列深度影响并行读写性能SSD
HDD
HDD并行能力弱队列过深易卡顿
3 块大小与混合读写参数参数作用常用取值-bs单次I/O操作的块大小决定测试场景4k随机读写/数据库、128k-1M连续读写/大文件-rwmixread混合读写模式下读操作的占比仅rw模式生效70常用读写比例7:
50均衡读写-percentage_random混合读写中随机I/O的占比0纯连续100纯随机
100常用纯连续/纯随机场景
测试结果解读fio测试完成后会输出详细结果核心关注「Jobs汇总信息」以下是4K随机读测试的结果示例及关键指标解读结果示例4k_randread:(groupid0,jobs
:err0:pid12345: Wed Nov110:00:002024read:IOPS
1
5k,BW
7
3MiB/s(
7
8MB/s)(4340MiB/60001msec)slat(usec):min1,max128,avg
25,stdev
12clat(usec):min20,max890,avg
8
62,stdev
2
31lat(usec):min22,max892,avg
8
87,stdev
2
45clat percentiles(usec):|
00th[35],
00th[50],
1
00th[58],
2
00th[68],|
3
00th[75],
4
00th[80],
5
00th[85],
6
00th[90],|
7
00th[95],
8
00th[102],
9
00th[115],
9
00th[130],|
9
00th[170],
9
50th[190],
9
90th[230],
9
95th[250],|
9
99th[320]cpu:usr
50%,sys
80%,ctx215689,majf0,minf24IO depths:
1
1%,
2
1%,
4
1%,
8
1%,
1
0%,
3
0%,
6
0% submit:
0
0%,
4
0%,
8
0%,
1
0%,
3
0%,
6
0%,
6
0% complete:
0
0%,
4
0%,
8
0%,
1
0%,
3
0%,
6
0%,
6
0% issued rwts:total1111040,0,0,0short0,0,0,0dropped0,0,0,0 latency:target0,window0,percentile
1
00%,depth16关键指标解读IOPS示例中IOPS
1
5k即每秒完成18500次4K随机读操作SSD的4K随机读IOPS通常在10k-100kHDD一般在
。
BW带宽示例中BW
7
3MiB/s即每秒传输
7
3兆字节数据4K场景带宽通常低于大文件连续读写。
lat延迟slat提交延迟从发起I/O到提交给内核的时间 avg
25us越低越好clat完成延迟从提交到I/O完成的时间 avg
8
62us核心延迟指标lat总延迟从发起至完成的总时间 avg
8
87us。
clat percentiles延迟分位数
9
99th[320]表示
9
99%的I/O完成延迟不超过320us分位数比平均值更能反映极端场景的性能。
CPU使用率usr
50%用户态CPU占用sys
80%内核态CPU占用总占用较低无CPU瓶颈。
IO depths
1
0%表示队列深度稳定在16与配置一致无队列溢出。
六、
常见问题与排查方案
1 测试结果波动大原因系统缓存干扰、其他进程占用I/O、测试时长过短、硬盘未做预处理SSD未TRIM、HDD未碎片整理。
排查方案启用-direct1跳过缓存关闭其他读写任务测试时长设置为60秒以上SSD执行fstrimHDD执行fsck整理碎片多次测试取平均值。
2 权限不足无法测试硬盘设备原因未使用root权限普通用户无法直接操作硬盘设备/dev/sda等。
排查方案在fio命令前添加sudo以root权限执行测试。
3 提示“I/O engine libaio not supported”原因系统不支持libaio引擎如Windows、部分轻量Linux系统或未安装libaio依赖。
排查方案Linux系统安装依赖sudo apt install libaio-dev替换为sync引擎-ioenginesync。
4 HDD测试IOPS极低低于100原因HDD本身随机读写性能弱队列深度设置过大或硬盘存在坏道、老化问题。
排查方案将队列深度调整为
-iodepth2用smartctl检测硬盘健康状态smartctl -a /dev/sda。
5 测试时CPU使用率过高超过80%原因线程数过多、I/O引擎选择不当如sync引擎比libaio更耗CPU、块大小过小导致I/O操作频繁。
排查方案减少线程数替换为libaio引擎适当增大块大小如从4K改为8K。
进阶测试场景
1 多块硬盘并发测试编写配置文件同时测试/dev/sdb、/dev/sdc两块硬盘示例multi_disk.fio[global]direct1ioenginelibaioiodepth16bs4ksize10Gruntime60threadgroup_reporting[disk1_randread]filename/dev/sdbrwrandread[disk2_randread]filename/dev/sdcrwrandread
2 模拟数据库混合读写场景配置70%随机读、30%随机写块大小4K队列深度32示例命令fio -filename/dev/sdb -direct1 -iodepth32 -thread -rwrw -rwmixread70 -ioenginelibaio -bs4k -size20G -runtime120 -group_reporting -namedb_mixed_test
3 测试文件系统性能而非裸盘若需测试挂载目录如/mnt/data的文件系统性能关闭direct模式示例fio -filename/mnt/data/test.dat -direct0 -iodepth8 -thread -rwread -ioenginelibaio -bs128k -size50G -runtime60 -group_reporting -namefs_seqread
八、
总结fio的核心优势的是灵活适配各类I/O场景测试时需注意根据实际业务场景选择块大小、读写模式和队列深度如数据库用4K随机读写大文件传输用128K连续读写纯硬盘性能测试需启用-direct1避免缓存干扰测试文件系统性能则关闭多次测试取平均值结合IOPS、带宽、延迟等多指标综合评估而非单一指标判断性能。
通过本文的基础操作和参数配置可完成大多数硬盘性能测试场景如需适配特定业务如分布式存储、云硬盘可调整参数或增加多任务并发配置。