FIO(Flexible I/O Tester)是很强大、很灵活的存储性能测试工具之一,被广泛应用于评估各种存储设备的性能表现。本文将介绍FIO的核心原理、典型测试场景、参数详解以及实战案例分析,帮助大家掌握这一专业工具的使用方法。
FIO工具概述
FIO是一款功能强大的开源I/O性能测试工具,能够模拟各种复杂的I/O工作负载,为存储设备和文件系统的性能分析提供全面而精确的数据。它支持多种I/O操作模式,包括顺序读写、随机读写、混合读写等,可以全面模拟真实应用环境中的各种I/O模式。
FIO的核心优势在于:
高度可配置:支持精确控制I/O操作的大小、数量、并发度等参数。
多平台支持:可在Linux、Windows和macOS系统上运行。
全面指标:提供IOPS、带宽、延迟等详细性能指标。
真实模拟:能够创建接近生产环境的复杂I/O负载模式。
FIO测试原理与核心参数
FIO通过生成多种类型的I/O负载来测试存储设备的性能极限。其核心工作原理包括:
I/O模式模拟:通过rw参数控制读写模式(顺序/随机/混合)。
并发控制:通过numjobs和iodepth参数模拟多线程/高并发场景。
性能测量:精确记录每次I/O操作的耗时、数据量等指标。
FIO工具常用参数介绍:
| 参数 | 说明 | 典型值 |
|---|---|---|
| filename | 目标设备名称或文件地址 | /dev/sda, /mnt/data/testfile |
| rw | 读写策略 | 随机读:randread 随机写:randwrite 顺序读:read 顺序写:write 混合随机读写:randrw |
| bs | IO块大小 | 单位是k、K、m和M等,随机测试应保持4K,顺序测试可增大该值,如256K、512K等。 |
| iodepth | IO队列深度 | fio总的IO并发数=iodepth * numjobs,值越高,压力越大。机械盘通常该值设置较低,固态盘可逐步增加该值,测出瓶颈。 |
| numjobs | 并发线程数 | 对于固态盘,多线程可能会提升性能,机械盘过多线程可能导致性能下降。默认为1。 |
| size | IO操作的数据量 | 取值可以是带单位的数字,比如size=10G,表示读/写的数据量为10GiB。也可以是百分数,比如size=20%,表示读/写的数据量占该设备总文件的20%的空间。 |
| runtime | 测试持续时间(秒) | 可逐步增加测试时间,较短的时间可能导致性能突发干扰。 |
| direct | 是否绕过缓存 | 值为1:表示使用direct IO,忽略IO缓存。 值为0:表示不使用direct IO,而使用使用buffered IO |
| ioengine | IO引擎 | libaio(推荐), sync, psync |
注意:任何测试都要在数据备份后进行,不要将系统盘或者含有重要数据的数据盘作为测试对象。建议您在空白的数据盘上测试性能。
参考:https://linux.die.net/man/1/fio
常见测试场景与命令示例
1、4K随机读取测试
|
1 |
fio -name=rand_read_iops -filename=/dev/sda --numjobs=1 -ioengine=libaio -direct=1 -group_reporting -bs=4k -iodepth=64 --size=100G -runtime=600 -rw=randread --time_based --output=4k_rand_read_iops.txt |
测试结果示例:

2、4K随机写入测试
|
1 |
fio -name=rand_write_iops -filename=/dev/sda --numjobs=1 -ioengine=libaio -direct=1 -group_reporting -bs=4k -iodepth=64 --size=100G -runtime=600 -rw=randwrite --time_based --output=4k_rand_write_iops.txt |
测试结果示例:

3、顺序读取吞吐量测试
|
1 |
fio -name=read_bandwidth -filename=/dev/sda --numjobs=1 -ioengine=libaio -direct=1 -group_reporting -bs=1M -iodepth=64 --size=100G -runtime=600 -rw=read --time_based --output=1M_read_bandwidth.txt |
测试结果示例:

4、顺序写入吞吐量测试
|
1 |
fio -name=write_bandwidth -filename=/dev/sda --numjobs=1 -ioengine=libaio -direct=1 -group_reporting -bs=1M -iodepth=64 --size=100G -runtime=600 -rw=write --time_based --output=1M_write_bandwidth.txt |
测试结果示例:

5、单队列随机读时延测试
|
1 |
fio -name=rand_read_late -filename=/dev/sda --numjobs=1 -ioengine=libaio -direct=1 -group_reporting -bs=4k -iodepth=1 --size=10G -runtime=60 -rw=randread --time_based --output=rand_read_late.txt |
测试结果示例:

6、单队列随机写时延测试
|
1 |
fio -name=rand_write_late -filename=/dev/sda --numjobs=1 -ioengine=libaio -direct=1 -group_reporting -bs=4k -iodepth=1 --size=10G -runtime=60 -rw=randwrite --time_based --output=rand_write_late.txt |
测试结果示例:

优化策略参数示例
随机IOPS优化:
1、固定基础参数:bs=4k,numjobs=1,runtime=60s,direct=1。
2、调整iodepth:从1→64→256,记录IOPS和延迟,观察IOPS曲线,若IOPS不再增长,停止增加iodepth。
3、增加numjobs:从1→4→8,观察是否进一步压满设备。
4、延长runtime:若怀疑缓存干扰等,可延长至300s或600s等。
顺序吞吐量优化:
1、固定基础参数:bs=1M,numjobs=1,runtime=60s。
2、调整iodepth:从16→64→128,观察带宽。
3、增大bs:若带宽未达预期,尝试bs=2M或4M等。
4、增加numjobs:若设备支持并行大块传输(如RAID),增加并发任务。
5、延长runtime:若怀疑缓存干扰等,可延长至300s或600s等。
逐步调整FIO测试参数,记录相关数值,这样可以反映存储设备在不同压力条件下的性能表现,包括吞吐量极限、并发处理能力和响应延迟等关键指标。
原文链接:Linux磁盘性能测试命令之FIO,转载请注明来源!





