为了能到远方,脚下的每一步都不能少.|

505donkey

园龄:6年3个月粉丝:7关注:0

磁盘性能测试工具FIO安装与使用

工具简介

定义与定位

FIO(Flexible I/O Tester)是一款开源的存储性能测试工具,支持模拟多种I/O负载模式(顺序/随机读写、混合读写等),提供详细的性能指标(IOPS、带宽、延迟等)。

优势

  • 灵活性:支持13+种I/O引擎(如libaio、sync)
  • 多线程/进程:可模拟高并发场景
  • 精准报告:输出IOPS、吞吐量、延迟分布等数据

应用场景

  • 负载模拟能力
    • 支持顺序/随机读写、混合读写(读写比例可调)
    • 提供同步/异步I/O模式(如libaio、posixaio、sync等引擎)
    • 可设定块大小、队列深度、压测时长等精细化参数
  • 多维性能分析
    除基础IOPS(每秒操作数)和带宽(吞吐量)外,还可测量:
    • 延迟分布(最小/平均/最大/百分位值)
    • CPU利用率与线程调度统计
    • I/O抖动(延迟波动)等高级指标
  • 跨平台与灵活性
    • 支持Linux/Windows/macOS系统
    • 可通过配置文件或命令行快速构建测试场景
    • 支持多线程/多进程并发测试,模拟真实负载压力

安装与基础用法

安装方法

# CentOS
yum install libaio-devel fio
# Ubuntu
apt install fio

命令行关键参数

参数 技术影响 典型场景示例 注意事项
--rw 决定I/O模式与数据分布:
- read/write(顺序读写)
- randread/randwrite(完全随机)
- rw/randrw(混合读写)
SSD随机性能测试用randrw
机械盘顺序带宽用write
混合读写需配合--rwmixread=70设置读写比例
--bs 直接影响IOPS与带宽关系:
- 小块(4k)适合测IOPS
- 大块(1m)适合测吞吐量
数据库用4k模拟页操作,
视频处理用1m测连续写入
需与实际业务场景块大小匹配
--iodepth 提升SSD/NVMe设备的并发能力:
- 单线程队列深度
- 与numjobs配合增加总队列深度
企业级SSD建议32-64
云硬盘建议8-16
过高可能导致超设备队列能力
--numjobs 模拟多进程并发压力:
- 每个job独立线程
- 与iodepth组合计算总IOPS
数据库连接池测试用8-16
单线程测试用1
需配合CPU核心数调整
--direct 绕过系统缓存(Buffer/Cache):
- 1: 真实设备性能测试
- 0: 允许缓存加速
存储设备裸性能必设为1
文件系统测试可设为0
未启用会导致测试结果虚高
--ioengine 选择I/O调度引擎:
- libaio(异步IO,推荐)
- sync(同步阻塞)
- posixaio(POSIX异步)
企业级SSD测试用libaio
基础验证用sync
Windows系统需用windowsaio
--runtime 控制测试持续时间:
- 避免无限运行
- 单位:秒
--runtime=600表示10分钟压测 需配合--time_based实现按时长运行
--size 定义每个线程的I/O数据量:
- 控制测试范围
- 支持K/M/G单位
--size=10G模拟大数据处理,
--size=100m快速测试
总数据量=size×numjobs
--group_reporting 合并多线程结果输出:
- 显示聚合性能指标
- 隐藏单个job细节
多并发测试必加此参数 --numjobs配合使用
--filename 指定测试目标路径:
- 文件路径(如/data/testfile)
- 设备路径(如/dev/nvme0n1)
裸盘测试用/dev/sdb
文件系统测试用文件路径
直接写设备会破坏原有数据

常用测试场景

全盘顺序吞吐测试(机械硬盘/带宽验证)

fio --name=seq_write --filename=/dev/sdb --rw=write --bs=1m --direct=1 \
    --ioengine=libaio --numjobs=4 --runtime=600 --group_reporting

参数关联说明

  • --bs=1m:大块测试连续带宽上限
  • --numjobs=4:多线程加速机械盘寻道瓶颈
  • --runtime=600:10分钟稳定压力测试
  • 强制--direct=1排除缓存干扰

数据库随机IOPS测试(SSD/OLTP场景)

fio --name=oltp_sim --filename=/mnt/ssd/testfile --rw=randrw --rwmixread=70 \
    --bs=4k --iodepth=32 --numjobs=8 --runtime=300 --direct=1 --group_reporting

关键配置解析

  • --rwmixread=70:模拟70%读+30%写的典型事务负载
  • --iodepth=32+--numjobs=8:总队列深度256,匹配高并发数据库
  • --filename指向挂载点:测试文件系统实际性能

云硬盘极限压力测试(队列深度验证)

fio --name=cloud_stress --rw=randread --bs=4k --iodepth=64 \
    --ioengine=libaio --numjobs=16 --time_based --runtime=1800 \
    --filename=/dev/vdc --direct=1 --output=cloud_result.json

新增优化点

  • --time_based:强制按时长运行(即使提前完成数据量)
  • --output=cloud_result.json:生成结构化日志,便于自动化分析
  • 持续30分钟(--runtime=1800)检测云盘性能衰减

元数据性能测试(小文件场景)

fio --name=meta_test --rw=randwrite --bs=512b --iodepth=1 \
    --numjobs=128 --direct=1 --size=8m --nrfiles=128 \
    --directory=/testdir --fsync=1 --group_reporting \
    --time_based --runtime=120

场景特殊配置

  • --bs=512b:极端小块测试inode分配效率
  • --numjobs=128:高并发模拟海量小文件写入
  • --size=8m:每个线程写入8MB(总数据量 8m×128=1GB,可控)
  • --nrfiles=128:每个线程创建独立文件(生成128个文件)
  • --directory=/testdir:指定独立目录避免文件覆盖
  • --fsync=1:每次写操作后触发元数据提交
  • --runtime=120:限制测试时长为2分钟,避免失控

测试结果解读

关键指标

IOPS

  • 定义:每秒处理多少次I/O操作
  • 示例:IOPS=11.3k 表示每秒处理11,300次读写
  • 关键点
    • 机械硬盘IOPS≈200,SSD可达数万
    • 高IOPS不一定等于高效

带宽BW

  • 定义:每秒传输的数据量
  • 示例:BW=43.0MiB/s 表示每秒传输43兆字节
  • 换算关系:BW = IOPS × 块大小
    (如4k块达到43MiB/s需要:43×1024÷4 ≈ 11k IOPS)

延迟latency

  • 分层理解
    • slat(提交延迟):系统处理请求的时间
    • clat(完成延迟):设备实际处理时间
    • lat(总延迟):slat + clat

性能分析

  • 观察延迟分布(避免被平均,如99th percentile判断异常值)
  • 对比不同参数(如iodepth对IOPS的影响)

注意事项

  • 数据安全
    • 避免直接测试已挂载设备(使用--allow_mounted_write=1需谨慎)
    • 指定测试文件路径(如--filename=/testfile)
  • 环境配置
    • 测试前清空缓存:echo 3 > /proc/sys/vm/drop_caches
    • 使用--direct=1绕过系统缓存获取真实磁盘性能

本文作者:505donkey

本文链接:https://www.cnblogs.com/505donkey/p/18742275

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   505donkey  阅读(17)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起