fio是服务器行业里公认的存储性能测试工具,全称Flexible I/O Tester,它通过模拟真实业务的各种读写动作,把硬盘、SSD或云盘的极限性能一五一十地测出来。
在服务器选型、数据库部署、云盘规格评估这些场景里,fio几乎是躲不开的“试金石”,比起直接拷文件或者看官方标称值,fio能给出更接近真实负载的数据,这也是它被运维、架构师和存储工程师当成默认工具的原因。
服务器行业为什么认准fio
早年测磁盘性能,大家习惯用 dd 或者 hdparm,它们虽然快,但只能测一个简单的顺序流,而且受操作系统缓存影响很大,测出来的数字跟实际业务压力完全不是一回事,fio不一样,它允许你自定义线程数、队列深度、块大小、读写比例、运行时长,甚至还能模拟数据库那种随机小IO的压力,业内专家指出,在存储调优场景里,fio的测试结果更贴近生产环境的表现。
fio的另一个优势是跨平台,Linux、Windows、BSD都能跑,而且几乎每个发行版都有现成的包,服务器行业里,不管是物理机用SAS盘、NVMe盘,还是虚拟机挂载云盘,fio都是同一套语法,免去了一堆学习成本,你会发现很多云厂商提供的性能指标图,里面底层用的就是fio。
服务器性能测试fio怎么用才靠谱
fio本身是个命令行工具,参数很多,但核心逻辑不复杂,它需要你告诉它:测什么设备、多大块、顺序还是随机、读还是写、跑多久、用多少并发,下面这套操作步骤,可以在大多数Linux服务器上直接跑起来。
安装fio的两种方式
第一,用包管理器安装,CentOS、RHEL、Rocky Linux系用 yum install fio -y,Ubuntu、Debian系用 apt install fio -y,这是最省事的方式,装完版本一般够用。
第二,源码编译,如果系统源里的fio版本太旧,或者想用最新特性,可以从官方仓库拉源码手动编译,步骤大致是:
- 克隆源码:
git clone https://github.com/axboe/fio.git - 进入目录:
cd fio - 生成构建系统:
./configure - 编译并安装:
make && make install
源码安装的好处是可以调整编译选项,比如启用特定的异步IO引擎,但一般场景不推荐折腾。

常用参数拆解,先用最简单的随机读
一条最基础的fio命令长这样:
fio --name=test --rw=randread --bs=4k --size=1G --numjobs=1 --runtime=30 --time_based --group_reporting --ioengine=libaio --direct=1 --iodepth=16 --filename=/dev/sdb
每个参数的含义,简单梳理一下:
- name:测试任务的名字,随便给,主要用来区分后台输出。
- rw:指定读写模式,
randread是随机读,randwrite是随机写,read和write分别对应顺序读和顺序写。 - bs:块大小,单位默认为字节,4k代表每次IO请求4KB,模拟数据库常见的页大小。
- size:测试的总数据量,这里设1G,代表每个线程读写1GB的数据。
- runtime和time_based:指定总运行时间,并让fio在时间耗尽时停止,而不是跑完size就提前结束,这两参数一起用,才能控制测试时长为30秒。
- ioengine:IO引擎,
libaio是Linux传统异步IO模式,适合绝大多数块设备。 - direct:设为1表示绕过操作系统缓存,直接读写设备,这样测出来的才是真实盘面性能。
- iodepth:队列深度,表示在什么时刻可以有多少个IO请求同时在途,默认1太浅,压不出SSD的真实能力。
- numjobs:并发进程数,通常模拟多客户端场景时会调大。
- group_reporting:把多个job产生的统计结果汇总显示,别让终端刷屏。
跑完之后,fio会输出一大串英文报告,里面有带宽、IOPS、延迟的均值,还有百分位延迟分布,要判断性能好坏,重点看三个数:IOPS、BW(带宽)、clat(完成延迟)的p99值。
fio测试结果怎么看?别让数字骗了你
很多新手拿到输出,只盯着最顶上的IOPS,忽略了一个关键前提:测试参数不同,结果没有任何可比性,同一块盘,块大小从4k改成64k,随机读IOPS可能掉一半,顺序读带宽反而翻几倍,所以看结果之前,先确认对方用的是不是同一套参数。

在输出的末尾,fio会给出类似下面这样的汇总:
read: IOPS=12.5k, BW=49.9MiB/s (52.3MB/s)
lat (usec): min=50, max=2000, p99=300
- IOPS:每秒IO操作次数,随机读写场景最看重的指标。
- BW:每秒传输的数据量,顺序读写场景一般看这个。
- lat:请求完成延迟,p99是有代表性的最差延迟值,如果p99比平均延迟高出太多,说明盘在压力下出现了波动。
如果fio报错“看起来没有生成IO”,大概率是direct=1下没有路径写权限,或者磁盘分区表不存在,用 lsblk 先确认设备名,再用 fio --name=test --filename=/dev/xxx 直接小规模试跑。
队列深度和并发数,别混淆
iodepth是队列深度,同一个线程可以同时发出的IO请求数量。numjobs是开启多少个独立进程,两者作用不同:队列深度调整的是设备内部指令积压能力,numjobs模拟的是多个应用同时访问同一磁盘的情况,测试SSD时,队列深度从1提升到32,IOPS往往会有明显上涨,直到盘的处理能力到顶,这就是为什么同型号盘在不同测试环境下跑分差异很大的原因之一。
不同场景下的fio实战对比
fio除了基础读写,还能组合出很多业务模型,比如混合读写比例,可以用 rw=rwmixread=70 代表70%读、30%写,这类测试常用于模拟文件服务器或数据库的日常负载。
HDD与SSD的跑分差异
在传统机械盘上,随机读写IOPS往往只有100到200,即使是SAS盘也不例外,而在常见的企业级SATA SSD上,随机读IOPS可以去到几万,NVMe盘更是能上几十万,用同一个4k随机读参数测,HDD和NVMe的实际差距可能高达千倍,这也是为什么数据库服务器普遍采用全闪存储。
云服务器fio测试需要注意什么
云服务器上跑fio,第一要务是确认测的是不是自己的数据盘,很多云主机默认系统盘上有云监控或备份服务,它们会占用磁盘IO,导致测试数据抖动,第二,建议先测试一块数据盘,再把块大小和线程数做几次跑分,取稳定值,第三,云盘的性能往往跟容量相关

,同类云盘不同规格的底层配额差距很大,单次测试结果只代表当前套餐。
如果测试的是生产业务盘,强烈建议在业务低峰期进行,并且先摘掉文件系统,对裸设备测试,避免写坏文件系统元数据。
fio和dd测试有什么区别
一句话概括:dd是简单的顺序文件拷贝工具,fio是可定制的IO压力测试框架。dd适合临时确认磁盘能否写入,但测不出随机性能,也压不出队列深度,fio更像是“满负荷健身房”,能把你盘上各块肌肉(随机读、随机写、混合IO)都练一遍,在实际项目中,甲方给出的性能测试报告中,几乎没有用dd冒险的,基本都是fio。
fio是什么意思:三个高频问题解答
fio测试会把数据写坏吗?
fio默认会对目标文件或设备进行覆盖写,如果指向的是已有数据的文件,会造成数据丢失,最安全的做法是:用独立测试盘,或者对生产盘先做快照再测试,测试之间用 --name=prefill --rw=write --bs=1M 先做一次全盘整理,有助于让后续测试结果更稳定。
fio的IOPS和带宽能直接换算吗?
不能直接简单换算,IOPS乘块大小得到的“理论带宽”,往往远高于实测带宽,因为实际测试中还会受到队列深度、寻址开销、总线瓶颈影响,但反过来,如果你知道块大小和IOPS,可以粗略估一个范围,比如bs=4k,IOPS=100k,理论带宽约400MB/s,实测可能在300MB/s上下,这类估算用于容量规划没问题,但不能用来做统计报表。
如何用fio测试不同块大小的影响?
把块大小作为变量,分别跑多次,比如用脚本循环执行12条命令,bs依次设为4k、8k、16k、32k、64k、128k,每次runtime=10,最后对比结果,这样可以快速判断你的盘在哪种块大小下性能最优,实际业务中,数据库日志适合小块写,备份流适合大块读,fio的块大小测试能直观看出来。
fio不是魔法,它只是把存储系统的上下限老老实实暴露出来,选型时用它做横向对比,部署后用它做压测验证,出问题时还能用它复现IO瓶颈,搞懂fio的含义和正确用法,你在服务器存储这件事上至少能少踩一半的坑。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/891257.html

