新钛云服已累计为您分享693篇技术干货

 

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

自动缩放器带有一系列调整选项,包括--bulk标志、target_size_ratio、noautoscale、bias、pg_num、pg_num_max和pg_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列。target_size_ratio可以使用ceph osd pool set <pool_name> target_size_ratio <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 版本升级到也包含自动扩缩器的新版本,则所有池都将保留其在升级之前的原始自动扩缩器设置,无论是off、on还是warn。

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

最后,启用日志记录以诊断 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。其他选项是info、debug、critical和error。

故障排除提示
如果自动缩放器未按预期方向缩放怎么办?
检查是否为每个池正确配置了bulk值,使用ceph osd pool autoscale-status。 如果BULK为“false”,则自动缩放器从最小数量的 PG 开始。如果BULK设置为“true”,则自动缩放器从大的数量 PG 开始。如果您在状态输出中看到的任何批量值与预期不符,您可以使用ceph osd pool set <pool-name> bulk <true/false/1/0>更改它们。

为什么自动缩放器无法缩放或使用不正确的值缩放?
检查受影响的池的自动缩放器是否打开/关闭。

如果自动缩放器无法在池上缩放,请检查on是否适用于该池。您可以使用ceph osd pool autoscale-status查看。 在AUTOSCALE列,检查模式是否为on。

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

检查 overlapping root。

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

检查阈值是否影响缩放过程。

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

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

检查 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>。

检查速率设置是否正确。

另一个要检查的调整是rate值,它是池的复制大小(复制池)或纠删码值(纠删码池)。该值决定了该池消耗了多少原始存储容量。使用命令验证它是否根据池的副本大小或纠删码配置文件正确设置osd pool autoscale-status。在该RATE输出的列,您可以看到如何为每个池设置rate。您可以使用ceph osd pool set <pool-name> size <value>调整单个池的速率。

检查 bias 是否设置正确。

正如Tuning Recommendations (https://ceph.io/en/news/blog/2022/autoscaler_tuning/#use-the-bias-value-to-help-the-autoscaler-accurately-adjust-the-number-of-pgs.) 中所解释的,您给池的bias越大,您期望池具有的 PG 就越大。因此,您应该检查是否bias为受影响的池设置了适当的值。

检查 target_size_ratio 是否设置正确。

同样,target_size_ratio是另一种调整,您在池中提供的越多,您期望池中的 PG 就越大,因此,您应该确保该值适合受影响的池。

我怎么知道自动缩放器在做什么?
从高级视图中,您可以使用命令观察自动缩放器的活动ceph progress。此命令的输出显示当前正在扩展其 PG 的池以及扩展了多少。

此外,您可以通过执行ceph osd pool autoscale-status并查看每个池的NEW PG_NUM列,从而得出您与 PG 目标的差异。

有关自动缩放器的最详细视图,请访问管理器日志并查找以下 INFO 级别日志输出:

Pool <pool_name> root_id <root_id> using <capacity> of space, bias <bias>
pg target <pg_target> quantized to <pg_target_nearest_power_of_two> (current <current_pg>)
effective_target_ratio <target_size_ratio> <total_target_ratio> <total_target_bytes> <capacity>
应该使用什么级别的日志记录来检查自动缩放器活动?

需要 Python 日志记录中的error日志级别来检查自动缩放器活动。有关检查和设置自动缩放器日志记录级别的信息。

结论
正确调整 pg_autoscaler 模块是让 Ceph 集群自动管理其归置组的好方法。

我们希望这些自动缩放器调优建议和故障排除技巧能够在所有用户升级到最新版本的 Quincy 时改善他们的开箱即用体验。

有关更多信息,请参阅归置组 (https://docs.ceph.com/en/latest/rados/operations/placement-groups/) 文档,其中包含有关自动缩放器行为的更多详细信息。

*原文: https://ceph.io/en/news/blog/2022/autoscaler_tuning/

推荐阅读

 

————————————————
版权声明:本文为CSDN博主「新钛云服」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/NewTyun/article/details/127418924

 

 

手动重平衡方案:

Ceph Balancer
从Luminous 开始,Ceph 新增的了balancer ,可以将PG 在各个OSD上自动迁移,已达到均衡的效果。推荐使用。

1)查看balancer 模块状态

ceph mgr module ls # 查看各个模块的状态
ceph balancer status

2)启用balancer 模块(默认enable)

ceph mgr module enable balancer

3)启用均衡(默认active 是false)

ceph balancer on

4)设置模式(修改PG mapping)

ceph balancer mode upmap

或设置模式(修改weight)

ceph balancer mode crush-compat

其中upmap 模式设置兼容版本

ceph osd set-require-min-compat-client luminous

Luminous 需要手动设置均衡计划?

ceph balancer eval #对集群所有pool进行权重调整计算,针对特定pool 采用 ceph balancer eval <POOL_NAME>
ceph balancer optimize plan2 #生成一个调优配置,或指定存储池 ceph balancer optimize plan2 default.rgw.buckets.data
ceph balancer eval plan2 #执行调优计算
ceph balancer show plan2 #查看调优计算最终的结果
ceph balancer execute plan2 #根据上面模拟计算的结果,执行最终的权重调整

5)查看调整结果

ceph osd df

6)关闭自动调整

ceph balancer off
ceph balancer status

OSD PG 数统计脚本:包含osd pool的排序,包含osd的排序,输出平均pg数目,输出最大的osd编号,输出最大超过平均值的百分比,输出最少pg的osd编号,输出最小低于平均值的百分比,
用于辅助查看集群各个OSD 的PG 分布情况,参考武汉-磨渣的博客《查询osd上的pg数》

ceph pg dump | awk '
/^PG_STAT/ { col=1; while($col!="UP") {col++}; col++ }
/^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0;
up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) }
for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];}
}
END {
printf("\n");
slen=asorti(poollist,newpoollist);
printf("pool :\t");for (i=1;i<=slen;i++) {printf("%s\t", newpoollist[i])}; printf("| SUM \n");
for (i in poollist) printf("--------"); printf("----------------\n");
slen1=asorti(osdlist,newosdlist)
delete poollist;
for (j=1;j<=slen;j++) {maxpoolosd[j]=0};
for (j=1;j<=slen;j++) {for (i=1;i<=slen1;i++){if (array[newosdlist[i],newpoollist[j]] >0 ){minpoolosd[j]=array[newosdlist[i],newpoollist[j]] ;break } }};
for (i=1;i<=slen1;i++) { printf("osd.%i\t", newosdlist[i]); sum=0;
for (j=1;j<=slen;j++) { printf("%i\t", array[newosdlist[i],newpoollist[j]]); sum+=array[newosdlist[i],newpoollist[j]]; poollist[j]+=array[newosdlist[i],newpoollist[j]];if(array[newosdlist[i],newpoollist[j]] != 0){poolhasid[j]+=1 };if(array[newosdlist[i],newpoollist[j]]>maxpoolosd[j]){maxpoolosd[j]=array[newosdlist[i],newpoollist[j]];maxosdid[j]=newosdlist[i]};if(array[newosdlist[i],newpoollist[j]] != 0){if(array[newosdlist[i],newpoollist[j]]<=minpoolosd[j]){minpoolosd[j]=array[newosdlist[i],newpoollist[j]];minosdid[j]=newosdlist[i]}}}; printf("| %i\n",sum)} for (i in poollist) printf("--------"); printf("----------------\n");
slen2=asorti(poollist,newpoollist);
printf("SUM :\t"); for (i=1;i<=slen;i++) printf("%s\t",poollist[i]); printf("|\n");
printf("Osd :\t"); for (i=1;i<=slen;i++) printf("%s\t",poolhasid[i]); printf("|\n");
printf("AVE :\t"); for (i=1;i<=slen;i++) printf("%.2f\t",poollist[i]/poolhasid[i]); printf("|\n");
printf("Max :\t"); for (i=1;i<=slen;i++) printf("%s\t",maxpoolosd[i]); printf("|\n");
printf("Osdid :\t"); for (i=1;i<=slen;i++) printf("osd.%s\t",maxosdid[i]); printf("|\n");
printf("per:\t"); for (i=1;i<=slen;i++) printf("%.1f%\t",100*(maxpoolosd[i]-poollist[i]/poolhasid[i])/(poollist[i]/poolhasid[i])); printf("|\n");
for (i=1;i<=slen2;i++) printf("--------");printf("----------------\n");
printf("min :\t"); for (i=1;i<=slen;i++) printf("%s\t",minpoolosd[i]); printf("|\n");
printf("osdid :\t"); for (i=1;i<=slen;i++) printf("osd.%s\t",minosdid[i]); printf("|\n");
printf("per:\t"); for (i=1;i<=slen;i++) printf("%.1f%\t",100*(minpoolosd[i]-poollist[i]/poolhasid[i])/(poollist[i]/poolhasid[i])); printf("|\n");
}'
-----------------------------------
Ceph OSDs 间的数据均衡
https://blog.51cto.com/dengchj/2944207

发表评论

邮箱地址不会被公开。 必填项已用*标注