PG 数量要算不要猜
归置组是数据分布的基本单位。数量太少,单个 PG 体积过大、分布粗糙,恢复时间被拉长;数量太多,每个 OSD 要维护更多 PG 状态,对等协商与内存开销上升。行业经验是把每个 OSD 上的 PG 数控制在 100 左右,200 以内通常也可接受。
基本信息
| 计算思路 | 总 PG 数约等于 OSD 数量乘每 OSD 目标 PG 数再除以副本数,向上取 2 的幂 |
|---|---|
| 每 OSD 目标 | 常取 100,单池数据量很大时可适度放宽 |
| 调整方向 | 只能增加,减少需要新建池并迁移数据 |
| 联动参数 | pg_num 变更后 pgp_num 要跟进,否则出现临时分布不均 |
| 自动伸缩 | 较新版本提供按池容量比例自动调整的能力,也可只做建议 |
| 应用标记 | 建池后应启用对应的应用类型,便于识别与自动调优 |
典型使用场景
- 新集群建池:先估算总量再创建,避免后期反复分裂
- 集群扩容:新增 OSD 后重新评估每 OSD 的 PG 数量
- 单池数据量激增:评估是否需要提升该池的 PG 数
- 恢复时间过长:PG 过大会拉长单组恢复时长
- 收到 PG 数量相关告警:判断是数量偏少还是自动伸缩未生效
建池与调整
建池与调整
ceph osd pool create data 256 256 # 建池时同时指定 pg_num 与 pgp_num
ceph osd pool set data pg_num 512 # 先提升 pg_num
ceph osd pool set data pgp_num 512 # 再提升 pgp_num 使分布一致
ceph osd pool autoscale-status # 查看自动伸缩建议
ceph osd pool get data pg_num # 核对当前取值
ceph pg stat # 集群 PG 总量与状态分布输出逐列读法
| 字段 | 含义 | 判读要点 |
|---|---|---|
| POOL | 池名 | 要按池分别评估,集群总量只是参考 |
| SIZE | 副本数 | 副本越多,同一总 PG 数下每 OSD 的 PG 越少 |
| PG_NUM | 归置组数量 | 建池后只能增加 |
| NEW PG_NUM | 自动伸缩建议值 | 出现说明当前值与该池容量不匹配 |
| TARGET RATIO | 目标容量比例 | 用于让 PG 数按容量权重分配 |
| total PG | 集群 PG 总数 | 低于阈值会被健康检查提示 |
PG 数不是越多越好:它直接影响 OSD 常驻内存和元数据规模。中小集群保持在每 OSD 100 上下的量级通常足够,盲目追求大数值会带来额外开销而不是性能收益。
PG 数没有直接的缩减手段,只能新建池并迁移数据。建池时估值过低,后期只能靠逐次翻倍分裂补救,而每次分裂都会触发数据迁移,占用业务带宽。
分裂与迁移是一体的
提高 pg_num 会让每个 PG 分裂成多个,数据按新映射重新分布,因此调整应一次到位而不是反复微调。常规做法是翻倍提升,并在操作前确认集群处于健康状态、留出足够迁移时间。