1. 为什么需要FIO磁盘性能测试刚接手一台新服务器时很多工程师都会遇到这样的困惑这台设备的磁盘性能到底如何它能承受多大的IO压力在实际业务场景中会不会成为瓶颈这些问题看似简单但如果没有专业的工具和方法很难给出准确的答案。FIOFlexible I/O Tester就是为解决这些问题而生的专业工具。作为一个开源的磁盘性能测试工具FIO可以模拟各种真实的I/O负载帮助我们全面评估存储设备的性能表现。与dd、hdparm等简单工具不同FIO提供了极其丰富的参数配置能够精确模拟数据库OLTP、大数据顺序读写、混合负载等不同业务场景下的I/O特征。我在实际工作中发现很多团队在评估存储性能时存在两个极端要么过于依赖厂商提供的理论性能数据要么使用过于简单的测试方法导致结果失真。FIO正好填补了这个空白它既专业又灵活可以生成接近真实业务场景的负载模型。比如我们可以用FIO模拟MySQL的随机读写模式或者Hadoop的顺序大文件读写甚至电商秒杀场景下的突发IO压力。2. FIO的安装与配置2.1 安装前的准备工作在安装FIO之前建议先检查系统是否已经安装了旧版本。我遇到过不少案例是因为系统自带的FIO版本太老导致某些新特性无法使用。可以通过以下命令检查rpm -qa | grep fio # 或者 fio --version如果发现旧版本建议先卸载再安装新版。卸载命令如下yum remove fio -y # 或者 rpm -e fio2.2 三种安装方式详解2.2.1 源码编译安装源码安装虽然步骤稍多但能获得最新版本和完整功能。我通常从GitHub获取最新源码wget https://github.com/axboe/fio/archive/refs/tags/fio-3.33.tar.gz tar -zxvf fio-3.33.tar.gz cd fio-3.33 ./configure make make install源码安装的一个常见问题是依赖缺失。如果configure阶段报错可能需要安装以下开发包yum install -y libaio-devel zlib-devel libpmem-devel librbd-devel2.2.2 RPM包安装对于生产环境我更推荐RPM安装方式因为它更稳定且易于管理。CentOS 7/8的RPM包可以从官方仓库获取# CentOS 7 wget http://mirror.centos.org/centos/7/os/x86_64/Packages/fio-3.7-2.el7.x86_64.rpm yum install libaio-devel rpm -ivh fio-3.7-2.el7.x86_64.rpm # CentOS 8 dnf install -y fio2.2.3 YUM直接安装虽然最简单但YUM仓库中的版本往往较旧yum install -y fio安装完成后建议运行简单测试验证安装是否成功fio --nametest --ioenginesync --rwread --bs4k --size1M --numjobs13. FIO核心参数详解3.1 基本参数解析FIO的参数看起来很多但实际常用的也就十几个。下面是我总结的关键参数rw读写模式这是最重要的参数之一。常见选项包括read顺序读write顺序写randread随机读randwrite随机写rw/randrw混合读写ioengineIO引擎决定了FIO如何下发IO请求。生产环境最常用的是libaio异步IO其他还有sync同步、mmap等。direct是否绕过系统缓存。性能测试时一定要设为1direct IO否则会受到缓存影响。iodepthIO队列深度这个参数对性能影响极大。SSD建议32-128HDD建议8-32。3.2 高级参数配置除了基本参数还有一些高级参数可以帮助我们更精确地模拟真实场景rwmixread/rwmixwrite在混合读写模式下控制读写比例。例如模拟数据库70%读30%写rwrandrw rwmixread70 rwmixwrite30time_based即使指定了size也按runtime时间运行测试。这对于稳定性测试很有用。ramp_time测试前预热时间让磁盘进入稳定状态。group_reporting汇总显示所有线程的统计信息而不是单独显示每个线程。4. 典型测试场景实战4.1 数据库OLTP场景模拟数据库工作负载通常以随机小IO为主。下面是一个模拟MySQL OLTP负载的测试案例fio --namemysql_oltp \ --filename/dev/nvme0n1 \ --ioenginelibaio \ --direct1 \ --rwrandrw \ --rwmixread70 \ --bs8k \ --iodepth32 \ --numjobs4 \ --runtime300 \ --group_reporting关键点解析使用4个并发线程numjobs4模拟多连接8k块大小是InnoDB页的典型大小70/30的读写比例是OLTP常见场景32的队列深度可以充分挖掘NVMe SSD性能4.2 大数据顺序读写测试Hadoop、Spark等大数据应用通常是大块顺序读写。测试命令示例fio --namehadoop_seq \ --filename/dev/sdb \ --ioenginelibaio \ --direct1 \ --rwwrite \ --bs1M \ --iodepth8 \ --numjobs1 \ --size100G \ --group_reporting这里使用1MB的大块和较浅的队列深度8因为HDD对队列深度不敏感。如果是SSD可以适当增加iodepth到16或32。4.3 混合负载稳定性测试电商大促等场景需要测试系统在混合负载下的稳定性fio --namemixed_load \ --filename/dev/nvme0n1 \ --ioenginelibaio \ --direct1 \ --rwrandrw \ --rwmixread50 \ --bsrange4k-64k \ --iodepth64 \ --numjobs8 \ --runtime3600 \ --time_based \ --group_reporting这个测试有几个特点运行1小时3600秒测试稳定性块大小从4k到64k随机变化8个并发线程模拟多用户50/50的读写比例模拟平衡负载5. 结果分析与性能监控5.1 理解FIO输出报告FIO的输出报告包含丰富的信息关键指标包括IOPS每秒IO操作数对随机小IO很重要带宽MB/s对大块顺序IO很重要延迟包括平均、最小、最大延迟CPU使用率高IO压力下的CPU开销示例报告片段read: IOPS78.3k, BW306MiB/s write: IOPS26.1k, BW102MiB/s cpu : usr12.34%, sys56.78%, ctx123456, majf0, minf05.2 使用iostat实时监控在FIO测试过程中建议另开终端用iostat监控实时性能iostat -xm 1关键指标解读%util设备利用率接近100%表示饱和await平均IO等待时间mssvctm设备处理IO的平均时间msavgqu-sz平均队列长度5.3 生成可视化报告对于长期性能跟踪可以将FIO结果导入Gnuplot生成趋势图fio --output-formatjson --outputresult.json jobfile.fio gnuplot fio-graph.gp6. 常见问题排查6.1 测试结果异常低如果测试结果远低于预期可以检查是否忘记设置direct1导致测试的是缓存性能文件系统是否启用了压缩/去重RAID卡是否配置了写缓存WB模式磁盘是否已经接近满导致性能下降6.2 系统资源成为瓶颈有时磁盘本身还没到极限但系统资源先耗尽了CPU不足检查iostat中的%sys是否过高内存不足free -h查看可用内存中断不均衡cat /proc/interrupts查看中断分布6.3 测试环境一致性为确保测试结果可比性建议每次测试前清空缓存echo 3 /proc/sys/vm/drop_caches避免在测试期间运行其他IO密集型任务对于云盘测试注意避免邻居效应影响7. 进阶技巧与最佳实践7.1 使用配置文件管理测试对于复杂的测试场景建议使用配置文件代替命令行参数。例如创建mysql_oltp.fio[global] ioenginelibaio direct1 runtime300 group_reporting [oltp-read] rwrandread bs8k iodepth32 filename/dev/nvme0n1 [oltp-write] rwrandwrite bs8k iodepth32 filename/dev/nvme0n1然后运行fio mysql_oltp.fio7.2 多设备并行测试对于多盘系统如Ceph、RAID可以并行测试多个设备fio --namemultidisk \ --filename/dev/sdb:/dev/sdc:/dev/sdd \ --ioenginelibaio \ --direct1 \ --rwrandrw \ --bs4k \ --iodepth32 \ --numjobs4 \ --runtime600 \ --group_reporting7.3 长期稳定性测试对于生产环境建议进行24小时以上的长期测试检查性能是否会出现波动或下降。可以使用time_based参数fio --namelongtest \ --runtime86400 \ --time_based \ ...7.4 真实业务场景模拟最理想的测试是直接录制生产环境的IO模式然后通过FIO回放。这需要使用blktrace录制IO模式转换为FIO可以理解的格式使用replay_ioengine进行回放虽然复杂但能得到最真实的性能数据。
从零到一:FIO磁盘性能测试工具的实战部署与场景化应用
发布时间:2026/6/28 22:07:07
1. 为什么需要FIO磁盘性能测试刚接手一台新服务器时很多工程师都会遇到这样的困惑这台设备的磁盘性能到底如何它能承受多大的IO压力在实际业务场景中会不会成为瓶颈这些问题看似简单但如果没有专业的工具和方法很难给出准确的答案。FIOFlexible I/O Tester就是为解决这些问题而生的专业工具。作为一个开源的磁盘性能测试工具FIO可以模拟各种真实的I/O负载帮助我们全面评估存储设备的性能表现。与dd、hdparm等简单工具不同FIO提供了极其丰富的参数配置能够精确模拟数据库OLTP、大数据顺序读写、混合负载等不同业务场景下的I/O特征。我在实际工作中发现很多团队在评估存储性能时存在两个极端要么过于依赖厂商提供的理论性能数据要么使用过于简单的测试方法导致结果失真。FIO正好填补了这个空白它既专业又灵活可以生成接近真实业务场景的负载模型。比如我们可以用FIO模拟MySQL的随机读写模式或者Hadoop的顺序大文件读写甚至电商秒杀场景下的突发IO压力。2. FIO的安装与配置2.1 安装前的准备工作在安装FIO之前建议先检查系统是否已经安装了旧版本。我遇到过不少案例是因为系统自带的FIO版本太老导致某些新特性无法使用。可以通过以下命令检查rpm -qa | grep fio # 或者 fio --version如果发现旧版本建议先卸载再安装新版。卸载命令如下yum remove fio -y # 或者 rpm -e fio2.2 三种安装方式详解2.2.1 源码编译安装源码安装虽然步骤稍多但能获得最新版本和完整功能。我通常从GitHub获取最新源码wget https://github.com/axboe/fio/archive/refs/tags/fio-3.33.tar.gz tar -zxvf fio-3.33.tar.gz cd fio-3.33 ./configure make make install源码安装的一个常见问题是依赖缺失。如果configure阶段报错可能需要安装以下开发包yum install -y libaio-devel zlib-devel libpmem-devel librbd-devel2.2.2 RPM包安装对于生产环境我更推荐RPM安装方式因为它更稳定且易于管理。CentOS 7/8的RPM包可以从官方仓库获取# CentOS 7 wget http://mirror.centos.org/centos/7/os/x86_64/Packages/fio-3.7-2.el7.x86_64.rpm yum install libaio-devel rpm -ivh fio-3.7-2.el7.x86_64.rpm # CentOS 8 dnf install -y fio2.2.3 YUM直接安装虽然最简单但YUM仓库中的版本往往较旧yum install -y fio安装完成后建议运行简单测试验证安装是否成功fio --nametest --ioenginesync --rwread --bs4k --size1M --numjobs13. FIO核心参数详解3.1 基本参数解析FIO的参数看起来很多但实际常用的也就十几个。下面是我总结的关键参数rw读写模式这是最重要的参数之一。常见选项包括read顺序读write顺序写randread随机读randwrite随机写rw/randrw混合读写ioengineIO引擎决定了FIO如何下发IO请求。生产环境最常用的是libaio异步IO其他还有sync同步、mmap等。direct是否绕过系统缓存。性能测试时一定要设为1direct IO否则会受到缓存影响。iodepthIO队列深度这个参数对性能影响极大。SSD建议32-128HDD建议8-32。3.2 高级参数配置除了基本参数还有一些高级参数可以帮助我们更精确地模拟真实场景rwmixread/rwmixwrite在混合读写模式下控制读写比例。例如模拟数据库70%读30%写rwrandrw rwmixread70 rwmixwrite30time_based即使指定了size也按runtime时间运行测试。这对于稳定性测试很有用。ramp_time测试前预热时间让磁盘进入稳定状态。group_reporting汇总显示所有线程的统计信息而不是单独显示每个线程。4. 典型测试场景实战4.1 数据库OLTP场景模拟数据库工作负载通常以随机小IO为主。下面是一个模拟MySQL OLTP负载的测试案例fio --namemysql_oltp \ --filename/dev/nvme0n1 \ --ioenginelibaio \ --direct1 \ --rwrandrw \ --rwmixread70 \ --bs8k \ --iodepth32 \ --numjobs4 \ --runtime300 \ --group_reporting关键点解析使用4个并发线程numjobs4模拟多连接8k块大小是InnoDB页的典型大小70/30的读写比例是OLTP常见场景32的队列深度可以充分挖掘NVMe SSD性能4.2 大数据顺序读写测试Hadoop、Spark等大数据应用通常是大块顺序读写。测试命令示例fio --namehadoop_seq \ --filename/dev/sdb \ --ioenginelibaio \ --direct1 \ --rwwrite \ --bs1M \ --iodepth8 \ --numjobs1 \ --size100G \ --group_reporting这里使用1MB的大块和较浅的队列深度8因为HDD对队列深度不敏感。如果是SSD可以适当增加iodepth到16或32。4.3 混合负载稳定性测试电商大促等场景需要测试系统在混合负载下的稳定性fio --namemixed_load \ --filename/dev/nvme0n1 \ --ioenginelibaio \ --direct1 \ --rwrandrw \ --rwmixread50 \ --bsrange4k-64k \ --iodepth64 \ --numjobs8 \ --runtime3600 \ --time_based \ --group_reporting这个测试有几个特点运行1小时3600秒测试稳定性块大小从4k到64k随机变化8个并发线程模拟多用户50/50的读写比例模拟平衡负载5. 结果分析与性能监控5.1 理解FIO输出报告FIO的输出报告包含丰富的信息关键指标包括IOPS每秒IO操作数对随机小IO很重要带宽MB/s对大块顺序IO很重要延迟包括平均、最小、最大延迟CPU使用率高IO压力下的CPU开销示例报告片段read: IOPS78.3k, BW306MiB/s write: IOPS26.1k, BW102MiB/s cpu : usr12.34%, sys56.78%, ctx123456, majf0, minf05.2 使用iostat实时监控在FIO测试过程中建议另开终端用iostat监控实时性能iostat -xm 1关键指标解读%util设备利用率接近100%表示饱和await平均IO等待时间mssvctm设备处理IO的平均时间msavgqu-sz平均队列长度5.3 生成可视化报告对于长期性能跟踪可以将FIO结果导入Gnuplot生成趋势图fio --output-formatjson --outputresult.json jobfile.fio gnuplot fio-graph.gp6. 常见问题排查6.1 测试结果异常低如果测试结果远低于预期可以检查是否忘记设置direct1导致测试的是缓存性能文件系统是否启用了压缩/去重RAID卡是否配置了写缓存WB模式磁盘是否已经接近满导致性能下降6.2 系统资源成为瓶颈有时磁盘本身还没到极限但系统资源先耗尽了CPU不足检查iostat中的%sys是否过高内存不足free -h查看可用内存中断不均衡cat /proc/interrupts查看中断分布6.3 测试环境一致性为确保测试结果可比性建议每次测试前清空缓存echo 3 /proc/sys/vm/drop_caches避免在测试期间运行其他IO密集型任务对于云盘测试注意避免邻居效应影响7. 进阶技巧与最佳实践7.1 使用配置文件管理测试对于复杂的测试场景建议使用配置文件代替命令行参数。例如创建mysql_oltp.fio[global] ioenginelibaio direct1 runtime300 group_reporting [oltp-read] rwrandread bs8k iodepth32 filename/dev/nvme0n1 [oltp-write] rwrandwrite bs8k iodepth32 filename/dev/nvme0n1然后运行fio mysql_oltp.fio7.2 多设备并行测试对于多盘系统如Ceph、RAID可以并行测试多个设备fio --namemultidisk \ --filename/dev/sdb:/dev/sdc:/dev/sdd \ --ioenginelibaio \ --direct1 \ --rwrandrw \ --bs4k \ --iodepth32 \ --numjobs4 \ --runtime600 \ --group_reporting7.3 长期稳定性测试对于生产环境建议进行24小时以上的长期测试检查性能是否会出现波动或下降。可以使用time_based参数fio --namelongtest \ --runtime86400 \ --time_based \ ...7.4 真实业务场景模拟最理想的测试是直接录制生产环境的IO模式然后通过FIO回放。这需要使用blktrace录制IO模式转换为FIO可以理解的格式使用replay_ioengine进行回放虽然复杂但能得到最真实的性能数据。