升级到 Quincy 前后,您需要了解的关于 PG 自动缩放器的所有信息

Laura Flores 和 Kamoltat Sirivadhna

简介

pg_autoscaler 模块首次在 Nautilus (14.2.x) 版本中推出,是一种自动管理 Ceph 集群中放置组的绝佳方式。基于预期的池使用情况,pg_autoscaler 可以提出建议并根据池使用情况和用户设置的调整来调整集群中的放置组数量。

自动伸缩器附带多种调整选项,包括 --bulk 标志、target_size_rationoautoscalebiaspg_numpg_num_maxpg_num_min。为了准备最新的 Quincy 版本,我们将这些调整通过发布标准测试,并得出了调整建议和故障排除技巧,用户可以在升级到 Quincy 时参考。在这篇博文中,我们总结了自动伸缩器最初面临的挑战,概述了发布标准测试产生的最佳调整实践,并提供了一些自动伸缩器故障排除技巧。

最初的挑战和对 --bulk 标志的需求

在 Quincy 之前,一些直接安装 Ceph 的用户从一开始就遇到了性能问题。默认情况下,自动伸缩器会从最少的 PG 数量开始每个池,只有在用量增加后才会增加该数量。这种行为主要导致大型池的性能不佳,这些池需要比自动伸缩器提供的最少数量更多的 PG。

这种“开箱即用性能差”的体验促成了 Quincy 引入 --bulk 标志。用户现在可以在创建他们知道提前会很大的池时指定 --bulk 标志。通过在池上设置 --bulk 标志,自动伸缩器将从一开始分配更多的 PG。这样,用户就不必等待自动伸缩器检测到更多使用情况,然后才能分配适当数量的 PG。

调整建议

为了获得最佳性能,应在大型池上使用 --bulk 标志。

现在可以使用 --bulk 标志来指示池将很大,并且应该从一开始就使用大量的 PG。用户可以在创建新池和现有池上设置 --bulk 标志。未设置 --bulk 标志的任何池都将保留从最少数量的 PG 开始的默认行为。

要在创建池时设置 --bulk 标志,请使用 ceph osd pool create <pool-name> --bulk。要设置或取消现有池上的 --bulk 标志,请使用 ceph osd pool set <pool-name> bulk <true/false/1/0>。要获取现有池上的 --bulk 标志状态,请使用 ceph osd pool get <pool-name> bulk

如果预计池相对于其他池消耗更多集群容量,请使用 target_size_ratio 设置。

可以使用 target_size_ratio 设置指定池的目标比率。如果知道池应该与其他池具有一定的比率,这将非常有用。默认情况下,每个池的目标比率应为 0,除非另有说明。您给池提供的目标比率越高,您期望池拥有的 PG 越大。

要检查池的目标比率,请使用 osd pool autoscale-status 并查看 TARGET RATIO 列。可以使用 ceph osd pool set <pool_name> target_size_ratio <ratio> 在现有池上设置 target_size_ratio。要在创建池时设置 target_size_ratio,请使用 ceph osd pool create --target-size-ratio <ratio>

使用 noautoscale 标志全局切换所有池的自动伸缩器。

现在可以使用 noautoscale 标志全局打开和关闭所有池的自动伸缩器。默认情况下,此标志设置为 false,并且每个池的默认 pg_autoscale 模式保持不变,即 on

如果要为每个池打开自动伸缩器,请使用 ceph osd pool unset noautoscale。如果想为每个池关闭自动伸缩器,请使用 ceph osd pool set noautoscale。要获取 noautoscale 标志的当前值,请使用 ceph osd pool get noautoscale

使用 bias 值帮助自动伸缩器准确调整 PG 数量。

偏差是用于根据有关该池预期 PG 数量的先验信息手动调整池的 PG 的乘数。默认情况下,偏差值应为 1.0,除非另有说明。您给池提供的偏差越大,您期望池拥有的 PG 越大。

要检查池上的 bias 值,请使用 osd pool autoscale-status 并查看 BIAS 列。要设置现有池上的 bias,请使用 ceph osd pool set <pool_name> pg_autoscale_bias <bias>

如果您提前知道池的使用率,请在创建池之前使用 pg_num 选项。

当创建集群或池时,只有一小部分集群容量被消耗。因此,您的系统可能会低估集群或池需要的 PG 数量。如果您提前知道集群或池的使用率,请在创建池之前使用 pg_num 选项。这将帮助您的集群提前考虑适当数量的 PG。

要检查池的 pg_num 值,请使用 ceph osd pool autoscale-status 并查看 PG_NUM 列。要在创建池时指定 pg_num,请使用 ceph osd pool create <pool_name> <pg_num>。要设置池中允许的最小 PG 数量,请使用 ceph osd pool set <pool-name> pg_num_min <pg_num>。要设置池中允许的最大 PG 数量,请使用 ceph osd pool set <pool-name> pg_num_max <pg_num>

使用 pg_num_max 值设置池中的最大 PG 数量。

可以指定池中的最大 PG 数量。这在创建较小的池(例如 .mgr、元池或未设置 --bulk 标志的池)时很有用。

要在池创建时指定最大 PG 计数,请使用可选的 --pg-num-max <num> 参数与 ceph osd pool create 命令一起使用。对于池创建之后,请使用 ceph osd pool set <pool-name> pg_num_max <num>

使用 pg_num_min 值设置池中的最小 PG 数量。

同样,我们可以指定池中的最小 PG 数量。当希望在池大部分为空时,客户端在执行 IO 时看到的并行度下限时,这将非常有利。这在创建使用 --bulk 标志设置的较大池时很有用。

要在池创建时指定最小 PG 计数,请使用可选的 --pg-num-min <num> 参数与 ceph osd pool create 命令一起使用。对于池创建之后,请使用 ceph osd pool set <pool-name> pg_num_min <num>

升级到 Quincy 之前需要了解的内容

从没有自动伸缩器的 Ceph 版本升级到具有自动伸缩器的 Ceph 版本时,自动伸缩器将在升级后对每个池可用,并且默认情况下对所有池都为 off。但是,如果您从具有自动伸缩器的 Ceph 版本升级到也包含自动伸缩器的较新版本,所有池将保留升级前自动伸缩器的原始设置,无论是 offon 还是 warn

要使用版本 >= 16.2.8 的 Ceph 中 --bulk 标志,用户需要升级到 Ceph。

最后,重要的是启用日志记录以诊断 pg_autoscaler 模块的任何问题。与所有管理器模块一样,pg_autoscaler 具有一个 log_level 选项,用于指定其 Python 记录级别。我们建议您使用 warning 来捕获有关升级过程的信息。要获取 pg_autoscaler 模块的当前日志级别,请使用 ceph config get mgr mgr/pg_autoscaler/log_level。要将 pg_autoscaler 日志级别设置为 warning,请使用 ceph config set mgr mgr/pg-autoscaler/log_level warning。其他选项包括 infodebugcriticalerror

故障排除技巧

如果自动伸缩器没有按预期方向伸缩怎么办?

使用 ceph osd pool autoscale-status 检查每个池的 bulk 值是否配置正确。如果 BULK 为“false”,则自动伸缩器从最少的 PG 数量开始。如果 BULK 设置为“true”,则自动伸缩器从大量的 PG 数量开始。如果您在状态输出中看到任何不符合预期的 bulk 值,可以使用 ceph osd pool set <pool-name> bulk <true/false/1/0> 进行更改。

为什么自动伸缩器无法伸缩或以不正确的值伸缩?

  1. 检查受影响池的自动伸缩器是否已打开/关闭。

    如果自动伸缩器无法在池上伸缩,请检查它是否对该池为 on。您可以使用 ceph osd pool autoscale-status 执行此操作。在 AUTOSCALE 列下,检查模式是否为 on

    如果您发现它是 off,可以使用 osd pool set <pool-name> pg_autoscale_mode on 打开受影响池的自动伸缩器。如果池的自动伸缩器为 on,但您希望将其关闭,可以使用 osd pool set <pool-name> pg_autoscale_mode off 关闭它。

  2. 检查是否有重叠的根。

    如果自动伸缩器模式对于每个池都正确,则自动伸缩器可能由于集群中的重叠根而无法伸缩。检查管理器日志是否有此警告日志:pool <id> contains an overlapping root <id> … skipping scaling。我们建议使池仅属于一个根,以消除警告并确保成功的伸缩过程。

  3. 检查阈值是否影响伸缩过程。

    检查 threshold 值是否设置为适当的值(默认值为 3.0)。此值是决定是否执行伸缩过程的关键因素。如果阈值过大(> 5.0),则需要更多的利用率才能触发自动伸缩过程。另一方面,如果阈值过小(< 2.0),则池可能对伸缩过于敏感。

    要调整池的阈值,请使用 ceph osd pool set threshold <value>

  4. 检查 mon_target_pg_per_osd 是否设置为适当的值。

    接下来要检查的调整是 mon_target_pg_per_osd,即每个 OSD 的目标 PG 数量。默认情况下,此选项应设置为 100。如果您发现每个 OSD 的 PG 数量不符合预期,可以使用命令 ceph config set global mon_target_pg_per_osd <value> 进行调整。

  5. 检查 rate 是否设置正确。

    另一个要检查的调整是 rate 值,即复制大小(复制池)或擦除码值(擦除编码池)的池。此值决定了该池上消耗的原始存储容量。通过使用命令 osd pool autoscale-status 验证它是否根据池的复制大小或擦除码配置设置正确。在该输出的 RATE 列下,您可以查看每个池的费率设置方式。您可以使用 ceph osd pool set <pool-name> size <value> 调整单个池的费率。

  6. 检查 bias 是否设置正确。

    调整建议 中所述,您给池提供的偏差越大,您期望池拥有的 PG 越大。因此,您应该检查受影响池的 bias 是否设置为适当的值。

  7. 检查 target_size_ratio 是否设置正确。

    同样,target_size_ratio 是另一个调整,您提供的越多,您期望池拥有的 PG 越大,因此您应该确保该值对于受影响的池是适当的。

我如何知道自动伸缩器在做什么?

从高级别的角度来看,您可以使用命令 ceph progress 观察自动伸缩器的活动。此命令的输出显示当前正在伸缩其 PG 及其数量的池。

此外,您可以通过执行 ceph osd pool autoscale-status 并查看每个池的 NEW PG_NUM 列来推断您离 PG 目标有多远。

要获得自动伸缩器的最详细视图,请访问管理器日志并查找这些 INFO 级别日志输出

池 <pool_name> 的 root_id 为 <root_id>,使用 <capacity> 的空间,偏差 <bias>

pg 目标值为 <pg_target>,量化为 <pg_target_nearest_power_of_two>(当前值为 <current_pg>)

有效目标比率 <target_size_ratio> <总目标比率> <总目标字节数> <capacity>

我应该使用哪个级别的日志来检查自动伸缩器的活动?

需要 Python 日志中的 `error` 日志级别来检查自动伸缩器的活动。请参考 升级到 Quincy 之前需要了解的事项,了解有关检查和设置自动伸缩器日志级别的信息。

结论

pg_autoscaler 模块在正确调整后,是自动管理 Ceph 集群放置组的好方法。我们希望这些自动伸缩器调整建议和故障排除技巧能够改善所有用户在升级到最新版本的 Quincy 时的开箱即用体验。有关更多信息,请参阅 放置组 文档,其中包含有关自动伸缩器行为的更多详细信息。我们还鼓励已升级到 Quincy 的用户通过邮件列表 ceph-users@ceph.io 联系我们,提出任何问题或反馈意见,关于自动伸缩器。