fioFlexible I/O Tester是 Linux/Unix 下最常用的 I/O 基准测试工具用来模拟各种磁盘/存储工作负载顺序读写、随机读写、混合读写、不同 block size、不同并发等。它可以对文件文件系统层或裸设备block 设备进行测试因此既能测文件系统也能测原始磁盘/SSD/NVMe/RAID/云盘的性能。1、理解磁盘性能的关键指标概念bashspan stylebackground-color:#282c34span stylecolor:#abb2bfspan stylecolor:#b18eb1em### IOPSI/O ops/sec/em/span 单位每秒完成的 IO 请求数。与 block size 有直接关系同样 IOPS、较大 block size 更高吞吐量。 span stylecolor:#b18eb1em### 带宽BW/em/span 单位KB/s、MB/s或 MiB/s。BW ≈ IOPS × block_size相同 block_size 时成立。 span stylecolor:#b18eb1em### 延迟latency/em/span fio 报告通常包含slatsubmit latency、clatcompletion latency和 lat总延迟 slat clat。单位通常是 usec微秒或 ms。 span stylecolor:#b18eb1em### 队列深度iodepth/em/span 每个 job 在内核/设备前可以同时挂起的未完成 IO 数。更高 iodepth 可以提高并行性与吞吐但也可能增加延迟。 span stylecolor:#b18eb1em### numjobs / threads/em/span 同时运行的并发 job 数每个 job 又有 iodepth。总并发 numjobs × iodepth近似。 span stylecolor:#b18eb1em### 随机 vs 顺序rand vs seq/em/span 随机 I/O 对 SSD/HDD 的表现差异很大数据库类负载通常更关注 4K 随机读/写和尾延迟。 span stylecolor:#b18eb1em### O_DIRECT / direct1/em/span 绕过内核 page cache测真实设备性能通常测试物理设备时应启用 direct1。 span stylecolor:#b18eb1em### 预热preconditioning/em/span 对 SSD 做随机写测试前要先“预热”设备直到性能稳定否则会测到缓存/擦写放大等非稳态表现。/span/span2、工具主要使用参数--namename测试名称job的名字--filenamepath文件或设备路径例如/mnt/testfile或/dev/nvme0n1 可以是具体的文件位置也可以是设备文件 注意如果写裸设备如/dev/nvme0n1会抹掉数据请注意系统和数据安全测试原始磁盘性能时一定要确认设备是未挂载使用的。 ioenginelibaio时不能对目录并发IO--size1G文件大小或每 job 的目标大小如何合理的设置size的大小如果你只想测设备极限性能,size 可以设得较小比如 1G 或 10G要注意小数据量可能命中缓存如果是评估稳定性能更真实推荐size至少大于设备缓存甚至大于内存容量如果是长时间压力测试带 --time_based一般使用time_based 和runtime60或更久再设一个比较大的size比如设备容量的 50% 或固定 100G/500G数据库OLTP小块随机 IO--size建议 ≥ 内存大小比如 2× 内存避免命中页缓存。日志/队列顺序写--size可以相对小但最好覆盖设备写缓存几 GB 以上。大数据/顺序读写--size建议几十 GB 以上模拟大文件吞吐。虚拟化/分布式存储--size建议设置为设备容量的 30%~50%更接近生产环境。--ioenginelibaio|io_uring|sync|psyncI/O 后端。fio 的核心参数之一决定了 fio 发起 I/O 请求的方式。不同引擎对应着不同的I/O 调用模型fio 在执行 I/O 时需要调用操作系统/库函数来“发请求”不同的ioengine就是不同的 I/O 实现方式比如 同步/异步、系统调用/内核接口、用户态/内核态--direct1使用 O_DIRECT绕过 page cache。--rwread|write|randread|randwrite|randrw|readwriteI/O 模式。--bs4k|1M每个 I/O 的大小block size。小块1K ~ 8K单次 I/O 数据少IOPS 高但吞吐低延迟对业务影响更明显适合模拟数据库OLTP这类小块随机访问。中等块16K ~ 64KIOPS 和吞吐兼顾很多日志型/中等负载业务会落在这里。大块128K ~ 1M 甚至更大单次 I/O 数据大IOPS 低但吞吐高适合模拟顺序扫描、大文件拷贝、大数据分析。--iodepth32队列深度对 libaio、io_uring 有效。每个job任务向IO引擎提交IO请求内核会把请求放入队列最大可挂起32个请求使队列维持32的“飞行深度”配置建议参考如下具体的设置要结合自己的业务场景模式进行重点在于你的场景中更多的关注那些指标。SSDSATA SSD控制器并行度有限一般iodepth32就够超过 64 提升不大。NVMe SSD支持很高队列深度通常 64k但 fio 实测常用范围是1 ~ 256推荐测试点iodepth1, 4, 16, 32, 64, 128看性能和延迟曲线。HDD机械盘物理寻道瓶颈明显高队列深度提升有限iodepth1~4就能看到真实表现再大意义不大。企业存储/RAID/分布式存储建议扫描从小到大1, 4, 16, 32, 64, 128, 256找到性能饱和点。--numjobs4并发 job 数。--time_based/--runtime60以时间为基准运行比如跑 60 秒。默认情况下fio 运行时是“写完多少数据”就结束例如你设定--size1G那么每个 job 会写/读 1GB 后退出。加上--time_basedfio 会忽略--size除非--size比运行时间还小只按时间运行直到--runtime到期才停止也会配合--ramp_time10使用意味着前10 秒不记录结果给设备/缓存“预热”之后才算正式数据--group_reporting合并 job 报告便于查看总吞吐/IOPS。--rwmixread70读写混合时设置读占比适用于randrw。--outputxxx/--output-formatjson把结果导出为文件或 JSON便于自动分析。--buffered1/0是否使用文件系统缓存通常用direct1替代。通常使用--direct1否则你可能只在测内存缓存得到假高的吞吐--fallocate1先用 fallocate 预分配文件避免测试时文件系统分配干扰。3、数据库测试常用推荐测试前必须先理解每个参数的安全性bashspan stylebackground-color:#282c34span stylecolor:#abb2bfspan stylecolor:#b18eb1em### 再次强调注意必须先确定是对文件系统测试还是原始磁盘进行测试保证数据和系统安全(写操作会擦除数据)要知道这个命令实际做的事和测到的性能以及命令执行的风险。/em/span span stylecolor:#b18eb1em# 顺序读8K /em/span fio --filename/data/testfile --direct1 --ioenginelibaio --bs8k \ --iodepth32 --rwspan stylecolor:#e6c07bread/span --size8G --nameseqread_8k \ --time_based --runtime60 --group_reporting 模拟 全表扫描 场景 看 bw带宽和 iops span stylecolor:#b18eb1em# 随机读8K/em/span fio --filename/data/testfile --direct1 --ioenginelibaio --bs8k \ --iodepth32 --numjobs4 --rwrandread --size8G --namerandread_8k \ --time_based --runtime60 --group_reporting 模拟 数据库索引查找、OLTP 查询场景 看 iops数据库性能关键指标 span stylecolor:#b18eb1em# 顺序写8K/em/span fio --filename/data/testfile --direct1 --ioenginelibaio --bs8k \ --iodepth32 --rwwrite --size8G --nameseqwrite_8k \ --time_based --runtime60 --group_reporting 模拟 顺序写 WAL/redo 日志 看带宽和延迟 span stylecolor:#b18eb1em# 随机写8K/em/span fio --filename/data/testfile --direct1 --ioenginelibaio --bs8k \ --iodepth32 --numjobs4 --rwrandwrite --size8G --namerandwrite_8k \ --time_based --runtime60 --group_reporting 模拟 事务更新UPDATE/INSERT 随机写 IOPS 越高数据库事务吞吐越高 span stylecolor:#b18eb1em# 混合读写8K/em/span fio --filename/data/testfile --direct1 --ioenginelibaio --bs8k \ --iodepth32 --numjobs4 --rwrandrw --rwmixread70 --size8G \ --namerandrw_8k --time_based --runtime60 --group_reporting 模拟 真实数据库工作负载70% 读30% 写/span/span测试案例对磁盘原始性能进行测试(新磁盘未挂载需要有一个分区表否则无法随机写和读)顺序写 IOPS22.1k, BW172MiB/s avg1448.66us随机写 IOPS18.6k, BW145MiB/s avg1717.39us顺序读 IOPS81.5k, BW637MiB/s avg391.44us随机读 IOPS57.8k, BW451MiB/s avg552.49usbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/dev/sdb --direct1 --ioenginelibaio --rwwrite --bs8k --iodepth32 --nameseqwrite --size16G --ramp_time10/span/spanbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/dev/sdb --direct1 --ioenginelibaio --rwrandwrite --bs8k --iodepth32 --namerandwrite --size16G --time_based --runtime120 --ramp_time10 /span/spanbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/dev/sdb --direct1 --ioenginelibaio --rwspan stylecolor:#e6c07bread/span --bs8k --iodepth32 --nameseqread --size16G --time_based --runtime120 /span/spanbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/dev/sdb --direct1 --ioenginelibaio --rwrandread --bs8k --iodepth32 --namerandread --size16G --time_based --runtime120 --ramp_time10/span/span直接格式化之后对磁盘进行性能测试文件系统顺序写 IOPS36.5k, BW285MiB/s avg875.11us随机写 IOPS17.8k, BW139MiB/s avg1798.82us顺序读 IOPS71.5k, BW559MiB/s avg446.47us随机读 IOPS61.8k, BW483MiB/s avg516.23usbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/data/xfsfio --direct1 --ioenginelibaio --rwwrite --bs8k --iodepth32 --nameseqwrite --size16G --ramp_time10/span/spanbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/data/xfsfio --direct1 --ioenginelibaio --rwrandwrite --bs8k --iodepth32 --namerandwrite --size16G --time_based --runtime120 --ramp_time10 /span/spanbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/data/xfsfio --direct1 --ioenginelibaio --rwspan stylecolor:#e6c07bread/span --bs8k --iodepth32 --nameseqread --size16G --time_based --runtime120 /span/spanbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/data/xfsfio --direct1 --ioenginelibaio --rwrandread --bs8k --iodepth32 --namerandread --size16G --time_based --runtime120 --ramp_time10/span/span做LVM之后对磁盘进行性能测试文件系统顺序写 IOPS23.6k, BW184MiB/s avg1355.82us随机写 IOPS17.7k, BW138MiB/s avg1803.50us顺序读 IOPS76.6k, BW598MiB/s avg417.03us随机读 IOPS58.0k, BW453MiB/s avg550.26usbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/data/fiotest --direct1 --ioenginelibaio --rwwrite --bs8k --iodepth32 --nameseqwrite --size16G --ramp_time10/span/spanbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/data/fiotest --direct1 --ioenginelibaio --rwrandwrite --bs8k --iodepth32 --namerandwrite --size16G --time_based --runtime120 --ramp_time10 /span/spanbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/data/fiotest --direct1 --ioenginelibaio --rwspan stylecolor:#e6c07bread/span --bs8k --iodepth32 --nameseqread --size16G --time_based --runtime120 /span/spanbashspan stylebackground-color:#282c34span stylecolor:#abb2bffio --filename/data/fiotest --direct1 --ioenginelibaio --rwrandread --bs8k --iodepth32 --namerandread --size16G --time_based --runtime120 --ramp_time10/span/span输出解读bashspan stylebackground-color:#282c34span stylecolor:#abb2bfrandread: (groupid0, span stylecolor:#e6c07bjobs/span4): err 0: pid12345: Thu Sep 5 10:00:00 2025 span stylecolor:#e6c07bread/span: IOPS45300, BW176.95MiB/s (185.55MB/s)(10.00GiB/60001msec) slat (usec): min2, max52, avg3.56, stdev0.76 clat (usec): min10, max2000, avg150.12, stdev50.34 lat (usec): min12, max2002, avg153.68, stdev50.36 clat percentiles (usec): | 1.00th[ 40], 5.00th[ 60], 10.00th[ 80], 50.00th[ 140], | 90.00th[ 200], 95.00th[ 300], 99.00th[ 500], 99.90th[1500] cpu : usr5.00%, sys10.00%, ctx12345, majf0, minf100/span/spanIOPS45300整个组4 个 job 合计的每秒 IO 数。BW176.95MiB/s (185.55MB/s)吞吐量。这里同时给出二进制 MiB/s除以 1024*1024和十进制 MB/s除以 1,000,000。计算示例以便理解IOPS × block_size→45300 × 4096 bytes 185,548,800 bytes/s然后185,548,800 / 1,048,576 176.953125 MiB/s这是上面 176.95MiB/s 的由来。10.00GiB/60001msec测试期间传输了 10GiB用时 ~60.001 秒。slat (usec)submit latency提交延迟即 fio 线程把请求递交给内核所花的时间。通常很小微秒级。clat (usec)completion latency完成延迟即从提交到 IO 完成在设备/内核层面的耗时反映磁盘/控制器延迟与排队延迟。lat (usec)总延迟 slat clat。clat percentiles延迟百分位分布非常重要例如99.90th 1500 usec意味着 99.9% 的 IO 在 1.5ms 内完成尾部 0.1% 的 IO 超过 1.5ms。对于延迟敏感服务这些尾部很关键不能只看平均。cpufio 运行期间的 CPU 使用情况usr/sys/context switches/major/minor faults用于判断是否 CPU 成为瓶颈。⚠️FIO工具进行磁盘测试总结及注意事项①确认自己的测试目标要测试什么文件系统原始磁盘要测试什么性能②选择合适的参数设置怎么样尽可能模拟你需要的场景③理解工具执行的底层逻辑系统调用确保数据安全④测试过程怎样避免干扰保证测试结果真实可靠