问题描述
该笔记将记录:我们在快速阅读 fio 官方文档时产生的学习笔记,其内容来源是对官方文档的摘录,其内容主题是我们需要关注的地方;
解决方案
为了少打字,我们直接机翻或者复制英语原句;
- 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 为 -,则从标准输入中读取作业任务
默认 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 文件:
- 文件作用:jobfile 可能包含任意数量的线程(用于模拟负载)和文件(将被进程或线程读取和写入);
- 文件内容:jobfile 的典型内容是一个定义共享参数的全局部分([global]),以及一个或多个描述所涉及作业的作业部分([<jobname>])。运行时,fio 解析此文件并按照描述设置所有内容;
如果我们从上到下分解一个 jobfile,它包含以下基本参数:
- I/O type:定义发布到文件的 I/O 模式。顺序读取、随机写入、顺序或随机地混合。缓冲 I/O 还是直接 / 原始 I/O 等等;
- Block size:以多大的块发出 I/O?这可以是单个值,也可以描述块大小的范围;
- I/O size:读写多少数据;
- I/O engine:如何发出 I/O?可以对文件进行内存映射,可以使用常规读写,可以使用拼接、异步 I/O;
- I/O depth:如果 I/O 引擎是异步的,希望维持多大的队列深度(相关概念需要深入理解)
- Target file/device:用于分摊工作负载的文件,读写测试将针对这些文件;
- 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 查看命令行帮助;
针对如上配置文件,命令行等价写法: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 不能包含 [] 块,只能包含配置指令;
针对 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
在命令行中,通过环境变量指定参数: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)
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 的模式运行;
- 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
- TODO
3.1. GFIO TODO
3.2. Server TODO
3.3. Steady State TODO
3.2. Server TODO
3.3. Steady State TODO
- Moral License
- License
读后总结
在阅读 fio 官方文档后,我们发现:
1)如果想要学会使用 fio 工具,必须要能理解 Linux Kernel Storage Stack 的工作原理;
参考文献
Benchmarking persistent disk performance | Compute Engine Documentation | Google Cloud