使用FIO对含有数据的磁盘进行压力测试可能会导致文件系统异常和数据丢失,因此正确的使用FIO很重要。FIO(Flexible I/O Tester)是一款功能强大的开源 I/O 性能测试工具,广泛应用于存储设备的性能评估和验证。它支持包括 libaio、sync、posixaio 等在内的多种 I/O 引擎,能够模拟各种真实的负载场景。
无论是评测新硬件的极限性能,还是诊断生产环境的存储瓶颈,FIO 都能提供详尽的数据支持。通过合理的参数配置,你可以测量出存储设备的三大核心指标:IOPS(每秒读写次数)、吞吐量(数据传输速率)和时延(响应时间)。
进行 FIO 测试绝非简单地运行一条命令,周密的前期准备是确保测试安全、有效的基础。首要原则是保证数据安全。
官方文档多次强烈警告:切勿在存有重要数据的磁盘上进行测试。测试对象最好是新创建的空数据盘。
如果必须在已有磁盘上测试,务必提前创建快照或完成数据备份。需要特别注意的是,操作系统所在的系统盘绝对不能作为测试对象。
确定测试磁盘后,需要准确识别其设备名称。在 Linux 系统中,可以使用 `sudo fdisk lu` 命令来查看所有块存储设备。接着,使用 `sudo blkid` 命令检查目标设备是否已有分区和文件系统。
理想的测试对象是像 `/dev/vdc` 这样回显信息为空的裸设备,这表明它没有文件系统,测试最直接。
在准备工作完成后,下一步是在待测系统上安装 FIO 及其依赖。对于常见的 Alibaba Cloud Linux、CentOS 或 RHEL 系统,安装命令是 :
sudo yum install libaio libaiodevel fio y
如果是 Debian 或 Ubuntu 系统,则使用
sudo aptget update
和
sudo aptget install libaio* fio y
安装完成后,理解 FIO 的核心参数是设计测试场景的关键。这些参数共同定义了测试负载的性质:
`ioengine`:指定 I/O 引擎。`libaio` 是 Linux 上常用的异步 I/O 引擎,也是性能测试的推荐选择。
`rw`:定义读写模式。常见选项有顺序读(`read`)、顺序写(`write`)、随机读(`randread`)、随机写(`randwrite`)以及混合读写(`randrw`)。
`bs`(blocksize):每次 I/O 请求的数据块大小。例如,`4k` 小块常用于模拟数据库负载,`128k` 或 `1m` 大块则用于测试顺序吞吐带宽。
`iodepth`:I/O 队列深度。它决定了系统同时能向磁盘提交多少个 I/O 请求。深度为 1 常用于测试延迟,增加深度可以提升压力以测量峰值 IOPS。
`direct`:是否启用直接 I/O。设置为 1 时,数据将绕过操作系统缓存直接写入磁盘,这能测得存储设备本身的真实性能。
掌握了参数含义,就可以组合它们来执行具体的性能测试了。测试通常需要切换到一个合适的目录,例如 `/tmp`,然后运行相应的 FIO 命令。
不同的测试目标对应不同的参数组合。如果你想测试一块云盘的最大随机写 IOPS,可以使用类似下面的命令:
sudo fio direct=1 iodepth=128 rw=randwrite ioengine=libaio bs=4k size=1G numjobs=1 runtime=1000 group_reporting filename=/dev/your_device name=Rand_Write_Testing
其中,`iodepth=128` 和 `bs=4k` 是获得高 IOPS 的关键,`runtime=1000` 确保测试持续 1000 秒以获得稳定结果。
若要测试云盘的顺序读吞吐量,则需要将块大小调大,并采用顺序读模式:
sudo fio direct=1 iodepth=64 rw=read ioengine=libaio bs=1024k size=1G numjobs=1 runtime=1000 group_reporting filename=/dev/your_device name=Read_PPS_Testing
对于延迟这一敏感指标,测试时需要将队列深度降至 1,以排除排队带来的影响:
sudo fio direct=1 iodepth=1 rw=randread ioengine=libaio bs=4k size=1G numjobs=1 group_reporting filename=/dev/your_device name=Rand_Read_Latency_Testing
命令执行完毕后,FIO 会输出详细的测试报告。你需要关注几个关键行:`IOPS=` 后面的数值即每秒读写次数;`BW=`(Bandwidth)后面的数值表示吞吐量,单位通常是 MiB/s 或 KiB/s;而 `lat (usec)` 相关的数据则揭示了延迟信息,包括平均延迟、最大延迟等重要 percentile 延迟数据(如 clat 的第 99.00 百分位)。
除了基础的读写测试,FIO 还能模拟更复杂的真实场景。例如,你可以使用 `rw=randrw` 并配合 `rwmixread=70` 参数来模拟一个读写混合比为 70% 读、30% 写的数据库类型负载。
通过调整 `numjobs` 参数可以增加并发任务数,模拟多线程应用的访问模式。
在测试过程中,有若干注意事项需要时刻牢记。测试具有破坏性,完成后,如果测试盘需要保留使用,必须重新初始化(创建分区和文件系统)。
所有性能测试结果都依赖于特定的测试环境,仅供参考。在生产环境中,性能会受到网络、并发访问量等多种因素影响。
建议在测试时,从较小的 `bs`(如 4k)和较低的 `iodepth` 开始,逐步增加压力,观察性能曲线的变化。对于企业级测试,StorageReview 等机构甚至会对设备进行长达 612 小时的预处理,让设备达到稳定状态后再进行正式测量,以获得最具代表性的数据。
完成测试后,面对全新的空白数据盘,技术人员的做法是重新初始化并创建文件系统。而面对屏幕上滚过的 IOPS、带宽和微妙级延迟数据,他们看到的是一张存储系统的精准画像。
推荐文章
