当前位置: 首页 > news >正文

测试硬盘的瑞士军刀-fio

FIO (Flexible I/O Tester) 是一个用于磁盘I/O性能测试的强大工具。它的参数众多,我们不可能也没必要完全记住。下面通过一个具体的命令演示。通过这个具体的例子,希望能帮助你对fio有所了解。
下面命令模拟数据库服务对硬盘的使用,I/O块选择为8k,读写比设置为7比3。
fio完整命令:

fio--name=oltp-sim\--ioengine=libaio\--direct=1\--bs=8k\--size=3G\--rw=randrw\--rwmixread=70\--iodepth=32\--numjobs=4\--group_reporting\--runtime=120\--time_based\--ramp_time=30

输出结果:

oltp-sim: (g=0): rw=randrw, bs=(R) 8192B-8192B, (W) 8192B-8192B, (T) 8192B-8192B, ioengine=libaio, iodepth=32 ... fio-3.36 Starting 4 processes oltp-sim: Laying out IO file (1 file / 3072MiB) oltp-sim: Laying out IO file (1 file / 3072MiB) oltp-sim: Laying out IO file (1 file / 3072MiB) oltp-sim: Laying out IO file (1 file / 3072MiB) Jobs: 4 (f=4): [m(4)][100.0%][r=161MiB/s,w=70.5MiB/s][r=20.6k,w=9026 IOPS][eta 00m:00s] oltp-sim: (groupid=0, jobs=4): err= 0: pid=54727: Thu Jun 25 09:23:16 2026 read: IOPS=38.7k, BW=302MiB/s (317MB/s)(35.4GiB/120002msec) slat (nsec): min=785, max=3517.1k, avg=5204.50, stdev=9422.74 clat (usec): min=55, max=201863, avg=2136.30, stdev=6055.59 lat (usec): min=153, max=201866, avg=2141.50, stdev=6055.62 clat percentiles (usec): | 1.00th=[ 685], 5.00th=[ 914], 10.00th=[ 1045], 20.00th=[ 1254], | 30.00th=[ 1450], 40.00th=[ 1696], 50.00th=[ 1893], 60.00th=[ 2057], | 70.00th=[ 2212], 80.00th=[ 2376], 90.00th=[ 2638], 95.00th=[ 2868], | 99.00th=[ 3490], 99.50th=[ 4146], 99.90th=[102237], 99.95th=[189793], | 99.99th=[200279] bw ( KiB/s): min=53589, max=374230, per=100.00%, avg=310733.49, stdev=22506.96, samples=944 iops : min= 6696, max=46777, avg=38840.01, stdev=2813.37, samples=944 write: IOPS=16.6k, BW=130MiB/s (136MB/s)(15.2GiB/120002msec); 0 zone resets slat (nsec): min=913, max=3425.1k, avg=5941.29, stdev=11093.02 clat (usec): min=301, max=201695, avg=2711.91, stdev=6906.19 lat (usec): min=324, max=201698, avg=2717.85, stdev=6906.22 clat percentiles (usec): | 1.00th=[ 1106], 5.00th=[ 1434], 10.00th=[ 1631], 20.00th=[ 1844], | 30.00th=[ 2040], 40.00th=[ 2180], 50.00th=[ 2343], 60.00th=[ 2474], | 70.00th=[ 2638], 80.00th=[ 2835], 90.00th=[ 3130], 95.00th=[ 3425], | 99.00th=[ 4359], 99.50th=[ 5342], 99.90th=[103285], 99.95th=[193987], | 99.99th=[200279] bw ( KiB/s): min=21968, max=163208, per=100.00%, avg=133093.00, stdev=9657.89, samples=944 iops : min= 2744, max=20400, avg=16635.00, stdev=1207.25, samples=944 lat (usec) : 100=0.01%, 250=0.01%, 500=0.13%, 750=1.04%, 1000=4.66% lat (msec) : 2=41.95%, 4=51.32%, 10=0.59%, 20=0.01%, 50=0.11% lat (msec) : 100=0.02%, 250=0.17% cpu : usr=3.95%, sys=10.33%, ctx=2211187, majf=0, minf=149 IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=100.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0% issued rwts: total=4644062,1989240,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=32 Run status group 0 (all jobs): READ: bw=302MiB/s (317MB/s), 302MiB/s-302MiB/s (317MB/s-317MB/s), io=35.4GiB (38.0GB), run=120002-120002msec WRITE: bw=130MiB/s (136MB/s), 130MiB/s-130MiB/s (136MB/s-136MB/s), io=15.2GiB (16.3GB), run=120002-120002msec Disk stats (read/write): sdd: ios=5931652/2543396, sectors=94906432/40694712, merge=0/317, ticks=11765239/6307868, in_queue=18073398, util=96.20%

选项介绍:

参数说明
--nameoltp-sim测试任务名称,表示模拟OLTP(联机事务处理)场景
--ioenginelibaio使用Linux原生异步I/O引擎,性能更高
--direct1绕过操作系统缓存,直接读写磁盘(绕过Page Cache)
--bs8k块大小为8KB,数据库常见page size
--size3G每个job测试文件大小为3GB
--rwrandrw随机读写混合模式
--rwmixread7070%读,30%写(典型OLTP比例)
--iodepth32I/O队列深度32
--numjobs4并发4个进程
--group_reporting-汇总所有job的统计而非单独显示
--runtime120测试运行120秒
--time_based-基于时间运行,即使完成size也继续跑满时间
--ramp_time30预热30秒后才开始统计(消除初始波动)

读取(Read)性能

read: IOPS=38.7k, BW=302MiB/s (317MB/s)(35.4GiB/120002msec)
指标说明
IOPS38.7k每秒读取38,700次I/O操作
带宽 (BW)302 MiB/s读取吞吐量(注意MiB是1024进制,MB是1000进制)
总读取量35.4 GiB120秒内总共读取35.4GB数据

延迟指标(latency)

slat (nsec): min=785, max=3517.1k, avg=5204.50, stdev=9422.74 clat (usec): min=55, max=201863, avg=2136.30, stdev=6055.59 lat (usec): min=153, max=201866, avg=2141.50, stdev=6055.62
缩写全称单位平均值说明
slatSubmission Latency纳秒5.2 μsI/O提交延迟:fio将I/O请求提交给内核的时间
clatCompletion Latency微秒2136 μs完成延迟:I/O提交到内核到完成的时间
latTotal Latency微秒2141 μs总延迟 ≈ slat + clat

延迟百分位数(关键!)

clat percentiles (usec): | 1.00th=[ 685], 5.00th=[ 914], 10.00th=[ 1045], 20.00th=[ 1254], | 30.00th=[ 1450], 40.00th=[ 1696], 50.00th=[ 1893], 60.00th=[ 2057], | 70.00th=[ 2212], 80.00th=[ 2376], 90.00th=[ 2638], 95.00th=[ 2868], | 99.00th=[ 3490], 99.50th=[ 4146], 99.90th=[102237], 99.95th=[189793], | 99.99th=[200279]

解读:

  • P50 = 1893 μs:50%的读请求在1.89ms内完成(中位数)
  • P99 = 3490 μs:99%的读请求在3.49ms内完成
  • P99.9 = 102 ms:最差的0.1%请求需要超过100ms(尾延迟!)
  • P99.99 = 200 ms:极端情况下有200ms延迟

💡重要:P99+的尾延迟非常高(100-200ms),这可能是磁盘瓶颈或GC导致的,对数据库性能影响很大。

带宽和IOPS分布

bw (KiB/s): min=53589, max=374230, avg=310733.49, stdev=22506.96 iops: min=6696, max=46777, avg=38840.01, stdev=2813.37
  • 采样944次,IOPS波动范围6.7k ~ 46.8k,标准差2813

写入(Write)性能

write: IOPS=16.6k, BW=130MiB/s (136MB/s)(15.2GiB/120002msec)
指标说明
IOPS16.6k每秒写入16,600次
带宽130 MiB/s写入吞吐量
总写入量15.2 GiB120秒内写入15.2GB

写入延迟

slat (nsec): avg=5941.29 (~5.9 μs) clat (usec): avg=2711.91 (~2.7 ms) lat (usec): avg=2717.85 (~2.7 ms)

写入平均延迟2.7ms,比读取的2.1ms略高,符合预期。

写入延迟百分位数

| 99.00th=[ 4359], 99.50th=[ 5342], 99.90th=[103285], ...
  • P99写入延迟 = 4.36ms(读取是3.49ms)
  • P99.9同样有100ms+的尾延迟

延迟分布直方图

lat (usec): 100=0.01%, 250=0.01%, 500=0.13%, 750=1.04%, 1000=4.66% lat (msec): 2=41.95%, 4=51.32%, 10=0.59%, 20=0.01%, 50=0.11% lat (msec): 100=0.02%, 250=0.17%

关键发现:

  • ~93%的请求在4ms内完成(1ms内4.66% + 2ms内41.95% + 4ms内51.32%)
  • ~0.3%的请求超过50ms(尾延迟)
  • 总体分布:中间密集(2-4ms),尾部有很长的拖尾

CPU使用率

cpu: usr=3.95%, sys=10.33%, ctx=2211187, majf=0, minf=149
指标说明
usr3.95%用户态CPU占比低(fio本身计算量小)
sys10.33%内核态CPU占比(处理I/O)
ctx2,211,187总上下文切换次数(约1.8万次/秒)
majf0无主缺页(无磁盘swap)
minf149次缺页(内存分配)

I/O深度统计

IO depths: 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=100.0%

100%时间保持iodepth=32,说明磁盘能跟上队列深度,没有出现队列积压不足的情况。

submit: 0=0.0%, 4=100.0%, ... complete: 0=0.0%, 4=100.0%, ...

批量提交/完成:每次批量处理4个I/O,符合libaio的批处理特性。


I/O总量统计

issued rwts: total=4644062,1989240,0,0
  • 读操作:4,644,062次
  • 写操作:1,989,240次
  • 读写比例 = 70:30 ✓(完全符合rwmixread=70的配置)

磁盘级别统计(Disk stats)

sdd: ios=5931652/2543396, sectors=94906432/40694712, merge=0/317, ticks=11765239/6307868, in_queue=18073398, util=96.20%
指标说明
util96.20%磁盘利用率96.2%,接近饱和!
ios5.9M / 2.5M磁盘层面的读/写I/O数
merge0 / 317读I/O完全没有合并,写有少量合并
in_queue18MI/O在队列中的总等待时间(毫秒)

⚠️util=96.2%是关键指标:磁盘已经接近100%繁忙,这是P99.9延迟飙升的根本原因!


http://www.cnnetsun.cn/news/3013659.html

相关文章:

  • 企业智能表格的机会点在哪?2026 选型与落地实测指南
  • 中小工厂如何选型?从锟铭智能看设备数据采集关键维度
  • 除醛喷剂除甲醛的效果、使用频率与用量全解析
  • CTF源码解题
  • 2026年AI辅助编程深度实践:从代码生成到架构设计的全流程提效指南
  • 主流 3D 视觉三大技术路线,机器人、机器狗、机械臂、数据采集设备该怎么选?
  • 掌上高考——高校数据爬取+数据可视化
  • 免费版视频去除水印工具推荐:从桌面到手机,一套可操作的素材清理路径
  • Fastjson反序列化漏洞实战解析:从原理、利用到防御
  • MySQL性能怎么看?mysqld_exporter采集、告警与远程监控指南
  • 从零构建在线评测系统:Docker沙箱、Celery异步与安全设计实践
  • 大气层整合包系统深度解析:Nintendo Switch定制固件的架构设计与实战技巧
  • 浏阳儿童烟花品牌推荐
  • ALK-PEG-PAA / Alkyne-PEG-PAA炔基-聚乙二醇-b-聚丙烯酸二嵌段共聚物Alkyne-PEG-block-Poly(acrylic acid)
  • 51-C01-人走灯灭+AD采集+自动+手动+10档调节+坐姿监测+蜂鸣器+OLED屏+(无线方式选择)-2(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • 自动化测试面试实战:Selenium与Cypress核心原理与工程实践
  • STM32-S266-TDS水质检测+红外感应+水量监测+保温常温+温度+灯光指示+定时提醒+定时开关+加热+防干烧+参数+OLED屏+声光提醒+(无线方式选择)-2(设计源文件+万字报告+讲解)(支
  • 堆码测试介绍及包装运输验证堆码标准选择
  • 基于51/STM32单片机智能水杯保温杯恒温温度控制防干烧水质设计STM32-S264-水量监测+保温常温+温度+灯光指示+定时提醒+定时开关+加热+防干烧+参数可设+OLED屏+声光提醒+(无线方式
  • 使用 `<Teleport>` 实现全局模态框(Vue 3)
  • 高仕星维生素B能稳固发根吗
  • 数字孪生+大模型重塑工业产线管控模式
  • Java计算机毕设之基于SpringBoot+Vue的校园潮流音乐在线播放平台设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 【课程设计/毕业设计】基于SpringBoot的在线潮流音乐视听服务系统设计与实现 个性化歌单创建与潮流音乐播放系统设计与实现【附源码、数据库、万字文档】
  • PHP开发者的福音!这套开源商城源码,堪称二开界的“瑞士军刀”!
  • Windows、Android、iOS 各自的伟大之处
  • 【计算机毕业设计案例】基于 SpringBoot+Vue 的财务报表生成管理系统设计与实现 中小企业财会业务信息化管理系统设计与实现(程序+文档+讲解+定制)
  • IntelliJ IDEA旗舰版安装失败诊断手册(93%用户卡在第4步!含JetBrains License Server 2024.1.3实测绕过方案)
  • 【船舶】船舶操纵性MMG方程matlab实现,适用于船舶操纵轨迹预测
  • Gemini 3 Pro提示词工程与自动化工作流实战指南