很多业务系统上了云之后,数据库查询突然变慢,日志写入频繁卡顿,排查到最后发现瓶颈居然出在磁盘IO上。云厂商宣传页上写的IOPS和带宽指标是理论峰值,实际能不能跑出来,还得自己动手测。fio是一款开源的IO压力测试工具,功能强大且跨平台,本文就围绕Windows云服务器,讲清楚fio的安装、参数配置以及测试脚本的完整编写过程。

一、Windows环境下fio的安装与准备
fio官方原生版本主要面向Linux,但在Windows上可以通过两种方式运行。第一种是直接下载fio的Windows编译版,解压后即可使用,比如把压缩包解压到C:\fio目录,然后在命令行中进入C:\fio\fio-3.xx目录执行fio.exe。第二种方式是通过MSYS2环境自行编译,这种方式适合对版本有特殊要求的用户,普通场景用编译版就够了。
安装完成后,建议先把C:\fio\fio-3.xx添加到系统环境变量PATH中,这样在任何目录下都能直接调用fio命令。配置方法是打开系统属性中的环境变量设置,在Path变量里追加C:\fio\fio-3.xx路径,然后重启命令行窗口生效。验证安装是否成功,可以执行以下命令:
fio --version
如果正确输出版本号,说明环境已经就绪。需要注意的是,Windows版本fio基于cygwin环境,部分参数行为与Linux版略有差异,比如native AIO引擎在Windows上不可用,一般使用windowsaio引擎替代,这一点在后续写脚本时会用到。
二、fio核心参数详解
写脚本之前必须先理解常用参数的含义,否则测出来的数据没有参考价值。fio的参数非常多,日常测试主要关注以下几类。
第一类是基础定义参数。--filename指定测试目标文件或裸设备路径,Windows下比如写成C:\fio_test\testfile.dat;--size定义测试文件大小,建议设置为内存的2倍以上以减少缓存影响;--direct=1表示绕过系统缓存直接读写磁盘,这是拿到真实性能数据的关键,漏掉这个参数测出来的往往是内存速度。
第二类是负载模式参数。--rw决定读写模式,常见取值有read(顺序读)、write(顺序写)、randread(随机读)、randwrite(随机写)、readwrite(混合读写);--bs设定块大小,比如4k适合模拟数据库小IO场景,1m适合衡量大文件吞吐;--iodepth控制队列深度,云硬盘通常需要设置到32甚至更高才能压出极限IOPS;--numjobs指定并发线程数。
第三类是统计相关参数。--runtime设置测试时长,--time_based表示即使文件写完也持续跑满设定时间,--group_reporting把多线程结果汇总输出,方便看整体数据。另外建议加上--name给每个任务命名,输出报告时能清楚区分。
三、编写完整的批处理测试脚本
Windows下自动化测试一般用批处理脚本封装。下面这个脚本依次执行顺序读、顺序写、随机读、随机写四组测试,每组60秒,并自动清理测试文件。把脚本保存为C:\fio_test\run_fio_test.bat,双击或在命令行执行即可。
@echo off setlocal enabledelayedexpansion rem 测试目录,请确保该目录位于被测磁盘上 set TEST_DIR=C:\fio_test set FIO_CMD=fio set TEST_FILE=%TEST_DIR%\testfile.dat if not exist %TEST_DIR% mkdir %TEST_DIR% echo ========================================== echo 1/4 顺序读测试 (1M块, 队列深度32) echo ========================================== %FIO_CMD% --name=seq_read --filename=%TEST_FILE% --size=8G --bs=1M --rw=read --direct=1 --iodepth=32 --numjobs=4 --runtime=60 --time_based --group_reporting --ioengine=windowsaio echo ========================================== echo 2/4 顺序写测试 (1M块, 队列深度32) echo ========================================== %FIO_CMD% --name=seq_write --filename=%TEST_FILE% --size=8G --bs=1M --rw=write --direct=1 --iodepth=32 --numjobs=4 --runtime=60 --time_based --group_reporting --ioengine=windowsaio echo ========================================== echo 3/4 随机读测试 (4K块, 队列深度32) echo ========================================== %FIO_CMD% --name=rand_read --filename=%TEST_FILE% --size=8G --bs=4K --rw=randread --direct=1 --iodepth=32 --numjobs=4 --runtime=60 --time_based --group_reporting --ioengine=windowsaio echo ========================================== echo 4/4 随机写测试 (4K块, 队列深度32) echo ========================================== %FIO_CMD% --name=rand_write --filename=%TEST_FILE% --size=8G --bs=4K --rw=randwrite --direct=1 --iodepth=32 --numjobs=4 --runtime=60 --time_based --group_reporting --ioengine=windowsaio echo 测试完成,正在清理测试文件... del %TEST_FILE% echo 全部测试结束 pause
脚本中有几个细节值得说明。首先是ioengine=windowsaio,这是Windows平台专用的异步IO引擎,不指定的话fio可能默认使用sync引擎,压不出高队列深度下的真实性能。其次是numjobs设为4配合iodepth=32,总的并发IO请求数达到128,对于SSD云盘这种量级比较合适,如果你用的是高IOPS的ESSD盘,可以把两者继续调高。
如果想把结果保存下来做对比,可以在每条fio命令末尾追加>> %TEST_DIR%\result.txt,或者使用--output-format=json --output=result.json输出结构化数据,方便后续用脚本提取IOPS和带宽指标做趋势分析。
四、结果解读与常见坑
测试跑完之后,重点看输出报告里的几个核心指标:IOPS表示每秒IO操作次数,随机场景主要看它;BW即带宽吞吐量,顺序场景主要看它;lat统计的是延迟,其中clat percentile里的99.00th percentile分位延迟对评估业务体验特别有参考价值,平均值好看但P99延迟很高,说明性能抖动严重。
实际测试中有几个坑需要避开。第一个是不加direct=1就去测,结果测的是缓存,数据虚高得离谱。第二个是测试文件size设得太大把C盘塞满,系统盘被占满可能导致云服务器卡死甚至远程连接断开,建议测试目录放在数据盘,并预留足够空间。第三个是测试时机问题,刚创建的云盘可能有预热过程,特别是某些低价存储类型,前几十秒性能爬升,建议先跑一次预热测试再取正式数据。
最后提醒一点,压测本身属于重负载操作,生产环境的云服务器上执行前务必评估影响,最好在业务低峰期或者临时实例上进行。把脚本保存好,换新机型或者扩容云盘后跑一遍,性能变化一目了然,这比看厂商参数表靠谱得多。
fio测试脚本磁盘IO性能测试Windows云服务器修改时间:2026-09-06 11:04:37