限制每个后端卷复制带宽

https://blueprints.launchpad.net/cinder/+spec/limit-volume-copy-bps-per-backend

目前,Cinder 具有一个全局配置,用于限制卷复制带宽,以减轻大型镜像复制期间实例卷访问速度变慢的问题。( https://blueprints.launchpad.net/cinder/+spec/limit-volume-copy-bandwidth

此规范建议将此配置变量设置为每个后端独立配置。

问题描述

当前的全局配置存在一些问题。

  • 当存在多个后端时,我们无法分配不同的带宽限制。例如,希望允许 SSD 的 bps 比 HDD 更高。

  • 如果卷复制并发运行,将消耗大于 bps 限制的带宽。从 QoS(保持实例访问带宽)的角度来看,我们应该限制每个后端的总卷复制带宽。

用例

提议的变更

使 cinder.conf 参数 ‘volume_copy_bps_limit’ 在每个后端部分中可写。(如果 volume_copy_bps_limit 在 DEFAULT 部分中指定,如现有设计,则该值用作全局默认值。这保持了向后兼容性。)

如果多个卷复制操作并发运行,则 bps 限制将被分割。例如,如果 volume_copy_bps_limit 设置为 100MB/s,并且在后端同时运行 2 个副本,则每个副本最多可以使用 50MB/s。如果其中一个副本完成,则另一个副本的限制更新为 100MB/s。

在 VolumeDriver 类的初始化时,会创建一个 ‘Throttle’ 类对象并存储在每个后端驱动程序对象的 ‘_throttle’ 成员中,该对象管理允许的总带宽和正在进行的卷复制操作。

它应该作为以下参数传递给 copy_volume(),以便它可以设置/更新带宽限制。

volume_utils.copy_volume(…, throttle=self._throttle)

在 copy_volume 方法中,将调用 Throttle 类方法来设置 cgroups(或者当 Throttle 类被覆盖时,使用其他 QoS 功能)。

备选方案

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

当卷复制 I/O 带宽受限时,完成卷复制需要更多时间。要求用户在卷复制性能和对实例性能的干扰之间进行权衡。

其他部署者影响

  • 默认情况下禁用此功能。想要使用此功能的用户需要在 cinder.conf 中设置 ‘volume_copy_bps_limit’。

开发人员影响

  • 将添加一个 ‘_throttle’ 成员到 VolumeDriver 类,应该将其传递给 volume_utils.copy_volume() 和相关函数。否则,带宽限制将被忽略。

  • 在 Linux 环境中,‘_throttle’ 对象将使用 cgroups 实现。非 Linux 环境(例如 Windows)的驱动程序可以覆盖 ‘_throttle’ 的初始化,以使用另一种节流方法。

实现

负责人

主要负责人

tsekiyama (tomoki.sekiyama@hds.com)

工作项

  1. 如果未指定 ‘CONF.volume_copy_bps_limit’,请使用 ‘backend_driver.configuration.volume_copy_bps_limit’ 等。

  2. 用新的 ‘Throttle’ 类替换当前的 setup_blkio_cgroup()

  3. 将 Throttle 对象从后端驱动程序传递给 copy_volume()

依赖项

测试

  • 对于一个具有 volume_copy_bps_limit = 100MB/s 的假后端驱动程序

  • 启动卷复制,然后 bps 限制设置为 100MB/s

  • 启动第二个卷复制,然后限制更新为两者均为 50MB/s

  • 完成其中一个副本,然后限制恢复为 100MB/s

文档影响

Cinder 客户端文档中关于 cinder.conf 中 volume_copy_bps_limit 的描述应该说明可以通过在后端部分中写入此配置来为每个后端驱动程序指定复制 bps 限制。

参考资料