78  
   0
fio iodepth&numjobs参数验证
作者:张奎呈于 2023年05月23日 发布在分类 / 经典配置 / 经典配置 下,并于 2023年05月23日 编辑
fio iodepth numjobs

1 描述

Fio测试过程中经常会遇到iodepth与numjobs设置问题,本篇介绍这两个参数的作用。

2 Fio官方释义

2.1 iodepth

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。

2.2 numjobs

numjobs=int
为此作业创建指定数量的克隆。作业的单个克隆都被派生为一个独立的线程或进程。可以用于设置更多执行相同操作的线程/进程。单个线程单独报告;要查看所有克隆作为一个整体的统计信息,请将groupporting与newgroup结合使用。请参阅—max-jobs。默认值:1。

3 实测结果

存储端采用4个100G的LUN进行测试,硬盘使用25块HDD硬盘。

3.1 numjobs=1,iodepth=32

测试脚本:

使用4个LUN进行测试,测试发现单个LUN队列深度大致不超过8,总队列深度不超过32,如下图:

测试结果确认队列深度为32:

3.2 numjobs=1,iodepth=128

测试脚本:

使用4个LUN进行测试,测试结果单个LUN队列深度大致不超过32,总队列深度不超过128,如下图:

测试结果确认队列深度大于128:

3.3 numjobs=1,iodepth=256

测试脚本:

使用4个LUN进行测试,测试结果单个LUN队列深度大致不超过32,总队列深度不超过128,如下图:


测试结果确认队列深度大于128:

3.4 numjobs=32,iodepth=1

测试脚本:

使用4个LUN进行测试,测试结果总队列深度不超过32,如下图:

测试结果确认队列深度为1:


3.5 numjobs=128,iodepth=1

测试脚本:

使用4个LUN进行测试,测试结果总队列深度不超过128,如下图:

测试结果确认队列深度为1:

3.6 numjobs=256,iodepth=1

测试脚本:

使用4个LUN进行测试,测试结果总队列深度不超过256,如下图:

测试结果确认队列深度为1:


3.7 numjobs=4,iodepth=32

测试脚本:

使用4个LUN进行测试,测试结果总队列深度不超过128,如下图:

测试结果确认队列深度为32:

3.8 numjobs=32,iodepth=4

测试脚本:


使用4个LUN进行测试,测试结果总队列深度不超过128,如下图:

测试结果确认队列深度为4:


4 参数分析

iodepth:为单job下发io的总队列深度,随着队列深度增加,性能增加。

numjobs:为job的总数量,一个job进程绑定一个cpu,一个cpu可以绑定多个job线程,当单个job出现cpu瓶颈时,需要增加job数量以加大服务器端的下发压力。


5 总结

fio下发的压力由N=iodepth*numjobs决定,单个LUN的队列深度为numjobs * iodepth / lun数量。当单个job出现cpu瓶颈时,需要增加job数量以加大服务器端的下发压力。

测试建议,根据LUN的数量调整N=iodepth*numjobs,控制单LUN队列深度来调整压力下发情况。

如测试结果不符合预期请反馈二线支持。

 关联资源


 知识评论当前评论数0

 推荐知识


 访问权限

创建人 张奎呈
工作小组 宏杉成员
文档编辑权限 工作小组
文档阅读权限 来自分类
分类阅读权限 所有人
分类编辑权限 技术服务部  : 机构     渠道合作伙伴  : 机构     系统管理员 : 人员     
分类审核权限 审核小组  : 岗位    
分类预览权限 审核小组 : 岗位    
分类下载权限 技术服务部  : 机构    
 历史版本

修改日期 修改人 备注
2023-05-23 15:28:07[当前版本] 张奎呈 CREAT

 附件
 目录
     关联知识
    1. fio 重删&压缩参数验证
    宏杉案例知识库-V4.0.1