没有及时深度清理的 Ceph PG 不断增加
Ceph PGs not deep scrubbed in time keep increasing
我大约 4 天前注意到了这一点,但现在不知道该怎么办。问题如下:
我有一个 6 节点 3 监视器 ceph 集群,带有 84 个 osds、72x7200rpm 旋转磁盘和用于日志记录的 12xnvme ssds。 scrub 配置的每个值都是默认值。集群中的每个 pg 都是 active+clean,每个集群状态都是绿色的。然而,未及时深度清理的 PG 不断增加,目前为 96。 ceph -s 的输出:
cluster:
id: xxxxxxxxxxxxxxxxx
health: HEALTH_WARN
1 large omap objects
96 pgs not deep-scrubbed in time
services:
mon: 3 daemons, quorum mon1,mon2,mon3 (age 6h)
mgr: mon2(active, since 2w), standbys: mon1
mds: cephfs:1 {0=mon2=up:active} 2 up:standby
osd: 84 osds: 84 up (since 4d), 84 in (since 3M)
rgw: 3 daemons active (mon1, mon2, mon3)
data:
pools: 12 pools, 2006 pgs
objects: 151.89M objects, 218 TiB
usage: 479 TiB used, 340 TiB / 818 TiB avail
pgs: 2006 active+clean
io:
client: 1.3 MiB/s rd, 14 MiB/s wr, 93 op/s rd, 259 op/s wr
我该如何解决这个问题?此外,ceph 健康详细信息输出显示此非深度清理的 pg 警报始于 1 月 25 日,但我之前没有注意到这一点。我注意到这是在一个 OSD 关闭 30 秒然后重新启动的时候。可能与此问题有关?它会自行解决吗?我应该篡改擦洗配置吗?例如,如果我将 osd_max_scrubs 从 1 增加到 2,我可能会在客户端面临多少性能损失?
通常,集群会在集群上的低 I/O 时间间隔内对自身进行深度清理。默认情况下,每个 PG 必须每周深度擦洗一次。如果 OSD 出现故障,则无法对其进行深度清理,当然,这可能会导致一些延迟。
您可以 运行 像这样查看哪些 PG 落后以及它们是否都在同一个 OSD 上:
ceph pg dump pgs | awk '{print " "}' | column -t
如有必要,对输出进行排序,您可以对其中一个受影响的 PG 发出手动深度清理,以查看数量是否减少以及深度清理本身是否有效。
ceph pg deep-scrub <PG_ID>
另请添加 ceph osd pool ls detail
以查看是否设置了任何标志。
您可以将深度磨砂周期设置为 2 周,以延长深度磨砂时间 window。
代表
osd_deep_scrub_interval = 604800
使用:
osd_deep_scrub_interval = 1209600
先生Eblock 有一个好主意,可以手动强制某些 pgs 进行深度清理,以便在 2 周内均匀地传播操作。
您有 2 个选择:
- 增加深度擦洗之间的间隔。
- 使用独立脚本手动控制深度清理。
我已经编写了一个简单的 PHP 脚本来为我处理深度清理:https://gist.github.com/ethaniel/5db696d9c78516308b235b0cb904e4ad
它列出所有的 PG,选择 1 个 PG,它在 2 个多星期前完成了最后一次深度清理(脚本选择最旧的),检查 PG 所在的 OSD 是否没有被另一个使用scrub(处于 active+clean 状态),然后才开始对该 PG 进行深度擦洗。否则它会去寻找另一个 PG。
我已将 osd_max_scrubs 设置为 1(否则 OSD 守护进程会由于 Ceph 中的错误而开始崩溃),因此此脚本可以很好地与常规调度程序配合使用 - 无论哪个先在 PG-OSD 上启动清理,获胜。
我大约 4 天前注意到了这一点,但现在不知道该怎么办。问题如下:
我有一个 6 节点 3 监视器 ceph 集群,带有 84 个 osds、72x7200rpm 旋转磁盘和用于日志记录的 12xnvme ssds。 scrub 配置的每个值都是默认值。集群中的每个 pg 都是 active+clean,每个集群状态都是绿色的。然而,未及时深度清理的 PG 不断增加,目前为 96。 ceph -s 的输出:
cluster:
id: xxxxxxxxxxxxxxxxx
health: HEALTH_WARN
1 large omap objects
96 pgs not deep-scrubbed in time
services:
mon: 3 daemons, quorum mon1,mon2,mon3 (age 6h)
mgr: mon2(active, since 2w), standbys: mon1
mds: cephfs:1 {0=mon2=up:active} 2 up:standby
osd: 84 osds: 84 up (since 4d), 84 in (since 3M)
rgw: 3 daemons active (mon1, mon2, mon3)
data:
pools: 12 pools, 2006 pgs
objects: 151.89M objects, 218 TiB
usage: 479 TiB used, 340 TiB / 818 TiB avail
pgs: 2006 active+clean
io:
client: 1.3 MiB/s rd, 14 MiB/s wr, 93 op/s rd, 259 op/s wr
我该如何解决这个问题?此外,ceph 健康详细信息输出显示此非深度清理的 pg 警报始于 1 月 25 日,但我之前没有注意到这一点。我注意到这是在一个 OSD 关闭 30 秒然后重新启动的时候。可能与此问题有关?它会自行解决吗?我应该篡改擦洗配置吗?例如,如果我将 osd_max_scrubs 从 1 增加到 2,我可能会在客户端面临多少性能损失?
通常,集群会在集群上的低 I/O 时间间隔内对自身进行深度清理。默认情况下,每个 PG 必须每周深度擦洗一次。如果 OSD 出现故障,则无法对其进行深度清理,当然,这可能会导致一些延迟。 您可以 运行 像这样查看哪些 PG 落后以及它们是否都在同一个 OSD 上:
ceph pg dump pgs | awk '{print " "}' | column -t
如有必要,对输出进行排序,您可以对其中一个受影响的 PG 发出手动深度清理,以查看数量是否减少以及深度清理本身是否有效。
ceph pg deep-scrub <PG_ID>
另请添加 ceph osd pool ls detail
以查看是否设置了任何标志。
您可以将深度磨砂周期设置为 2 周,以延长深度磨砂时间 window。 代表
osd_deep_scrub_interval = 604800
使用:
osd_deep_scrub_interval = 1209600
先生Eblock 有一个好主意,可以手动强制某些 pgs 进行深度清理,以便在 2 周内均匀地传播操作。
您有 2 个选择:
- 增加深度擦洗之间的间隔。
- 使用独立脚本手动控制深度清理。
我已经编写了一个简单的 PHP 脚本来为我处理深度清理:https://gist.github.com/ethaniel/5db696d9c78516308b235b0cb904e4ad
它列出所有的 PG,选择 1 个 PG,它在 2 个多星期前完成了最后一次深度清理(脚本选择最旧的),检查 PG 所在的 OSD 是否没有被另一个使用scrub(处于 active+clean 状态),然后才开始对该 PG 进行深度擦洗。否则它会去寻找另一个 PG。
我已将 osd_max_scrubs 设置为 1(否则 OSD 守护进程会由于 Ceph 中的错误而开始崩溃),因此此脚本可以很好地与常规调度程序配合使用 - 无论哪个先在 PG-OSD 上启动清理,获胜。