FIO I/O 基准测试
概述
Linux系统存储性能测试 - 运维工程师必备
概述与核心要点 关键参数详解 测试场景示例
FIO 概述与核心要点
什么是 FIO?
FIO (Flexible I/O Tester) 是Linux下最强大、最灵活的I/O性能测试工具,支持多种I/O模式、访问模式和负载模式,是存储系统性能评估的行业标准。
核心优势
• 支持同步/异步I/O• 多种I/O引擎支持• 灵活的负载生成• 详细的性能指标• 可重复的测试场景
适用场景
• 存储设备性能评估• 系统容量规划• 性能基线建立• 故障排查分析• 配置优化验证
FIO 工作原理
FIO通过创建多个工作进程/线程,每个工作单元按照指定的I/O模式对目标设备进行读写操作,并收集详细的性能统计数据。其架构设计允许精确模拟各种真实世界的I/O负载模式。
测试类型分类
顺序I/O测试
测试连续读写性能,适用于评估大文件传输、数据备份等场景的性能表现。
随机I/O测试
测试随机读写性能,模拟数据库、虚拟化等典型企业应用的I/O特征。
混合负载测试
同时进行读写操作,更真实地反映生产环境中的复杂I/O模式。
基础配置参数
| 参数 | 说明 | 示例值 | 推荐用途 |
|---|---|---|---|
| filename | 测试目标文件或设备 | /dev/sdb, /tmp/testfile | 指定测试对象 |
| size | 测试文件大小 | 1G, 10G, 100G | 控制测试数据量 |
| bs | 块大小(Block Size) | 4k, 64k, 1M | 模拟不同I/O粒度 |
| rw | 读写模式 | read, write, randread, randwrite | 定义I/O访问模式 |
| ioengine | I/O引擎 | libaio, sync, psync | 选择I/O实现方式 |
性能控制参数
| 参数 | 说明 | 示例值 | 影响 |
|---|---|---|---|
| iodepth | I/O队列深度 | 1, 32, 64 | 控制并发I/O数量 |
| numjobs | 并发作业数量 | 1, 4, 8 | 增加测试并行度 |
| runtime | 测试运行时间 | 60, 300, 600 | 控制测试持续时间 |
| ramp_time | 预热时间 | 10, 30, 60 | 排除系统预热影响 |
| direct | 绕过系统缓存 | 0, 1 | 测试真实设备性能 |
高级配置参数
rwmixread
混合负载中读操作的百分比。例如 rwmixread=70 表示70%读,30%写。
sync
每次I/O后是否同步。sync=1 确保数据真实写入存储设备。
group_reporting
将多个job的结果合并报告,便于分析整体性能。
norandommap
禁用随机访问映射,避免内存开销影响小文件随机测试。
对于SSD测试,建议使用 direct=1 绕过缓存
队列深度从1开始测试,逐步增加到32或64
运行时间至少60秒以获得稳定结果
使用 ramp_time 排除系统预热对结果的影响
1. 顺序读取性能测试
评估存储设备的连续读取能力,适用于大文件传输场景:
fio --name=sequential-read --filename=/dev/vda --rw=read --bs=1M --size=4G --numjobs=1 --iodepth=32 --ioengine=libaio --direct=1 --runtime=60 --time_based --group_reporting
2. 随机读写混合测试
模拟数据库等应用的典型I/O模式:
fio --name=random-mixed \
--filename=/dev/sdb \
--rw=randrw \
--rwmixread=70 \
--bs=4k \
--size=2G \
--numjobs=4 \
--iodepth=16 \
--ioengine=libaio \
--direct=1 \
--runtime=300 \
--time_based \
--ramp_time=30 \
--group_reporting3. IOPS压力测试
测试设备在小块随机I/O下的最大IOPS能力:
fio --name=iops-test \
--filename=/dev/sdb \
--rw=randread \
--bs=4k \
--size=1G \
--numjobs=8 \
--iodepth=64 \
--ioengine=libaio \
--direct=1 \
--runtime=120 \
--time_based \
--norandommap \
--group_reporting4. 延迟敏感性测试
评估低并发下的I/O延迟特性:
fio --name=latency-test \
--filename=/dev/sdb \
--rw=randread \
--bs=4k \
--size=1G \
--numjobs=1 \
--iodepth=1 \
--ioengine=sync \
--direct=1 \
--runtime=60 \
--time_based5. 文件系统测试
测试文件系统而非原始设备的性能:
fio --name=filesystem-test \
--directory=/mnt/test \
--rw=randrw \
--rwmixread=60 \
--bs=64k \
--size=500M \
--numjobs=4 \
--ioengine=libaio \
--iodepth=16 \
--runtime=180 \
--time_based \
--create_on_open=1 \
--group_reporting