磁盘性能测试工具FIO安装与使用
工具简介
定义与定位
FIO(Flexible I/O Tester)是一款开源的存储性能测试工具,支持模拟多种I/O负载模式(顺序/随机读写、混合读写等),提供详细的性能指标(IOPS、带宽、延迟等)。
优势
- 灵活性:支持13+种I/O引擎(如libaio、sync)
- 多线程/进程:可模拟高并发场景
- 精准报告:输出IOPS、吞吐量、延迟分布等数据
应用场景
- 负载模拟能力
- 支持顺序/随机读写、混合读写(读写比例可调)
- 提供同步/异步I/O模式(如libaio、posixaio、sync等引擎)
- 可设定块大小、队列深度、压测时长等精细化参数
- 多维性能分析
除基础IOPS(每秒操作数)和带宽(吞吐量)外,还可测量:- 延迟分布(最小/平均/最大/百分位值)
- CPU利用率与线程调度统计
- I/O抖动(延迟波动)等高级指标
- 跨平台与灵活性
- 支持Linux/Windows/macOS系统
- 可通过配置文件或命令行快速构建测试场景
- 支持多线程/多进程并发测试,模拟真实负载压力
安装与基础用法
安装方法
# CentOS
yum install libaio-devel fio
# Ubuntu
apt install fio
命令行关键参数
参数 | 技术影响 | 典型场景示例 | 注意事项 |
---|---|---|---|
--rw | 决定I/O模式与数据分布: - read/write(顺序读写) - randread/randwrite(完全随机) - rw/randrw(混合读写) |
SSD随机性能测试用randrw ,机械盘顺序带宽用 write |
混合读写需配合--rwmixread=70 设置读写比例 |
--bs | 直接影响IOPS与带宽关系: - 小块(4k)适合测IOPS - 大块(1m)适合测吞吐量 |
数据库用4k 模拟页操作,视频处理用 1m 测连续写入 |
需与实际业务场景块大小匹配 |
--iodepth | 提升SSD/NVMe设备的并发能力: - 单线程队列深度 - 与numjobs配合增加总队列深度 |
企业级SSD建议32-64 ,云硬盘建议 8-16 |
过高可能导致超设备队列能力 |
--numjobs | 模拟多进程并发压力: - 每个job独立线程 - 与iodepth组合计算总IOPS |
数据库连接池测试用8-16 ,单线程测试用 1 |
需配合CPU核心数调整 |
--direct | 绕过系统缓存(Buffer/Cache): - 1: 真实设备性能测试 - 0: 允许缓存加速 |
存储设备裸性能必设为1 ,文件系统测试可设为 0 |
未启用会导致测试结果虚高 |
--ioengine | 选择I/O调度引擎: - libaio(异步IO,推荐) - sync(同步阻塞) - posixaio(POSIX异步) |
企业级SSD测试用libaio ,基础验证用 sync |
Windows系统需用windowsaio |
--runtime | 控制测试持续时间: - 避免无限运行 - 单位:秒 |
--runtime=600 表示10分钟压测 |
需配合--time_based 实现按时长运行 |
--size | 定义每个线程的I/O数据量: - 控制测试范围 - 支持K/M/G单位 |
--size=10G 模拟大数据处理,--size=100m 快速测试 |
总数据量=size×numjobs |
--group_reporting | 合并多线程结果输出: - 显示聚合性能指标 - 隐藏单个job细节 |
多并发测试必加此参数 | 与--numjobs 配合使用 |
--filename | 指定测试目标路径: - 文件路径(如/data/testfile) - 设备路径(如/dev/nvme0n1) |
裸盘测试用/dev/sdb ,文件系统测试用文件路径 |
直接写设备会破坏原有数据 |
常用测试场景
全盘顺序吞吐测试(机械硬盘/带宽验证)
fio --name=seq_write --filename=/dev/sdb --rw=write --bs=1m --direct=1 \
--ioengine=libaio --numjobs=4 --runtime=600 --group_reporting
参数关联说明:
--bs=1m
:大块测试连续带宽上限--numjobs=4
:多线程加速机械盘寻道瓶颈--runtime=600
:10分钟稳定压力测试- 强制
--direct=1
排除缓存干扰
数据库随机IOPS测试(SSD/OLTP场景)
fio --name=oltp_sim --filename=/mnt/ssd/testfile --rw=randrw --rwmixread=70 \
--bs=4k --iodepth=32 --numjobs=8 --runtime=300 --direct=1 --group_reporting
关键配置解析:
--rwmixread=70
:模拟70%读+30%写的典型事务负载--iodepth=32
+--numjobs=8
:总队列深度256,匹配高并发数据库--filename
指向挂载点:测试文件系统实际性能
云硬盘极限压力测试(队列深度验证)
fio --name=cloud_stress --rw=randread --bs=4k --iodepth=64 \
--ioengine=libaio --numjobs=16 --time_based --runtime=1800 \
--filename=/dev/vdc --direct=1 --output=cloud_result.json
新增优化点:
--time_based
:强制按时长运行(即使提前完成数据量)--output=cloud_result.json
:生成结构化日志,便于自动化分析- 持续30分钟(
--runtime=1800
)检测云盘性能衰减
元数据性能测试(小文件场景)
fio --name=meta_test --rw=randwrite --bs=512b --iodepth=1 \
--numjobs=128 --direct=1 --size=8m --nrfiles=128 \
--directory=/testdir --fsync=1 --group_reporting \
--time_based --runtime=120
场景特殊配置:
--bs=512b
:极端小块测试inode分配效率--numjobs=128
:高并发模拟海量小文件写入--size=8m
:每个线程写入8MB(总数据量 8m×128=1GB,可控)--nrfiles=128
:每个线程创建独立文件(生成128个文件)--directory=/testdir
:指定独立目录避免文件覆盖--fsync=1
:每次写操作后触发元数据提交--runtime=120
:限制测试时长为2分钟,避免失控
测试结果解读
关键指标
IOPS
- 定义:每秒处理多少次I/O操作
- 示例:IOPS=11.3k 表示每秒处理11,300次读写
- 关键点:
- 机械硬盘IOPS≈200,SSD可达数万
- 高IOPS不一定等于高效
带宽BW
- 定义:每秒传输的数据量
- 示例:BW=43.0MiB/s 表示每秒传输43兆字节
- 换算关系:BW = IOPS × 块大小
(如4k块达到43MiB/s需要:43×1024÷4 ≈ 11k IOPS)
延迟latency
- 分层理解:
- slat(提交延迟):系统处理请求的时间
- clat(完成延迟):设备实际处理时间
- lat(总延迟):slat + clat
性能分析
- 观察延迟分布(避免被平均,如99th percentile判断异常值)
- 对比不同参数(如iodepth对IOPS的影响)
注意事项
- 数据安全
- 避免直接测试已挂载设备(使用--allow_mounted_write=1需谨慎)
- 指定测试文件路径(如--filename=/testfile)
- 环境配置
- 测试前清空缓存:echo 3 > /proc/sys/vm/drop_caches
- 使用--direct=1绕过系统缓存获取真实磁盘性能
本文作者:505donkey
本文链接:https://www.cnblogs.com/505donkey/p/18742275
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步