Docker部署Fio磁盘读写测试过程

 更新时间:2026年01月19日 09:13:42   作者:竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。  
文章主要内容是介绍如何使用Fio测试工具进行磁盘性能测试,包括拉取测试工具镜像、启动容器、执行测试以及详细解释Fio的命令行参数和配置文件

1.拉取测试工具镜像

docker pull registry.cn-hangzhou.aliyuncs.com/offends/fio:latest

2.启动并进入容器

挂盘或者建目录/data进行测试

docker run --name disktest \
  -it --rm -v /data/disk_test:/data/disk_test \
  registry.cn-hangzhou.aliyuncs.com/offends/fio:latest \
  sh

3.开始测试

```dart
# 顺序读测试 (1M块大小, 10GB数据)
fio --name=seq_read --filename=/testfile --size=10G --rw=read --bs=1M --direct=1 --ioengine=libaio --iodepth=32 --runtime=60 --time_based

# 顺序写测试
fio --name=seq_write --filename=/testfile --size=10G --rw=write --bs=1M --direct=1 --ioengine=libaio --iodepth=32

# 随机读测试 (4K块大小)
fio --name=rand_read --filename=/dev/sdb --rw=randread --bs=4k --direct=1 --ioengine=libaio --iodepth=32 --numjobs=4 --runtime=60 --group_reporting

# 随机写测试
fio --name=rand_write --filename=/dev/sdb --rw=randwrite --bs=4k --direct=1 --ioengine=libaio --iodepth=32 --numjobs=4

3. 混合读写测试
# 70%读30%写的混合负载
fio --name=mixed_rw --filename=/dev/nvme0n1 --rw=randrw --bs=4k --direct=1 --ioengine=libaio --iodepth=32 --numjobs=8 --rwmixread=70 --runtime=120 --group_reporting

4. 数据库模式测试
# 模拟数据库负载 (小随机读写)
fio --name=db_workload --filename=/dev/sdb --rw=randrw --bs=8k --direct=1 --ioengine=libaio --iodepth=32 --numjobs=16 --runtime=300 --group_reporting --rwmixread=70 --time_based

4.Fio提供两种配置方式

命令行参数说明

参数 描述

  • –debug=options 启用调试日志记录,可以选择启用不同类型的调试信息,比如进程、文件、IO等等。
  • –parse-only 仅解析选项,不执行任何IO操作。
  • –output 将输出写入文件。
  • –bandwidth-log 生成带宽日志。
  • –minimal 生成最小化(简洁)的输出。
  • –output-format=type 指定输出格式,可以是简洁、JSON等。
  • –terse-version=type 设置简洁版本输出格式。
  • –version 打印版本信息并退出。
  • –help 打印帮助信息。
  • –cpuclock-test 执行CPU时钟的测试/验证。
  • –crctest=[type] 测试校验和功能的速度。
  • –cmdhelp=cmd 打印命令帮助,使用”all”可以查看所有命令。
  • –enghelp=engine 打印IO引擎的帮助信息,或者列出可用的IO引擎。
  • –enghelp=engine,cmd 打印特定IO引擎命令的帮助信息。
  • –showcmd 将作业文件转换为命令行选项。
  • –eta=when 指定何时打印ETA(预计完成时间)估计值。
  • –eta-newline=time 每个 ‘time’ 时间段强制换行显示ETA。
  • –status-interval=t 每个 ‘t’ 时间段强制完整状态转储。
  • –readonly 打开安全只读检查,防止写入。
  • –section=name 只运行作业文件中指定的部分,可以指定多个部分。
  • –alloc-size=kb 将smalloc池的大小设置为指定的kb数(默认为16384)。
  • –warnings-fatal Fio解析器警告变为致命错误。
  • –max-jobs=nr 支持的最大线程/进程数。
  • –server=args 启动后端fio服务器。
  • –daemonize=pidfile 后台运行fio服务器,将PID写入文件。
  • –client=hostname 与远程后端fio服务器通信。
  • –remote-config=file 告诉fio服务器加载本地作业文件。
  • –idle-prof=option 报告系统或每CPU基础的CPU空闲情况或运行单位工作校准。
  • –inflate-log=log 解压缩并输出压缩日志。
  • –trigger-file=file 当文件存在时执行触发命令。
  • –trigger-timeout=t 在指定的时间执行触发器。
  • –trigger=cmd 将此命令设置为本地触发器。
  • –trigger-remote=cmd 将此命令设置为远程触发器。
  • –aux-path=path 使用此路径作为fio生成文件的路径。

配置文件

配置文件参考

[global]
directory = /workspaces/zeodev/test-io  # 替换为你的测试目录路径
ioengine  = libaio         # 异步 I/O 引擎,提高并发效率
direct    = 1              # 绕过系统缓存,测试真实磁盘性能
runtime   = 300            # 测试时长(秒)
randrepeat= 1              # 确保随机模式可复现
time_based= 1              # 按时间运行(而非文件大小)

# 大文件随机读写
[bigfile_randrw]
filesize    = 2g           # 测试文件大小(建议≥内存 2 倍)
bs          = 128k         # 大块 I/O(128KB),匹配大文件访问特征
rw          = randrw       # 随机读写混合模式
rwmixread   = 70           # 70% 读 + 30% 写(常见负载比例)
iodepth     = 32           # 队列深度 32(适合 NVMe SSD)
numjobs     = 4            # 并发作业数(总并发=32×4=128)
group_reporting=1          # 汇总测试结果(默认每个线程一个 report)

# 小文件随机读写
[smallfiles_randrw]
stonewall   = 1            # 等待之前的 job 运行完成
                           # (默认所有 job 并行)
nrfiles     = 250          # 创建 250 个独立文件/job
filesize    = 4k-2m        # 每个文件大小范围(典型小文件)
bs          = 4k           # 小块(4KB),模拟真实小文件 I/O
rw          = randrw
rwmixread   = 70
iodepth     = 64           # 高队列深度应对高频率 I/O
numjobs     = 16           # 并发作业数(总并发=64×16=1024)
fsync       = 1            # 每写操作后同步元数据(会显著影响性能,增强真实性)
group_reporting=1

# 大文件顺序读取
[largefile_seq_read]
stonewall   = 1
rw          = read
filesize    = 2g
bs          = 1m           # 大块 I/O(1MB),最大化吞吐
iodepth     = 128
numjobs     = 4
group_reporting=1

# 大文件顺序写入
[largefile_seq_write]
stonewall   = 1
rw          = write
filesize    = 2g
bs          = 1m
iodepth     = 128
numjobs     = 4
group_reporting=1

fio完整输出结果样例

Starting 4 processes
Jobs: 4 (f=4): [r(4)][100.0%][r=1024MiB/s][r=262k IOPS][eta 00m:00s]
fio: (groupid=0, jobs=4): err= 0: pid=12345: Mon Dec 18 10:30:45 2023
  read: IOPS=261k, BW=1021MiB/s (1071MB/s)(120GiB/120048msec)
    slat (nsec): min=2, max=1234, avg= 5.00, stdev= 1.23
    clat (nsec): min=123, max=45678, avg=98765.00, stdev=2345.67
     lat (nsec): min=125, max=45689, avg=98770.00, stdev=2345.89
    clat percentiles (nsec):
     |  1.00th=[  125],  5.00th=[  250], 10.00th=[  500],
     | 25.00th=[ 1000], 50.00th=[ 2000], 75.00th=[ 5000],
     | 90.00th=[10000], 95.00th=[20000], 99.00th=[50000],
     | 99.50th=[70000], 99.90th=[100000], 99.95th=[120000],
     | 99.99th=[150000]
   bw (  MiB/s): min= 1000, max= 1050, per=100.00%, avg=1021.00, stdev=12.34
   iops        : min=256000, max=268800, avg=261440.00, stdev=3160.45
   lat (usec)  : 2=0.01%, 4=0.05%, 10=0.10%, 20=0.25%, 50=0.50%, 100=1.00%
   lat (usec)  : 250=2.00%, 500=5.00%, 1000=10.00%, 2000=20.00%, >=2000=61.09%
  cpu          : usr=45.23%, sys=54.77%, ctx=12345678, majf=0, minf=81
  IO depths    : 1=0.1%, 2=0.2%, 4=0.5%, 8=1.0%, 16=2.0%, 32=4.0%, >=64=92.2%
     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=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=100.0%, >=64=0.0%
  issued rwt: total=31457280,0,0, short=0,0,0, drop=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

测试结果指标分析

1. 基础性能指标
IOPS(Input/Output Operations Per Second)

表示每秒完成的I/O操作次数
对于随机读写场景,IOPS是核心指标
示例中261k IOPS表示每秒261,000次读操作
带宽(Bandwidth/BW)

表示每秒传输的数据量
单位可以是MiB/s或MB/s(注意二进制与十进制区别)
示例中1021MiB/s = 1021 × 1.048576 ≈ 1070 MB/s
2. 延迟(Latency)统计
延迟是衡量存储响应速度的关键指标,Fio提供了三个维度的延迟数据:

slat(Submission Latency):提交I/O请求到内核的时间
clat(Completion Latency):I/O请求完成的时间
lat(Total Latency):从提交到完成的总时间
延迟百分位数(Percentiles) 这是最重要的性能分析数据,展示了不同百分比的延迟分布:

clat percentiles (nsec):
 |  1.00th=[  125],  5.00th=[  250], 10.00th=[  500],
 | 25.00th=[ 1000], 50.00th=[ 2000], 75.00th=[ 5000],
 | 90.00th=[10000], 95.00th=[20000], 99.00th=[50000],
解读示例:

50%的请求(中位数)延迟在2微秒以内
99%的请求延迟在50微秒以内
99.9%的请求延迟在100微秒以内
3. CPU使用情况
cpu          : usr=45.23%, sys=54.77%, ctx=12345678, majf=0, minf=81
usr%:用户空间CPU时间占比
sys%:内核空间CPU时间占比
ctx:上下文切换次数
majf/minf:主要/次要页面错误数
4. I/O深度分布
IO depths    : 1=0.1%, 2=0.2%, 4=0.5%, 8=1.0%, 16=2.0%, 32=4.0%, >=64=92.2%
这显示了I/O请求在不同队列深度下的分布情况。高百分比的>=64表示系统能够有效利用高并发I/O。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 启动docker的时候如何把参数传递给docker里面的项目(推荐)

    启动docker的时候如何把参数传递给docker里面的项目(推荐)

    这篇文章主要介绍了启动docker的时候如何把参数传递给docker里面的项目,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • VS上配置docker步骤记录

    VS上配置docker步骤记录

    这篇文章主要介绍了VS上配置docker步骤记录,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Docker中的images存储路径修改

    Docker中的images存储路径修改

    这篇文章主要介绍了Docker中的images存储路径修改方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Docker 安装及配置镜像加速的实现

    Docker 安装及配置镜像加速的实现

    这篇文章主要介绍了Docker 安装及配置镜像加速的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • docker安装elasticsearch和kibana的方法步骤

    docker安装elasticsearch和kibana的方法步骤

    这篇文章主要介绍了docker安装elasticsearch和kibana的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Docker私有仓库打开2375端口的实现

    Docker私有仓库打开2375端口的实现

    本文主要介绍了Docker私有仓库打开2375端口的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Docker中的COPY指令和ADD指令详解

    Docker中的COPY指令和ADD指令详解

    COPY 和 ADD 都是 Dockerfile 中的指令,有着类似的作用。它们允许我们将文件从特定位置复制到 Docker 镜像中,这篇文章主要介绍了Docker中的COPY指令和ADD指令,需要的朋友可以参考下
    2022-06-06
  • 清理Docker磁盘空间的几种有效方法

    清理Docker磁盘空间的几种有效方法

    随着Docker的广泛使用,管理Docker占用的磁盘空间变得越来越重要,长时间运行Docker环境,未使用的容器、镜像、卷和网络等会逐渐积累,占用大量磁盘空间,本文将介绍几种清理Docker磁盘空间的有效方法,需要的朋友可以参考下
    2024-08-08
  • 如何解决docker commit后镜像越来越大问题

    如何解决docker commit后镜像越来越大问题

    解决Docker Commit后镜像变大问题的方法:方法1直接打包容器并导入为镜像;方法2将容器根目录文件压缩后导入为镜像,方法1更优,在其他设备运行时可能出现内存不足错误
    2025-03-03
  • 用docker运行postgreSQL的方法步骤

    用docker运行postgreSQL的方法步骤

    这篇文章主要介绍了用docker运行postgreSQL的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论