写点什么

SPDK QOS 机制解析

  • 2022 年 5 月 19 日
  • 本文字数:1630 字

    阅读完需:约 5 分钟

作者:天翼云研发一部 程霄

本文关键词: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 机制:

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

 

为支持多核访问同一个 bdev 的 qos 需求,spdk 采用 io 任务委托提交的方式向 bdev 层提交 io。具体方式是在多个核中选取一个 io 任务提交核用于执行 bdev_io 提交,其余未被选中的核通过 bdev_io_submit 提交 bdev_io 时,需要使用 spdk_thread_send_msg 向提交核发送一个消息,提交核收到消息后使用_bdev_io_submit 执行提交,当判断需要 qos 时,使用 bdev_qos_io_submit 向 qos 提交 bdev_io,qos 完成限速后再通过 bdev_io_do_submit 向 bdev 驱动提交 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 中的 io 在 poll(bdev_channel_poll_qos)的运作机制下进行提交,一次 poll 任务的默认间隔时间是 1ms(SPDK_BDEV_QOS_TIMESLICE_IN_USEC)。

 

bdev qos 机制可能带来不连续突发请求的性能抖动,若 qos 设置太小,主机每次突发请求都较大,会导致 qos 的 poll 提交生效,某些 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 以下,此时带宽为 38M。IOPS qos 限制正确生效。


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


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


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


可以看到 IOPS 恢复到 1W IOPS。


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


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


 总结:

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

 

发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2022.02.22 加入

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

评论

发布
暂无评论
SPDK QOS机制解析_天翼云开发者社区_InfoQ写作社区