fio中的iodepth到底是什么?

GP9*_*P92 8 performance io

fio的iodepth和存储的队列深度都一样吗?那么,如何使用 fio 命令中的 iodepth 参数来控制队列深度?这是否会创建并行作业,但同样有一个选项可以并行运行作业(这不是微不足道的或冲突的吗?)

我正在努力理解 fio 如何控制它的工作负载(特别是关于这个 iodepth)。有人可以详细解释iodepth参数。

更新 #1

在Flexible I/O Tester 的论坛中也有人问过我的问题。这是我在那里收到的答案。

你好,

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 等)。此外,如HOWTO中所述,iodepth 仅影响异步 ioengines(并注意文本包含有关需要在 Linux 上使用 direct=1 的警告)。

命令?这是否会创建并行作业,但同样有一个选项可以并行运行作业(这不是微不足道的或冲突的吗?)

我将给出一个简短的总结,但请注意,我并不是要涵盖缓存/预读/插入/块设备层(例如 RAID/LVM)等:

同步 fio I/O 引擎向 OS 提交单个 I/O,等待它被“确认”为已收到,然后发送另一个 I/O 等。

如果 fio I/O 引擎能够以真正异步的方式向操作系统提交 I/O(参见上面的链接),那么关键是它不必在提交之前等待较早的 I/O 被“确认”新的 I/O。如果 iodepth 仅为 1,它将必须以类似于同步 I/O 引擎的方式运行。但是,假设作业指定 iodepth 为 32。在这种情况下,fio 将选择等待再提交更多 I/O(水印是什么以及一次提交多少)之前最多有 32 个未完成的 I/O。时间由 iodepth_batch_* 选项控制。这可以更有效并实现更高的吞吐量,但通常会带来更高的延迟成本。

fio 不会仅仅因为 iodepth而创建并行fio 作业,但使用并行 fio 作业是增加在任何给定时间提交的同时 I/O 数量的另一种方式(通过使用不同的线程/进程),并且在同一设备上使用两者将协同行动(因此,如果您有两个 fio 作业以 16 个 iodepth 提交异步 I/O,那么您的操作系统在任何给定时间实际上可能会接收 32 个 I/O)。将两者结合起来可能是有原因的(例如,您有多个设备,而且它们的速度非常快,即使在异步提交 I/O 时,一个 CPU 也无法跟上)。

我正在努力理解 fio 如何控制它的工作负载(特别是关于这个 iodepth)。有人可以详细解释iodepth参数。

我会注意到你也在stackexchange上问过这个问题(fio 中的 iodepth 到底是什么?)。您可能想从那里链接到 https://www.spinics.net/lists/fio/msg07190.html以帮助可能有类似问题的其他人...

sou*_*edi 6

这不是一件小事吗?

假设 iodepth= 工作所需的直接 IO。

iodepth=2 的顺序作业将一次提交两个顺序 IO 请求。

numjobs=2 的顺序作业将有两个线程,每个线程提交顺序 IO。

这些是不同的 IO 模式。后者将在 IO 总线上产生 2 倍的带宽,即使物理 IO 由于设备缓存而减少回 1 倍。(我怀疑由于设备缓存,这两个作业往往会保持同步,除非您使用多个文件和一个随机的file_service_type=)。如果 IO 是同步写入 (sync=true),则物理 IO 根本不会减少,除非设备进行了不寻常的优化(可能是重复数据删除 SSD 控制器)。


slm*_*slm 0

根据Linux 内核文档:

.. 选项:: iodepth=int

针对文件保持运行的 I/O 单元数。请注意,将iodepth增加到超过 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%
Run Code Online (Sandbox Code Playgroud)

Submit和Complete分别代表fio一次提交IO的数量和一次完成的数量。在用于生成此输出的抖动测试的情况下,iodepth 的默认值为 1,因此 100% 的 IO 一次提交 1 个,将结果放入 1-4 存储桶中。基本上,这些仅在 iodepth 大于 1 时才重要。