利用压缩加速器

https://blueprints.launchpad.net/cinder/+spec/leverage-compression-accelerator

此蓝图建议利用硬件压缩加速器来加速将卷上传到 glance 作为镜像时的镜像压缩。

问题描述

在尝试将卷上传到 glance 作为镜像时,目前所有的格式转换都由软件完成,性能不佳。

例如,当上传大小为 30GB,包含 12GB 数据的卷,并选择 qcow2 作为目标镜像格式时,当前用于执行转换的工具是 qemu-img。 这存在以下问题:

  1. 压缩率低 转换后,输出大小为 12GB。

  2. CPU 占用率高 在转换过程中,CPU 使用率约为 100%-170% (~ 两个核心)。

  3. 持续时间长 转换卷所需的时间约为 23 秒。

作为对比,如果使用硬件加速器执行格式转换,选择 ‘gzip’ 作为目标格式,性能会更好。 以 Intel QAT 作为加速器为例,性能数据如下:

  1. 压缩率 转换后,输出大小为 2.3GB。

  2. CPU 占用率 在转换过程中,CPU 使用率约为 97% (一个核心)。

  3. 持续时间 转换卷所需的时间约为 9 秒。

因此,压缩后的尺寸仅为原始尺寸的四分之一,但耗时不到原来的一半。

用例

  • 用户希望将卷上传到 glance 作为压缩镜像

提议的变更

  • 添加新的容器格式 ‘compressed’

    Cinder 没有一个枚举来控制容器格式列表,而是磁盘格式。 但是 cinder 将为 ‘compressed’ 容器格式提供特定的步骤。 请参阅以下更改。

    此规范不会更改磁盘格式,它可以是 cinder.api.schemas.volume_actions.volume_upload_image 中的任何类型。

  • 添加一个选项以启用/禁用镜像压缩支持

    如果不存在硬件加速器,则它将回退到软件解决方案来执行压缩。 但这将消耗 CPU 资源。 因此,此规范将添加一个选项来控制是否启用压缩功能。

  • 将著名硬件加速器的压缩工具添加到文件 volume.filters

    压缩工具,例如 ‘qzip’ 将被添加到 volume.filters 中,以便它可以由 root wrapper 运行

  • 在选择要上传的卷时,在容器格式列表中显示 ‘compressed’

    这需要在 cinder 客户端和 horizon 中完成。

  • 检查系统中是否存在一些硬件加速器

    遍历加速器工具列表,查找是否存在任何硬件加速器。 如果没有,则在选择压缩格式时回退到软件解决方案。

    这将在 ./cinder/image/accelerator.py 中完成,最后,将调用加速器的驱动程序来检查是否存在。

    参考: https://review.opendev.org/#/c/668825/1/cinder/image/accelerator.py 函数:is_engine_ready https://review.opendev.org/#/c/668825/1/cinder/image/accelerators/qat.py 函数:is_accel_exist

  • 在 convert_image 之后但在上传到 glance 之前执行镜像压缩

    调用现有的加速器工具来执行压缩。 例如,如果识别到 Intel QAT 设备,则在此处调用 qzip 来执行压缩。 如果未识别到加速器,则回退到软件解决方案,使用 gzip 工具进行解压缩。

  • 在从 glance 下载后但在 convert_image 之前执行镜像解压缩

    在从镜像创建卷时,调用硬件加速器执行解压缩。 如果没有硬件加速器,则回退到软件解决方案,使用 gzip 工具进行解压缩

备选方案

另一种方法是仅使用改进的处理器和软件解决方案,例如 gzip。 但成本会高于专用硬件加速器,并且没有性能优势。

REST API 影响

在上传卷到镜像时添加 “compressed” 的镜像类型

数据模型影响

安全影响

通知影响

其他最终用户影响

性能影响

  • 如果可用硬件加速器,则 CPU 占用更少

  • 如果可用硬件加速器,则转换时间更短

  • 镜像尺寸更小

其他部署者影响

  • 需要安装加速器的驱动程序和实用工具

  • 可以配置选项以启用/禁用压缩功能

开发人员影响

  • 希望添加对其他加速器支持的开发人员需要将他们的工具添加到 root wrap

实现

负责人

主要负责人

Liang Fang <liang.a.fang@intel.com>

工作项

  • 在镜像转换期间,如果可能,切换到硬件加速器

  • 实现镜像转换中硬件利用的通用框架

  • 在镜像转换中实现典型的硬件加速器

  • 将添加单元测试

依赖项

测试

  • 将实现单元测试、tempest 和其他相关测试。

  • 特别的测试用例:当从 container_format == ‘compressed’ 的镜像创建卷时,但镜像包含 cinder 不支持的某些格式。 预期行为是优雅地失败。

文档影响

  • 需要文档。 用户文档关于如何使用加速器,以及开发人员文档关于如何添加额外的加速器

参考资料

[1] https://review.opendev.org/#/c/668825/ [2] https://review.opendev.org/#/c/668943/