Fio测试过程中经常会遇到iodepth与numjobs设置问题,本篇介绍这两个参数的作用。
iodepth=int 要针对文件保持动态的 I/O 单元数。请注意,将 iodepth 增加到 1 以上不会影响同步 io引擎(使用 verify_async 时,小深度除外)。即使是异步引擎也可能施加操作系统限制,导致无法实现所需的深度。在Linux上,当使用libaio而不设置“direct=1”时,可能会发生这种情况,因为缓冲I/O在该操作系统上不是异步的。 密切关注 fio 输出中的 I/O 深度分布,以验证实现的深度是否符合预期。默认值:1。 iodepth_batch_submit=int,iodepth_batch=int 这定义了一次要提交多少条I/O。它默认为1,这意味着我们会在单个I/O可用时尽快提交,但可以在此时提交更大批次的I/O。如果设置为0,则将使用iodepth值,默认使用iodepth值。 iodepth_batch_complete_min=int, iodepth_batch_complete=int 这定义了一次要检索多少条I/O。它默认为1,这意味着我们将要求在内核的检索过程中至少有1个I/O。 I/O检索将持续进行,直到达到iodepth_low设置的限制为止。如果此变量设置为0,则fio将始终在排队等待更多I/O之前检查已完成的事件。这有助于减少I/O延迟,但代价是需要更多的检索系统调用。 iodepth_batch_complete_max=int 这定义了一次要检索的最大I/O块数。此变量应与iodepth_batch_complete_min=int变量一起使用,指定应检索的最小和最大I/O量的范围。默认情况下,它等于iodepth_batch_complete_min值。示例#1: iodepth_batch_complete_min=1 iodepth_batch_complete_max=(iodepth> 这意味着我们将检索至少1个I/O,最多检索整个提交的队列深度。如果尚未完成任何I/O操作,我们将等待。示例#2: iodepth_batch_complete_min=0 iodepth_batch_complete_max=(iodepth> 这意味着我们可以检索到整个提交的队列深度,但如果还没有完成任何I/O,我们将不会等待并立即退出系统调用。在这个例子中,我们只是进行轮询。 iodepth_low=int 指示何时开始再次填充队列的低水位标记。默认值与iodepth相同,这意味着fio将尝试始终保持队列已满。如果iodepth被设置为例如16,iodepth_low被设置为4,那么在fio填充了16个请求的队列之后,它将在再次开始填充之前使深度下降到4。
numjobs=int 为此作业创建指定数量的克隆。作业的单个克隆都被派生为一个独立的线程或进程。可以用于设置更多执行相同操作的线程/进程。单个线程单独报告;要查看所有克隆作为一个整体的统计信息,请将groupporting与newgroup结合使用。请参阅—max-jobs。默认值:1。
存储端采用4个100G的LUN进行测试,硬盘使用25块HDD硬盘。
测试脚本:
使用4个LUN进行测试,测试发现单个LUN队列深度大致不超过8,总队列深度不超过32,如下图:
测试结果确认队列深度为32:
测试脚本:
使用4个LUN进行测试,测试结果单个LUN队列深度大致不超过32,总队列深度不超过128,如下图:
测试结果确认队列深度大于128:
测试脚本:
使用4个LUN进行测试,测试结果单个LUN队列深度大致不超过32,总队列深度不超过128,如下图:
测试结果确认队列深度大于128:
测试脚本:
使用4个LUN进行测试,测试结果总队列深度不超过32,如下图:
测试结果确认队列深度为1:
测试脚本:
使用4个LUN进行测试,测试结果总队列深度不超过128,如下图:
测试结果确认队列深度为1:
测试脚本:
使用4个LUN进行测试,测试结果总队列深度不超过256,如下图:
测试结果确认队列深度为1:
测试脚本:
使用4个LUN进行测试,测试结果总队列深度不超过128,如下图:
测试结果确认队列深度为32:
测试脚本:
使用4个LUN进行测试,测试结果总队列深度不超过128,如下图:
测试结果确认队列深度为4:
iodepth:为单job下发io的总队列深度,随着队列深度增加,性能增加。
numjobs:为job的总数量,一个job进程绑定一个cpu,一个cpu可以绑定多个job线程,当单个job出现cpu瓶颈时,需要增加job数量以加大服务器端的下发压力。
fio下发的压力由N=iodepth*numjobs决定,单个LUN的队列深度为numjobs * iodepth / lun数量。当单个job出现cpu瓶颈时,需要增加job数量以加大服务器端的下发压力。
测试建议,根据LUN的数量调整N=iodepth*numjobs,控制单LUN队列深度来调整压力下发情况。
如测试结果不符合预期请反馈二线支持。