SPDK QOS机制解析

 

本文关键词:intel  spdk  bdev  qos

序:

intel spdk软件在存储领域应用广泛。因其可以高效管理linux系统的nvme ssd盘,又支持vhost-user协议可以对接qemu虚拟机,在云计算领域通常被用来做本地盘云主机的存储管理软件。如此优秀的一款软件,有必要仔细分析其内部的实现机制,本篇文章主要介绍spdk qos机制。

spdk qos做在bdev层,是面向块设备的qos,不是面向客户端的qos。面向客户端的qos需要做在协议层,部分协议例如iscsi协议本身有qos机制,不过这部分机制不在spdk qos里面讨论, spdk qos可以理解为就是bdev qos

 

spdk qos机制:

目前共支持4qos,分别是IOPS qosBPS qosBPS rqosBPS wqos4qos均放在spdk_bdev_qos->rate_limits数组里面,因此新增加qos也很简单,可直接在数组里面新增qos类型,比如IOPS rqosIOPS wqos。增加新类型qos后,在bdev_qos_set_opsbdev_qos_is_iops_rate_limitqos接口里面也需要增加对应逻辑。

 

为支持多核访问同一个bdevqos需求,spdk采用io任务委托提交的方式向bdev层提交io。具体方式是在多个核中选取一个io任务提交核用于执行bdev_io提交,其余未被选中的核通过bdev_io_submit提交bdev_io时,需要使用spdk_thread_send_msg向提交核发送一个消息,提交核收到消息后使用_bdev_io_submit执行提交,当判断需要qos时,使用bdev_qos_io_submitqos提交bdev_ioqos完成限速后再通过bdev_io_do_submitbdev驱动提交request。完整的提交流程见下图:

 

 当多种qos同时配置时,qos生效策略为都通过才算qos通过,其中任何一种qos要求不满足,就排队不向驱动提交。bdev_io向驱动提交前,和bdev_io从驱动返回后,每种配置的qos均需要更改quota配额。qos生效策略可见下图bdev_qos_io_submit函数。

 

触发bdev qos执行的方式有两种。一种是新io触发,新io提交会主动触发qos检查并依次提交qos queue中的io;另一种是定时poll,在无新io下发的场景使用,原qos queue中的iopollbdev_channel_poll_qos)的运作机制下进行提交,一次poll任务的默认间隔时间是1msSPDK_BDEV_QOS_TIMESLICE_IN_USEC)。

 

bdev qos机制可能带来不连续突发请求的性能抖动,若qos设置太小,主机每次突发请求都较大,会导致qospoll提交生效,某些io的时延可能达到SPDK_BDEV_QOS_TIMESLICE_IN_USEC

 

spdk qos命令:

spdk支持动态调整bdev qos参数,使用bdev_set_qos_limit命令,若相关limit参数设置为0,则相关limit取消(SPDK_BDEV_QOS_LIMIT_NOT_DEFINED),具体命令帮助信息如下图。

 

 

 

 实验验证:

理论知识分析完毕,接下来实践一下spdk qos功能。模拟本地盘云主机场景,先搭建qemu虚拟机通过vhost-user协议跑一下环境IO性能。环境搭建可参考spdk软件包中doc/vhost.md文档,步骤略过。仅介绍搭建好的环境情况如下,物理机spdk中创建一个1G大小的内存盘Malloc0,然后通过Vhost-BLK挂载到虚拟机,虚拟机硬盘随机读性能约80W IOPS

 

 

 物理机上执行命令bdev_set_qos_limit,把IOPS限制到1W,执行命令如下:

 

 

 然后看一下虚拟机的性能,可以看到IOPS已经下降到1W以下,此时带宽为38MIOPS qos限制正确生效。

 

 

 接下来,再限制一下带宽,看看带宽qosIOPS业务的影响。把带宽限制到20M,物理机上执行命令如下:

 

 

 相对于1W IOPS20M带宽限制更严格。看一下环境,虚拟机IOPS业务性能的确是受到更严格的带宽限制影响,带宽下降到20M以下,IOPS下降到5000左右。带宽qos限制正确生效。

 

 

 接下来解除带宽限制,注意限制参数填写0即可。

 

 

 可以看到IOPS恢复到1W IOPS

 

 

 接下来解除IOPS限制,注意限制参数填写0即可。

 

 

 可以看到IOPS恢复到80W IOPS。实验完毕。

 

 

总结:

spdk qos机制清晰明了,使用也很方便,能够满足本地盘云主机使用场景。但是由于不同spdk进程的bdev不能共享,因此多个spdk进程协作qos无法实现。这对希望使用spdk作为客服端对接分布式存储的同学来说不是一个好消息,当多个spdk客户端使用分布式存储提供的同一个盘时,无法正确做qos限速。这往往需要一个额外的qos方案。

 

posted @ 2022-05-19 18:11  天翼云开发者社区  阅读(38)  评论(0编辑  收藏  举报