fio的iodepth和队列存储深度是否相同?那么,如何使用 fio 命令中的 iodepth 参数来控制队列深度呢?这会创建并行作业,但也可以选择并行运行作业(这不是微不足道或冲突吗?)
我正在努力理解 fio 如何控制它的工作负载(特别是关于这个 io深度)。有人可以详细解释一下 iodepth 参数吗?
更新#1
我的问题也是在灵活 I/O 测试仪论坛中提问。这是我在那里收到的答案。
你好,
2018 年 7 月 28 日 14:26,Jeevan Patnaik 写道:嗨,
fio的IoDepth和队列存储深度是否相同?那么,如何使用 fio 中的 iodepth 参数来控制队列深度
fio iodepth 和您的操作系统将 I/O 提交到存储所实现的深度 I/O 是相关的,但大多数情况下不一定必须相同,并且这种关系高度依赖于您的操作系统/存储/使用的 fio ioengine/fio 参数。基本上,fio 以特定方式向操作系统提交 I/O。根据您向操作系统提交 I/O 的方式,它可以选择以更优化/不同的方式进一步向下提交(例如,通过将请求批量处理在一起、将太大的请求分解为较小的部分、延迟 I/O 等) )。另外,如中所述如何、 iodepth 仅影响异步 ioengine(请注意,文本包含有关需要在 Linux 上使用 direct=1 的警告)。
命令?这会创建并行作业,但也可以选择并行运行作业(这不是微不足道或冲突吗?)
我将给出一个简短的总结,但请注意,我并不是试图涵盖缓存/预读/插入/块设备层(例如 RAID/LVM)等:
同步 fio I/O 引擎向操作系统提交单个 I/O,等待其被“确认”已接收,然后发送另一个 I/O 等。
如果 fio I/O 引擎能够以真正异步的方式向操作系统提交 I/O(请参阅上面的链接),那么关键是它不必在提交之前等待较早的 I/O 被“确认”新的输入/输出。如果 iodepth 仅为 1,则其行为方式必须类似于同步 I/O 引擎。然而,假设一个作业指定了 32 的 io深度。在这种情况下,最多有 32 个 I/O 未完成,然后 fio 将选择在提交更多 I/O 之前等待(只是水印是什么以及在某个时间提交了多少)。时间由 iodepth_batch_* 选项控制,这可以提高效率并实现更高的吞吐量,但通常会带来更高的延迟。
fio不会创建并行菲奥职位只是因为 iodepth 但使用并行 fio 作业是增加在任何给定时间提交的并发 I/O 数量的另一种方法(通过使用不同的线程/进程),并且在同一设备上使用两者将同时起作用(因此,如果您有两个 fio 作业以 io深度 16 提交异步 I/O,每个作业在任何给定时间都可能实际接收 32 个 I/O)。将两者结合起来可能是有原因的(例如,您有多个设备,并且它们的速度太快,以至于即使异步提交 I/O,一个 CPU 也无法跟上)。
我正在努力理解 fio 如何控制它的工作负载(特别是关于这个 io深度)。有人可以详细解释一下 iodepth 参数吗?
我会注意到你也在 stackexchange 上问过这个问题(fio中的iodepth到底是什么?)。您可能想要链接到 https://www.spinics.net/lists/fio/msg07190.html从那里帮助其他可能有类似问题的人......
答案1
这不是一件小事吗?
假设直接 IO,根据 iodepth= 工作的需要。
iodepth=2 的顺序作业将一次提交两个顺序 IO 请求。
numjobs=2 的顺序作业将有两个线程,每个线程提交顺序 IO。
这些是不同的 IO 模式。后者将在 IO 总线上生成 2 倍的带宽,即使物理 IO 由于设备缓存而减少回 1 倍。 (我怀疑由于设备缓存,这两个作业往往会保持同步,除非您使用多个文件和随机的file_service_type=
)。如果 IO 是同步写入 (sync=true),则物理 IO 根本不会减少,除非设备正在进行异常量的优化(可能是重复数据删除 SSD 控制器)。
答案2
根据Linux 内核文档:
.. 选项:: iodepth=int
针对文件保持运行的 I/O 单元数。请注意,增加深度超过 1 不会影响同步 ioengine(除了
verify_async
使用 :option: 时的小度数)。即使异步引擎也可能会施加操作系统限制,导致无法达到所需的深度。在 Linux 上使用 libaio 且未设置 :option:direct
\=1 时可能会发生这种情况,因为缓冲 I/O 在该操作系统上不是异步的。密切关注 fio 输出中的 I/O 深度分布,以验证所实现的深度是否符合预期。默认值:1。
本教程的标题为:Fio 输出解释有这个例子:
Fio 有一个 iodepth 设置,可控制在任何给定时间向操作系统发出的 IO 数量。这完全是应用程序端的,这意味着它与设备的 IO 队列不同。在本例中,iodepth 设置为 1,因此 IO 深度在 100% 的情况下始终为 1。
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=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
Submit和Complete分别代表fio一次提交IO的数量和一次完成的数量。在用于生成此输出的抖动测试的情况下,iodepth 的默认值为 1,因此 100% 的 IO 一次提交 1 个,将结果放入 1-4 存储桶中。基本上,这些仅在 iodepth 大于 1 时才重要。