存储测试工具FIO使用教程

张开发
2026/4/12 5:34:05 15 分钟阅读

分享文章

存储测试工具FIO使用教程
存储测试工具—FIO文章目录存储测试工具---FIO前言一、FIO是什么二、安装部署1.快速部署-在线2.快速部署-离线3.验证安装二、使用步骤1.参数说明2.使用场景场景一测试裸盘极限性能最常用场景二测试文件系统/目录性能安全模式场景三模拟真实数据库负载3.结果解读四、拓展知识1.配置文件与多任务2.AIO 与 DIO 的区别总结前言‌fioFlexible I/O Tester‌ 是一款开源、跨平台的磁盘 I/O 性能测试工具被广泛誉为“存储性能领域的瑞士军刀”‌一、FIO是什么FIOFlexible I/O Tester是一款功能强大的开源 I/O 性能测试工具它主要用来验证存储系统的性能。通过模拟各种真实的负载场景FIO 能够测量出存储设备的三大核心性能指标IOPS (Input/Output Operations Per Second): 每秒读写次数反映随机读写能力。吞吐量 (Throughput/Bandwidth): 数据传输速率如 MB/s衡量顺序读写性能。 时延 (Latency):I/O 操作的响应时间。二、安装部署1.快速部署-在线CentOS/RHEL:安装命令sudoyuminstallfio-yUbuntu/Debian安装命令:sudoaptupdatesudoaptinstallfio-y2.快速部署-离线安装地址可以根据不同镜像选择 优先建议在线yum安装可以避免很多依赖问题链接: https://pkgs.org/download/fio百度云 通过网盘分享的文件fio-2.1.10.tar.gz链接: https://pan.baidu.com/s/1Zmd20T1qpl9HjP0foYCihQ?pwd8952提取码: 8952filefio-2.1.10.tartar-xvffio-2.1.10.tarcdfio-2.1.10# fio 的旧版本通常不使用 ./configure 脚本而是直接使用 make。# 编译在源码目录下直接运行 makemake# 编译成功后将二进制文件复制到系统路径sudomakeinstall3.验证安装fio--version二、使用步骤1.参数说明参数含义典型取值避坑指南rwI/O 模式read (顺序读), write (顺序写), randread (随机读), randrw (混合读写)测 SSD 极限性能常用 randread测带宽常用 write。bs块大小4k, 1M4k 是测试 IOPS 的标尺模拟数据库1M 是测带宽的标尺模拟大文件拷贝。iodepth队列深度1, 32, 128只有异步引擎如 libaio才有效。深度越大并发压力越大SSD 通常需要 32-128 才能跑满。numjobs并发线程数1, 4, 8模拟多用户同时操作。总并发数 ≈ numjobs × iodepth。可以参考lscpu获取逻辑核心数direct是否绕过缓存1 (绕过), 0 (使用缓存)测试硬件真实性能必须设为 1否则测的是内存速度。2.使用场景场景一测试裸盘极限性能最常用目标测试一块新挂载的数据盘如 /dev/vdb的 4K 随机读取 IOPS。注意对裸盘/dev/vdb操作会清空数据请确保盘是空的代码如下示例fio--namerand_read_test\--ioenginelibaio\--iodepth32\--rwrandread\--bs4k\--direct1\--size10G\--numjobs1\--filename/dev/vdb\--group_reporting场景二测试文件系统/目录性能安全模式目标测试 /data 目录下的顺序写入带宽不破坏磁盘数据。fio--nameseq_write_test\--ioenginelibaio\--iodepth64\--rwwrite\--bs1M\--direct1\--size5G\--numjobs4\--runtime60\--time_based\--filename/data/testfile\--group_reporting场景三模拟真实数据库负载目标模拟 70% 读、30% 写的混合负载。fio--namemix_test\--rwrandrw\--rwmixread70\--bs4k\--ioenginelibaio\--direct1\--size10G\--numjobs2\--iodepth16\--filename./testdbfile\--group_reporting3.结果解读test:(groupid0,jobs1):err0:pid1009622: Fri Apr311:09:392026write:IOPS40,BW40.4MiB/s(42.4MB/s)(71.0GiB/1800002msec);0zone resets slat(usec):min278,max109995,avg24738.15,stdev14921.46clat(usec):min834,max4266.3k,avg3140564.67,stdev315007.80lat(msec):min2,max4293,avg3165.30,stdev316.39clat percentiles(msec):|1.00th[2400],5.00th[2635],10.00th[2769],20.00th[2903],|30.00th[2970],40.00th[3071],50.00th[3138],60.00th[3205],|70.00th[3306],80.00th[3373],90.00th[3540],95.00th[3675],|99.00th[3910],99.50th[3977],99.90th[4144],99.95th[4178],|99.99th[4245]bw(KiB/s):min6144,max102400,per4.16%,avg41407.70,stdev8756.79,samples3585iops:min6,max100,avg40.06,stdev8.54,samples3585lat(usec):10000.01% lat(msec):40.01%,1000.01%,2500.01%,5000.01%,7500.02% lat(msec):10000.01%,20000.05%,200099.90% cpu:usr0.31%,sys61.70%,ctx40603,majf0,minf180694IO depths:10.1%,20.1%,40.1%,80.1%,160.1%,320.1%,6499.9% submit:00.0%,4100.0%,80.0%,160.0%,320.0%,640.0%,640.0% complete:00.0%,4100.0%,80.0%,160.0%,320.0%,640.0%,640.1% issued rwts:total0,72731,0,0short0,0,0,0dropped0,0,0,0 latency:target0,window0,percentile100.00%,depth128Run status group0(alljobs): WRITE:bw973MiB/s(1020MB/s),40.3MiB/s-40.8MiB/s(42.3MB/s-42.8MB/s),io1710GiB(1836GB),run1800002-1800028msecFIO 输出的一大堆数据重点看这三行 **read/write: IOPSxxxx** 含义 每秒处理多少次 I/O 请求。 关注点 4K 随机读写时这个数值最重要。数值越大磁盘处理细碎文件的能力越强。 **bwxxxx MiB/s** 含义 带宽/吞吐量。 关注点 1M 顺序读写时关注这个数值。它代表大文件拷贝的速度。 **lat (usec/msec)** 含义 延迟。 关注点 avg 是平均延迟max 是最大延迟。对于数据库应用延迟越低越好通常要求毫秒级甚至微秒级。四、拓展知识1.配置文件与多任务当参数太多命令行敲不下时大神都会写配置文件例如 test.fio。编写配置文件创建一个 test.fio 文件此处vXX代替实际盘符谨慎写盘符避免擦除用户数据[global]ioenginelibaiodirect1runtime60time_based group_reporting# 任务1测随机读[rand_read]rwrandreadbs4kiodepth32filename/dev/vXX# 任务2测顺序写[seq_write]rwwritebs1Miodepth16filename/dev/vXX执行命令fio test.fio这样就能同时测试两块盘或者同一个盘的不同性能指标。2.AIO 与 DIO 的区别AIO 和 DIO 是两个不同层面的概念但在 FIO 测试中紧密相关。AIO (Asynchronous I/O - 异步I/O):这是一种 I/O 模型。使用 AIO 时应用程序发出 I/O 请求后会立即返回继续执行其他任务而无需等待 I/O 操作完成。操作系统会在后台处理这些请求并在完成后通知应用程序。这使得应用程序可以并发地处理大量 I/O 操作极大地提升了效率。在 FIO 中通过 ioenginelibaio 来使用 Linux 的异步 I/O 引擎。DIO (Direct I/O - 直接I/O):这是一种 I/O 访问方式。通常情况下对文件的读写会经过操作系统的 Page Cache页缓存。DIO 则会绕过这个缓存层直接在应用程序缓冲区和存储设备之间传输数据。目的测试 DIO 的主要目的是为了绕过操作系统缓存直接测量存储设备本身的真实性能避免缓存对测试结果的干扰。实现在 FIO 中通过设置 direct1 来启用直接 I/O。简单来说AIO 决定了“怎么发请求”异步地、不等待而 DIO 决定了“数据走哪条路”绕过缓存、直达磁盘。一个完整的性能测试通常会结合两者即使用异步 I/O 引擎进行直接 I/O 测试。1. 测试 DIO (Direct I/O) 性能这条命令旨在测试绕过系统缓存后存储设备本身的性能。这是进行存储基准测试时的标准做法。fio-nametest\-filename/mnt/volume1/dio\-ioenginelibaio\-direct1\-bs1m\-iodepth128\-rwwrite\-numjobs8\-runtime100000\-time_based\-size200GBList item核心参数 direct1 启用了直接 I/O。测试目的 测量存储设备在 1MB 块大小、128 队列深度、8 个并发线程下的顺序写入吞吐量。2. 测试 Buffered I/O (缓存I/O) 性能“aio” 实际上是测试 Buffered I/O 的性能。因为它缺少了 direct1 参数所以 I/O 会经过操作系统的 Page Cache。fio-nametest\-filename/mnt/volume1/aio\-ioenginelibaio\-direct0\-bs1m\-iodepth128\-rwwrite\-numjobs8\-runtime100000\-time_based\-size200GB添加了 -direct0 以明确这是 Buffered I/O 测试。测试目的 这种测试衡量的是应用程序在实际运行中可能体验到的性能因为它包含了操作系统缓存带来的加速效果。对于读操作如果数据能被缓存性能会非常高。参数解读bs1m: 1MB 的块大小通常用于测试顺序读写的吞吐量。iodepth128: 较大的队列深度用于向存储设备施加足够压力以测出其峰值性能。numjobs8: 模拟多线程并发访问的场景。runtime 和 time_based: 确保测试运行足够长的时间以获得稳定的结果。重要提醒⚠️1. 数据安全红线如果 filename 指向的是裸设备如 /dev/sdbFIO 会直接覆盖数据没有任何回收站测试前务必执行 lsblk 确认盘符确保没有挂载重要数据。2. 缓存陷阱一定要加–direct1。如果不加你测出来的速度可能是几百 GB/s那是你的内存速度不是硬盘速度。3. 时间陷阱测试时间不要太短。建议至少跑60 秒以上让 SSD 的控制器进入稳定状态。4. IO 引擎选择Linux 下首选 ioenginelibaio异步。如果测延迟极低的情况可以用 ioenginesync同步。总结以上就是今天要分享的内容本文仅仅简单介绍了FIO的使用工具还有更多使用方法可以探索欢迎大家一起学习交流~~~

更多文章