跳转至

FIO命令

以下是 fio 命令的帮助信息翻译:

fio-3.35
fio [选项] [作业选项] <作业文件(s)>
  --debug=选项          启用调试日志。可以是以下之一或多个:
                        process, file, io, mem, blktrace, verify, random, parse,
                        diskutil, job, mutex, profile, time, net, rate, compress,
                        steadystate, helperthread, zbd
  --parse-only          仅解析选项,不开始任何 IO
  --merge-blktrace-only 仅合并 blktrace,不开始任何 IO
  --output              输出写入文件
  --bandwidth-log       生成汇总带宽日志
  --minimal             最小(简洁)输出
  --output-format=type  输出格式(terse, json, json+, normal)
  --terse-version=type  设置简洁输出格式的版本(默认为 3,或者 2、4 或 5)
  --version             输出版本信息并退出
  --help                打印此页面
  --cpuclock-test       执行 CPU 时钟的测试/验证
  --crctest=[type]      测试校验和函数的速度
  --cmdhelp=cmd         打印命令帮助,“all”表示列出所有命令
  --enghelp=engine      打印 ioengine 帮助,或者列出可用的 ioengines
  --enghelp=engine,cmd  打印某个 ioengine 命令的帮助
  --showcmd             将作业文件转换为命令行选项
  --eta=when            设置 ETA 估算显示时机
                        可选值: "always", "never" 或 "auto"
  --eta-newline=t       强制每个 't' 周期输出一个新的行
  --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 的空闲情况(option=system, percpu)或仅运行单元工作标定(option=calibrate)
  --inflate-log=log     解压并输出压缩日志
  --trigger-file=file   当文件存在时执行触发命令
  --trigger-timeout=t   在此时间后执行触发命令
  --trigger=cmd         设置本地触发命令
  --trigger-remote=cmd  设置远程触发命令
  --aux-path=path       使用此路径保存 fio 状态生成的文件

Fio 由 Jens Axboe 编写 <axboe@kernel.dk>

常见用法

1. 基本的读写测试

  • 顺序读取测试:
fio --name=read_test --ioengine=sync --rw=read --size=1G --numjobs=1 --time_based --runtime=30s --output=read_test.log

这个命令会对一个 1GB 的文件进行顺序读取测试,持续 30 秒。

  • 顺序写入测试:
fio --name=write_test --ioengine=sync --rw=write --size=1G --numjobs=1 --time_based --runtime=30s --output=write_test.log

这个命令会对一个 1GB 的文件进行顺序写入测试,持续 30 秒。

2. 随机读写测试

  • 随机读取测试:
fio --name=random_read --ioengine=sync --rw=randread --size=1G --numjobs=1 --time_based --runtime=30s --output=random_read.log

这个命令会对 1GB 文件进行随机读取测试,持续 30 秒。

  • 随机写入测试:
fio --name=random_write --ioengine=sync --rw=randwrite --size=1G --numjobs=1 --time_based --runtime=30s --output=random_write.log

这个命令会对 1GB 文件进行随机写入测试,持续 30 秒。

3. 多线程测试

  • 并发读取测试:
fio --name=multi_read --ioengine=sync --rw=read --size=1G --numjobs=4 --time_based --runtime=30s --output=multi_read.log

这个命令会对 1GB 文件进行 4 线程的并发读取测试,持续 30 秒。

  • 并发写入测试:
fio --name=multi_write --ioengine=sync --rw=write --size=1G --numjobs=4 --time_based --runtime=30s --output=multi_write.log

这个命令会对 1GB 文件进行 4 线程的并发写入测试,持续 30 秒。

4. 混合读写测试

  • 50/50 混合读写:
fio --name=mixed_readwrite --ioengine=sync --rw=randwrite --size=1G --numjobs=1 --time_based --runtime=30s --output=mixed_readwrite.log --bs=4k --rwmixread=50

这个命令会进行 50% 读取和 50% 写入的混合测试,块大小为 4KB。

5. 指定 I/O 引擎

  • 使用 libaio 引擎进行异步 I/O 测试:
fio --name=async_read --ioengine=libaio --rw=read --size=1G --numjobs=1 --time_based --runtime=30s --output=async_read.log

这个命令使用

libaio

引擎进行异步读取测试。

6. 指定 I/O 大小(块大小)

  • 设置 4KB 块大小的读写测试:
fio --name=block_size_test --ioengine=sync --rw=randwrite --size=1G --numjobs=1 --time_based --runtime=30s --output=block_size_test.log --bs=4k

这个命令使用 4KB 的块大小进行随机写入测试。

7. IOPS 测试

  • 测试 IOPS(每秒 I/O 操作次数):
fio --name=iops_test --ioengine=sync --rw=randwrite --size=1G --numjobs=1 --time_based --runtime=30s --output=iops_test.log --blocksize=4k

通过指定较小的块大小 (如 4KB),可以测试每秒的 I/O 操作次数(IOPS)。

8. 多作业文件测试

  • 测试多个文件:
fio --name=multi_file_test --ioengine=sync --rw=randwrite --size=500M --numjobs=4 --time_based --runtime=30s --output=multi_file_test.log

这个命令会进行 4 个线程同时对多个 500MB 文件进行随机写入测试。

9. 指定作业文件

  • 使用作业文件进行测试: 你可以将作业配置放在一个文件中,然后通过文件运行测试。

jobfile.fio

[global]
ioengine=sync
time_based
runtime=30s
size=1G

[readtest]
rw=read

[writetest]
rw=write

运行:

fio jobfile.fio

10. 显示详细统计信息

  • 显示每个线程的统计数据:
fio --name=read_test --ioengine=sync --rw=read --size=1G --numjobs=4 --time_based --runtime=30s --output-format=normal

这个命令会显示详细的测试结果,包括每个线程的性能数据。

11. 带宽日志

  • 生成带宽日志:
fio --name=bandwidth_test --ioengine=sync --rw=read --size=1G --numjobs=4 --time_based --runtime=30s --bandwidth-log=bandwidth.log

该命令会生成带宽日志,用于后续分析带宽性能。

参数

fio 是一个非常强大的性能测试工具,适用于对存储系统、磁盘、SSD 或网络存储进行基准测试。它提供了很多选项,用于灵活地配置不同类型的测试。以下是一些常用的 fio 选项,帮助你快速上手:

1. 常用参数

  • --name 指定作业的名称。每个作业应该有一个唯一的名称,通常在作业文件中定义。 示例:--name=mytest
  • --ioengine 指定 I/O 引擎(也就是测试使用的驱动程序)。常见的引擎有:
  • sync:同步 I/O(默认)。
  • libaio:Linux 异步 I/O。
  • mmap:内存映射 I/O。
  • pvsync:同步 I/O,逐个块写入。 示例:--ioengine=libaio
  • --rw 指定 I/O 模式(Read/Write)。常见的模式包括:
  • read:只读。
  • write:只写。
  • randwrite:随机写入。
  • randread:随机读取。
  • writewithread:读写混合。
  • randwritewithrandread:随机读写混合。 示例:--rw=randwrite
  • --bs 设置块大小(Block Size)。单位可以是字节、KB、MB 等,例如:4k128k。 示例:--bs=4k
  • --size 设置每个作业的文件大小。通常用于测试文件的大小,例如 1G。 示例:--size=1G
  • --numjobs 设置并行作业的数量(即并发线程数)。 示例:--numjobs=4 (4 个并行作业)
  • --runtime 设置测试运行的持续时间。可以使用单位(例如秒,s)。 示例:--runtime=30m(运行 30 分钟)
  • --time_based 指定基于时间的测试(通常与 --runtime 一起使用)。如果指定此选项,fio 将持续运行直到达到指定的时间,而不是通过文件大小来确定结束。 示例:--time_based
  • --iodepth 设置 I/O 深度(每个作业队列中的 I/O 请求数)。较高的 I/O 深度适用于测试高负载环境。 示例:--iodepth=16
  • --output 指定输出结果保存的文件名。 示例:--output=fio_results.txt
  • --output-format 设置输出格式。常见的格式有:
  • normal:标准输出(默认)。
  • json:JSON 格式。
  • json+:带有额外详细信息的 JSON 格式。
  • terse:简洁输出。 示例:--output-format=json
  • --runtime 设置测试的持续时间。 示例:--runtime=60s(持续 60 秒)
  • --blocksize 设置每个 I/O 操作的大小。 示例:--blocksize=4k
  • --numjobs 设置运行多少个并行作业。 示例:--numjobs=4

2. 其他常用选项

  • --verify 启用数据验证。默认情况下,fio 只进行性能测试,如果启用此选项,fio 会在写入数据后对数据进行验证,确保没有错误。 示例:--verify=md5
  • --io_size 设置单个线程的总 I/O 操作大小。 示例:--io_size=1G
  • --direct 指定是否绕过文件系统缓存,直接对磁盘进行操作。使用该选项可以测试存储设备的原始性能。 示例:--direct=1(启用直接 I/O)
  • --runtime 设置测试运行的时间长度。例如,可以设置为 10 分钟: 示例:--runtime=10m
  • --group_reporting 启用分组报告。此选项使得多个作业的结果可以在一行中报告,便于比较。 示例:--group_reporting
  • --latency 打印出延迟的详细信息。 示例:--latency
  • --trim 对存储设备进行修整操作,这对 SSD 测试尤为重要。 示例:--trim=1(启用修整操作)
  • --numjobs 设置并行作业的数量,控制线程的数量。 示例:--numjobs=4(启动 4 个作业)

3. 高级选项

  • --rate 控制 I/O 操作的速率。例如设置为 10 MB/s: 示例:--rate=10M
  • --runtime 设置作业的最大运行时间,单位为秒(s),分钟(m)等。 示例:--runtime=60m
  • --time_based 表示测试是时间为基础,而不是根据文件大小来停止。 示例:--time_based
  • --write_bw_log 用于生成写操作带宽日志。 示例:--write_bw_log=write_bw_log
  • --bandwidth-log 生成带宽汇总日志。 示例:--bandwidth-log

示例命令:

  1. 基本的随机写入测试:
fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=4k --size=1G --numjobs=4 --runtime=30m --output=result.txt
  1. 基于时间的顺序读取测试:
fio --name=seqread --ioengine=sync --rw=read --bs=128k --size=10G --time_based --runtime=1h --output=result.txt
  1. 并行测试与结果汇总:
fio --name=multi --ioengine=sync --rw=write --bs=8k --size=1G --numjobs=8 --runtime=10m --group_reporting --output=result.txt
  1. 带有数据验证的随机写入测试:
fio --name=randwrite_verify --ioengine=sync --rw=randwrite --bs=4k --size=2G --numjobs=2 --verify=md5 --runtime=15m --output=result_verify.txt