「fio」- 针对官方文档的快速阅读

问题描述

该笔记将记录:我们在快速阅读 fio 官方文档时产生的学习笔记,其内容来源是对官方文档的摘录,其内容主题是我们需要关注的地方;

解决方案

为了少打字,我们直接机翻或者复制英语原句;

  1. fio – Flexible I/O tester rev. 3.32

1.1. Overview and history

作者需要一种能够模拟给定 I/O 工作负载的工具,而无需一次又一次地编写定制的测试用例。(1)可以涉及任意数量的进程或线程,并且每个进程或线程都可以使用自己的方式生成 I/O。(2)您可能让某人弄脏内存映射文件中的大量内存,或者可能有多个线程使用异步 I/O 发出读取;

fio 需要足够灵活以模拟这两种情况,以及更多情况。Fio 生成许多线程或进程来执行用户指定的特定类型的 I/O 操作。fio 有一些全局参数,每个参数都由线程继承,除非另外给它们的参数覆盖了给定的设置。fio 的典型用途是编写一个与要模拟的 I/O 负载相匹配的作业文件

1.2. Source

暂时略过此部分内容,将来有需要时再进一步深入……

1.3. Mailing list

暂时略过此部分内容,将来有需要时再进一步深入……

1.4. Author

暂时略过此部分内容,将来有需要时再进一步深入……

1.5. Maintainers

暂时略过此部分内容,将来有需要时再进一步深入……

1.6. Binary packages

暂时略过此部分内容,将来有需要时再进一步深入……

1.7. Building

暂时略过此部分内容,将来有需要时再进一步深入……

我们直接使用 Linux 提供的二进制程序进行 fio 学习,暂时不需要我们自己完成构建;

1.7.1. Windows

暂时略过此部分内容,将来有需要时再进一步深入……

1.7.2. Documentation

暂时略过此部分内容,将来有需要时再进一步深入……

1.8. Platforms

我们主要在 Linux 平台中使用 fio 命令,所以暂时不需要关心其他平台相关的内容;

1.9. Running fio

通过定义 jobfile 来指示 fio 如何执行 IO 测试:fio [options] [jobfile] …

默认 jobfile 将顺序执行(stonewall);

如果 jobfile 为 -,则从标准输入中读取作业任务

单个 job 可以直接命令行定义(无需创建 jobfile 文件)。若在 jobfile 中使用 iodepth=2 参数,则对应到命令行中可以使用 –iodepth 2 / –iodepth=2 形式。在命令行中,通过 –name 定义一个 job,再次使用 –name 来定义新的 job,类似于 jobfile(其也是通过多个 [<jobname>] 来定义多个测试作业);

1.10. How fio works

让 fio 模拟所需 I/O 工作负载的第一步是编写描述该特定设置的 jobfile 文件:
  1. 文件作用:jobfile 可能包含任意数量的线程(用于模拟负载)和文件(将被进程或线程读取和写入);
  2. 文件内容:jobfile 的典型内容是一个定义共享参数的全局部分([global]),以及一个或多个描述所涉及作业的作业部分([<jobname>])。运行时,fio 解析此文件并按照描述设置所有内容;

如果我们从上到下分解一个 jobfile,它包含以下基本参数:
  1. I/O type:定义发布到文件的 I/O 模式。顺序读取、随机写入、顺序或随机地混合。缓冲 I/O 还是直接 / 原始 I/O 等等;
  2. Block size:以多大的块发出 I/O?这可以是单个值,也可以描述块大小的范围;
  3. I/O size:读写多少数据;
  4. I/O engine:如何发出 I/O?可以对文件进行内存映射,可以使用常规读写,可以使用拼接、异步 I/O;
  5. I/O depth:如果 I/O 引擎是异步的,希望维持多大的队列深度(相关概念需要深入理解)
  6. Target file/device:用于分摊工作负载的文件,读写测试将针对这些文件;
  7. Threads, processes and job synchronization:用于模拟工作负载的进程或线程数量,以及如何运行;

以上是为工作负载定义的基本参数,此外还有许多参数可以修改此作业行为方式的其他方面;

1.11. Command line options

在官方文档中,该部分列出的选项并非所有选项,且多是通用选项。我们进行大致浏览,其具体含义还要结合官方文档的后续解释,才能理解这些选项的含义;

这些选项后面的任何参数都将被假定为 jobfile(除非选项与 jobfile 的参数匹配,此时该选项将被判定与 job 相关)。可以列出多个 jobfile,每个 jobfile 将被视为一个单独的作业组。Fio 将顺序进行每组之间的执行;

1.12. Job file format

; -- start job file --
[global]
rw=randread
size=128m

[job1]

[job2]

; -- end job file --

针对如上配置文件:global,定义默认参数,并且可以定义多个 global 块,但是其仅作用于之后的 [<jobname>] 块;

针对如上配置文件,命令行等价写法:fio –name=global –rw=randread –size=128m –name=job1 –name=job2

如果未指定 filename 参数(该选项用于指定被读写文件),fio 创建将自定义文件;

源码 examples/ 给出很多使用示例;

fio –cmdhelp 查看命令行帮助;

; -- start job file --
[random-writers]
ioengine=libaio
iodepth=4
rw=randwrite
bs=32k
direct=0
size=64m
numjobs=4
include glob-include.fio
; -- end job file --

针对如上配置,命令行等价写法:fio –name=random-writers –ioengine=libaio –iodepth=4 –rw=randwrite –bs=32k –direct=0 –size=64m –numjobs=4

针对 numjobs=4 参数,将产生 4 个进程,每个进程都具有 ioengine=libaio iodepth=4 rw=randwrite bs=32k direct=0 size=64m 配置

针对 include glob-include.fio 参数,其将引入其他文件,但是 glob-include.fio 不能包含 [] 块,只能包含配置指令;

1.12.1. Environment variables

; -- start job file --
[random-writers]
rw=randwrite
size=${SIZE}
numjobs=${NUMJOBS}
; -- end job file --

在 jobfile 中,${VARNAME} 参数将被展开,其指将从环境变量读取;

在命令行中,通过环境变量指定参数:SIZE=64m NUMJOBS=4 fio jobfile.fio

1.12.2. Reserved keywords

$pagesize(系统页大小),$mb_memory(内存容量),$ncpus(可用处理器数),其为保留关键字,可在 jobfile 中使用,运行时将被解析为对应的值,并且支持简单运算(例如:size=8*$mb_memory);

1.13. Job file parameters

该部分描述与作业关联的每个参数:(1)一些参数采用给定类型的选项,例如整数或字符串。(2)任何需要数值的地方都可以使用算术表达式(+-×/%^),前提是它被括号括起来;

针对表达式中的时间值,单位默认为微秒。这与不在表达式中(未括在括号中)的时间值不同。使用以下类型:

1.13.1. Parameter types

在 fio 中,参数具有 str, time, int, bool, irange, float_list 等等类型,其具体单位、格式、进制参考文档;

1.13.2. Units

在 fio 中,参数 kb_base=int,unit_base=int 能够控制进制、基数;

1.13.3. Job description

name=str,description=str,loops=int,numjobs=int

numjobs=int(default=1),定义进程或线程数,这些进程将产生相同的负载(而非均摊定义的负载);要查看整体统计信息,需要将 group_reporting 与 new_group 结合使用。参见 –max-jobs 选项;

1.13.4. Time related parameters

在 fio 中,runtime=time,time_based,startdelay=irange(time),ramp_time=time,用于控制 Job 执行时间、延迟等等行为;

1.13.5. Target file/device

该部分选项与文件读写位置相关,其控制 fio 将要读写的目标文件,以及 fio 对被读写文件的行为;

1.13.6. I/O type

与 IO 类型相关的选项;

1.13.7. Block size

与块大小相关的选项;

1.13.8. Buffers and memory

缓存及内存相关选项

1.13.9. I/O size

该部分选项与 IO 大小相关,该部分选项控制将要读写的数据量;

1.13.10. I/O engine

该部分选项与 IO 大小相关,诸如 libaio, nfs, rbd 等等;

1.13.11. I/O engine specific parameters

该部分选项与特定 IO 引擎相关;

1.13.12. I/O depth

该部分选项与特定 IO Depth 相关;

1.13.13. I/O rate

该部分选项用于控制 IO 频率;

1.13.14. I/O latency

该部分选项用于控制 IO 延迟;

1.13.15. I/O replay

该部分选项用于控制 IO 重放;

1.13.16. Threads, processes and job synchronization

该部分选项与线程、进程、作业同步相关;

1.13.17. Verification

该部分选项将指示 fio 对读写的数据进行验证;

1.13.18. Steady state

该部分选项用于基准测试,当性能低于指定指标时,将停止运行;

1.13.19. Measurements and reporting,该部分选项用于控制报告输出;

1.13.20. Error handling

当出现错误时,fio 处理错误的方式;

1.14. Running predefined workloads

运行于内置的 IO 测试:

Aerospike Certification Tool (ACT)

Threaded I/O bench (tiotest/tiobench)

1.14.1. Act profile options

与 ACT 相关的选项;

1.14.2. Tiobench profile options

与 Tiobench 相关的选项;

1.15. Interpreting the output,其为 fio 输出内容的解释(输出指标的含义);

1.16. Terse output

简洁的输出

1.17. JSON output

JSON 输出

1.18. JSON+ output

JSON+ 输出;

1.19. Trace file format

fio 能够将负载记录到文件,然后重放负载,该文件便是 trace file;

1.19.1. Trace file format v1

v1 版本格式;

1.19.2. Trace file format v2

v1 版本格式;

1.19.3. Trace file format v3

v1 版本格式;

1.20. I/O Replay – Merging Traces

与 IO 重放相关的内容;

1.21. CPU idleness profiling

CPU 空闲分析:在某些情况下,我们想了解测试中的 CPU 开销。例如,我们测试补丁是否能降低 CPU 使用率。Fio 实现了一种方法,为每个 CPU 创建一个以空闲优先级运行的线程,这意味着它仅在没有其他人需要 cpu 时运行。通过测量线程完成的工作量,可以据此得出每个 CPU 的空闲状态;

1.22. Verification and triggers

验证与触发器;

1.22.1. Verification trigger example

验证触发示例

1.22.2. Loading verify state

要加载已存储的写入状态,读取验证作业文件必须包含 verify_state_load 选项;

1.23. Log File Formats

Fio 支持多种日志文件格式,用于记录延迟、带宽和 IOPS。这些日志都采用通用格式,

1.24. Client/Server

在 fio 中,支持以 Client/Server 的模式运行;

  1. Examples

2.1. Poisson request flow

2.2. Latency profile

2.3. Read 4 files with aio at different depths

2.4. Read backwards in a file

2.5. Basic verification

2.6. Fixed rate submission

2.7. Butterfly seek pattern

  1. TODO

3.1. GFIO TODO

3.2. Server TODO

3.3. Steady State TODO

  1. Moral License

  1. License

读后总结

在阅读 fio 官方文档后,我们发现:
1)如果想要学会使用 fio 工具,必须要能理解 Linux Kernel Storage Stack 的工作原理;

参考文献

Benchmarking persistent disk performance  |  Compute Engine Documentation  |  Google Cloud