PG数计算

原地址:http://xiaqunfeng.cc/2017/09/15/too-many-PGs-per-OSD/

ceph告警问题:”too many PGs per OSD” 的解决方法,以及pg数量的合理设定

现象

1
2
3
4
5
6
7
8
9
10
11
12
13
# ceph -s
cluster 4c7ec5af-cbd3-40fd-8c96-0615c77660d4
health HEALTH_WARN
too many PGs per OSD (412 > max 300)
monmap e2: 3 mons at {ceph0=172.21.1.21:6789/0,ceph1=172.21.1.22:6789/0,ceph2=172.21.1.23:6789/0}
election epoch 1780, quorum 0,1,2 ceph0,ceph1,ceph2
mgr active: ceph0 standbys: ceph1, ceph2
osdmap e94: 6 osds: 6 up, 6 in
flags sortbitwise,require_jewel_osds,require_kraken_osds
pgmap v161317: 824 pgs, 10 pools, 30201 MB data, 8642 objects
90831 MB used, 181 GB / 269 GB avail
824 active+clean
client io 34800 B/s wr, 0 op/s rd, 9 op/s wr

原因

  • 集群osd 数量较少
  • 搭建rgw网关、OpenStack、容器组件等,pool创建较多,每个pool默认需要占用一些pg,pool中pg数目设置不合理,导致集群 total pg 数过多

解决

方法

调整每个osd默认pg数,参数为 mon_pg_warn_max_per_osd ,当前默认参数如下:

1
2
# ceph --show-config | grep mon_pg_warn_max_per_osd
mon_pg_warn_max_per_osd = 300

步骤

1、修改ceph配置文件

1
2
3
4
5
# cd /etc/ceph
# vim ceph.conf
[global]
.......
mon_pg_warn_max_per_osd = 500

2、将配置文件推到mon所在的其他节点

1
# ceph-deploy --overwrite-conf config push ceph1 ceph2

3、重启mon进程

1
# systemctl restart ceph-mon.target

重启成功后,再次查看配置项

1
2
# ceph --show-config | grep mon_pg_warn_max_per_osd
mon_pg_warn_max_per_osd = 500

此时集群状态ok

1
2
3
4
5
6
7
8
9
10
11
12
# ceph -s
cluster 4c7ec5af-cbd3-40fd-8c96-0615c77660d4
health HEALTH_OK
monmap e2: 3 mons at {ceph0=172.21.1.21:6789/0,ceph1=172.21.1.22:6789/0,ceph2=172.21.1.23:6789/0}
election epoch 1780, quorum 0,1,2 ceph0,ceph1,ceph2
mgr active: ceph0 standbys: ceph1, ceph2
osdmap e94: 6 osds: 6 up, 6 in
flags sortbitwise,require_jewel_osds,require_kraken_osds
pgmap v161317: 824 pgs, 10 pools, 30201 MB data, 8642 objects
90831 MB used, 181 GB / 269 GB avail
824 active+clean
client io 34800 B/s wr, 0 op/s rd, 9 op/s wr

pg数目的设定

信息查询

1、查看当前osd数目

1
2
# ceph osd ls | wc -l
6

2、查看当前有多少个pool

1
2
# ceph osd pool ls | wc -l
10

3、查看 replication pool 的数量

1
2
3
4
5
6
7
8
9
10
11
# ceph osd dump | grep repli
pool 0 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 31 flags hashpspool stripe_width 0
pool 1 '.rgw.root' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 14 flags hashpspool stripe_width 0
pool 2 'default.rgw.control' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 16 flags hashpspool stripe_width 0
pool 3 'default.rgw.data.root' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 19 flags hashpspool stripe_width 0
pool 4 'default.rgw.gc' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 20 flags hashpspool stripe_width 0
pool 5 'default.rgw.lc' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 21 flags hashpspool stripe_width 0
pool 6 'default.rgw.log' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 23 flags hashpspool stripe_width 0
pool 7 'default.rgw.users.uid' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 26 flags hashpspool stripe_width 0
pool 8 'kube' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 36 flags hashpspool stripe_width 0
pool 9 'stage' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 54 flags hashpspool stripe_width 0

可以看到,每个pool都是 3 副本(replicated size 3

total pg num

公式如下:

1
Total PGs = (Total_number_of_OSD * 100) / max_replication_count

结果必须取最接近该数的 2 的幂

比如,根据以上信息:

1
2
3
Total_number_of_OSD = 6
max_replication_count = 3
Total PGs = 200

最接近 200 的 2 的幂是 256。所以推荐的集群最大 total PGs 数为 256。

pool pg num

每个 pool 的 pg 数目计算:

1
Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count

结果同样要取最接近的 2 的幂。

对应该例,每个 pool 的 pg num 为:

1
2
pool_count = 10
Total PGs = 200 / 10 = 20

所以每个 pool 的平均分配 pg num 为 16。

pg num command

得到和设置指定 pool 中的 pg_num 和 pgp_num

command function
ceph osd pool create <pool-name> <pg-number> <pgp-number> To create a new pool
ceph osd pool get <pool-name> <pg_num> To get number of PG in a pool
ceph osd pool get <pool-name> <pgp_num> To get number of PGP in a pool
ceph osd pool set <pool-name> <pg_num number> To increase number of PG in a pool
ceph osd pool set <pool-name> <pgp_num number> To increase number of PGP in a pool

创建pool时如果不指定 pg_num,默认为8

1
2
# ceph --show-config | grep osd_pool_default_pg_num
osd_pool_default_pg_num = 8

PG数计算的更多相关文章

  1. 每个pool pg数计算

    ceph PGs per Pool Calculator 原文档:http://xiaqunfeng.cc/2017/09/18/ceph-PGs-per-Pool-Calculator/ 2017- ...

  2. Ceph之PG数调整

    1. PG介绍 PG, Placement Groups.CRUSH先将数据分解成一组对象,然后根据对象名称.复制级别和系统中的PG数等信息执行散列操作,再将结果生成PG ID.可以将PG看做一个逻辑 ...

  3. 调整ceph的pg数(pg_num, pgp_num)

    https://www.jianshu.com/p/ae96ee24ef6c 调整ceph的pg数 PG全称是placement groups,它是ceph的逻辑存储单元.在数据存储到cesh时,先打 ...

  4. ACM Fibonacci数 计算

    Fibonacci数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递 ...

  5. js-小数计算问题

    先上图: 什么情况? 原因:js采用二进制进行小数计算 先看十进制的小数转换为二进制的方法: 十进制数的整数位是二进制数的整数位,十进制数的小数位是二进制数的小数位 假如我们有小数111.4(10), ...

  6. PHP PDO select语句结果行数计算

    PDO有一个函数PDOStatement::rowCount返回上一个SQL语句影响的行数. rowCount函数对于DELETE, INSERT, 或者UPDATE语句的结果是正确的,但对于sele ...

  7. CNN中的卷积操作的参数数计算

    之前一直以为卷积是二维的操作,而到今天才发现卷积其实是在volume上的卷积.比如输入的数据是channels*height*width(3*10*10),我们定义一个核函数大小为3*3,则输出是8* ...

  8. Catalan数计算及应用

    Catalan数列是非常奇妙的一列数字,因为很多问题的解就是一个Catalan数.知道了这一规律,很多看似复杂的问题便可迎刃而解.那么什么是Catalan数,什么样的问题的解是Catalan数呢? 1 ...

  9. Lucene索引数计算

    Elasticsearch默认在创建索引结束时得到5个分片及1个副本: 分片是有0-n个副本,“5个分片及1个副本”即“5个分片及5个相应分片副本”:共10个Lucene索引 副本数:指的是“单个分片 ...

随机推荐

  1. 正则表达式 解决python2升python3的语法问题

      2019.9.12 更新   今天偶然看到 python 官网中,还介绍了一个专门的工具,用于 python2 升级 python3,以后有机会使用下看看 https://docs.python. ...

  2. MyBatis直接执行sql语句mapper

    <select id="queryBySql" resultType="HashMap"> <![CDATA[ ${sql} ]]> & ...

  3. NetCore下搭建websocket集群方案

    介绍 最近在做一个基于netcore的实时消息服务.最初选用的是ASP.NET Core SignalR,但是后来发现目前它并没有支持IOS的客户端,所以自己只好又基于websocket重新搭建了一套 ...

  4. 五分钟学会HTML5的WebSocket协议

    1.背景   很多网站为了实现推送技术,所用的技术都是Ajax轮询.轮询是在特定的的时间间隔由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器.这种传统的模式带来很明显的缺点 ...

  5. opencv HSV找颜色,找轮廓用最小旋转矩形框出

    #include <opencv2/opencv.hpp> #include<iostream> #include<string> using namespace ...

  6. Vue学习之Vue模拟后台数据

    前后端项目的开发,需要前端和后端同时进行开发,有时后端开发人员还未完成API接口可以提供给前端调用,因此就需要模拟前端请求后端接口,后端返回数据.一般开发中都是返回json数据格式来完成前后端的交互. ...

  7. python基础-面向对象编程之封装、访问限制机制和property

    面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...

  8. php基础文档

    目录 PHP简介 PHP概述和名词解释 PHP常见数据类型 PHP运算符 PHP流程控制语句 PHP函数 PHP类与对象 PHP会话session与缓存cookie(扩展) 1.PHP简介 PHP,即 ...

  9. Python3学习-基础

    1.直接运行.py文件 在Windows上是不行的,但是在Mac和Linux上是可以的,方法是在.py文件的第一行加上一个特殊的注释: #!/usr/bin/env python3 print('he ...

  10. 在.NET Core中使用Jwt对API进行认证

    在.NET Core中想用给API进行安全认证,最简单的无非就是Jwt,悠然记得一年前写的Jwt Demo,现在拿回来改成.NET Core的,但是在编码上的改变并不大,因为Jwt已经足够强大了.在项 ...