PAYATHON 2026

Ceph RBD 的 QoS 配置优先级:pool 级还是 image 级?

数据小许

题述条件下,image 级配置优先,该 image 的 rbd_qos_iops_limit 采用 2000 IOPS。生效的前提是访问该 image 的客户端使用支持这些设置的 librbd,且已加载相应配置。2000 是限流配置值,不代表实际性能一定能达到 2000 IOPS。

为什么采用 image 级配置?

对于同一个 RBD 配置项,覆盖顺序为:

image 级配置 > pool 级配置 > 全局配置

pool 级配置为池内的 image 提供默认值。如果某个 image 显式设置了同名参数,就使用该 image 自己的值。覆盖关系按配置项分别应用:设置 image 的 rbd_qos_iops_limit,不会同时覆盖未在 image 上设置的其他 QoS 参数。SUSE Enterprise Storage 的 RBD QoS 文档说明了这一覆盖关系。

因此,pool 设置 1000、image 设置 2000 时,该参数采用 2000,不是取两个值中的最小值。

如何查询和调整配置?

以下示例假设 pool 名为 mypool,image 名为 myimage,执行时请替换为实际名称。

分别查询两个层级显式保存的覆盖值:

rbd config pool get mypool rbd_qos_iops_limit
rbd config image get mypool/myimage rbd_qos_iops_limit

若配置与题述一致,两条命令应分别返回 1000 和 2000。这是预期结果,并非实际环境的测试记录。get 查询的是指定层级的覆盖项,不能仅凭查询结果确认正在运行的业务客户端已经加载了该值。

如果希望该 image 恢复使用 pool 的 1000 IOPS 配置,可以删除 image 级的同名覆盖项:

rbd config image remove mypool/myimage rbd_qos_iops_limit

该命令只移除配置覆盖项,不删除 image。查询和移除命令的语法见 Ceph rbd 命令手册。

为什么实测 IOPS 可能与配置值不同?

librbd QoS 的作用范围是客户端进程中的 image。同一个 image 被不同进程访问时,各进程独立限流。因此,pool 级的 1000 IOPS 是供 image 继承的配置值,不能理解为整个 pool 内所有 image 合计共享 1000 IOPS 的额度。Ceph QoS 配置说明对此有说明。

检查实测结果时,还需要考虑:

  • 访问路径:上述设置属于 librbd QoS。若使用内核 RBD(krbd),不能直接套用 librbd 的限流结论。
  • 其他限流项:读写 IOPS、带宽限制分别生效。即使总 IOPS 配置为 2000,其他限制也可能先触发。
  • burst 和统计周期:QoS 使用令牌桶,配置 burst 后,短时间内的速率可能超过平均限制。
  • 实际处理能力:负载、延迟和存储性能可能使实际 IOPS 低于配置上限。

原问题没有提供 Ceph 版本和客户端访问方式,无法判断现有业务客户端的配置刷新时机。若更改后表现不符,应结合所用版本和客户端确认配置是否已加载,再判断限流效果。

备注:内容仅供参考。