ceph scrub 参数
从 ceph --admin-daemon
输出的配置中,与 scrub(数据一致性检查) 相关的参数可分为 时间窗口控制、并发与资源限制、scrub 类型与频率、错误处理与修复、性能调优 5 大类。以下是每个核心参数的详细解释,结合实际场景说明其作用:
一、时间窗口控制:限制 scrub 仅在低峰期运行
这类参数决定 OSD 何时允许执行 scrub,避免在业务高峰期占用资源,对应之前代码中 scrub_time_permit
函数的校验逻辑。
参数名 | 当前值 | 含义与作用 |
---|---|---|
osd_scrub_begin_hour | 0 | 允许 scrub 的开始小时(24小时制)。当前为 0 ,即凌晨 0 点。 |
osd_scrub_end_hour | 0 | 允许 scrub 的结束小时。当前为 0 ,且 begin=end 表示全天允许 scrub(无小时限制)。 |
osd_scrub_begin_week_day | 0 | 允许 scrub 的开始星期(0=周日,1=周一,…,6=周六)。当前为 0 (周日)。 |
osd_scrub_end_week_day | 0 | 允许 scrub 的结束星期。当前为 0 ,且 begin=end 表示每天允许 scrub(无星期限制)。 |
osd_blocked_scrub_grace_period | 120 | 因“对象锁定”(如正在写入)被阻塞的 PG,等待 scrub 的最大宽限时间(秒)。超过后跳过该 PG,避免长期阻塞。 |
二、并发与资源限制:控制 scrub 对系统资源的占用
这类参数限制同时执行的 scrub 数量、优先级,防止 scrub 与业务读写/数据恢复争抢 CPU、IO 资源。
参数名 | 当前值 | 含义与作用 |
---|---|---|
osd_max_scrubs | 3 | 单个 OSD 同时运行的最大 scrub 任务数。当前为 3,即 1 个 OSD 最多同时检查 3 个 PG,避免 IO 打满。 |
mds_max_scrub_ops_in_progress | 5 | MDS(元数据服务器)层面同时运行的最大元数据 scrub 操作数(针对 CephFS 元数据一致性),防止元数据服务过载。 |
osd_scrub_priority | 5 | scrub 任务的IO 优先级(1-7,1 最高,7 最低)。当前为 5(中低优先级),确保业务读写优先。 |
osd_requested_scrub_priority | 5 | 手动触发 scrub 时的IO 优先级(与 osd_scrub_priority 作用类似,仅针对手动请求)。 |
osd_scrub_during_recovery | false | 是否允许在 OSD 数据恢复(recovery)期间执行 scrub。当前为 false (禁止),避免恢复+scrub 双重资源消耗导致集群卡顿。 |
osd_scrub_load_threshold | 0.5 | OSD 负载阈值(CPU/IO 使用率):当负载超过 50% 时,暂停 scrub,仅在负载低于阈值时恢复,保障业务性能。 |
三、scrub 类型与频率:控制检查深度和执行间隔
Ceph 有两种 scrub 类型:shallow scrub
(轻量检查,校验元数据摘要)、deep scrub
(深度检查,逐块校验数据内容)。这类参数控制两种 scrub 的执行频率和范围。
参数名 | 当前值 | 含义与作用 |
---|---|---|
osd_scrub_min_interval | 86400(秒) | 轻量 scrub(shallow)的最小执行间隔:当前为 86400 秒 = 24 小时,即一个 PG 至少每 24 小时做一次轻量检查。 |
osd_scrub_max_interval | 604800(秒) | 轻量 scrub 的最大执行间隔:当前为 604800 秒 = 7 天,即一个 PG 最多不超过 7 天做一次轻量检查(实际间隔在 min~max 间随机,避免所有 PG 同时 scrub)。 |
osd_deep_scrub_interval | 604800(秒) | 深度 scrub(deep)的执行间隔:当前为 7 天,即一个 PG 每 7 天做一次深度数据校验(比轻量 scrub 更耗时,但更精准)。 |
osd_scrub_interval_randomize_ratio | 0.5 | 轻量 scrub 间隔的随机化比例:当前为 50%,即实际间隔 = 基础间隔 × (1 ± 50%),避免所有 PG 在同一时间触发 scrub(如每天凌晨 0 点集中执行)。 |
osd_deep_scrub_randomize_ratio | 0.15 | 深度 scrub 间隔的随机化比例:当前为 15%,即实际间隔 = 7 天 × (1 ± 15%),减少集中深度检查的压力。 |
osd_deep_scrub_keys | 1024 | 深度 scrub 时,每个对象最多校验的 OMAP 键数量(OMAP 是对象的元数据键值对)。超过 1024 个键的对象,仅校验部分键,平衡精度与性能。 |
四、错误处理与修复:scrub 发现不一致时的行为
当 scrub 检测到数据/元数据不一致(如主从 PG 数据不匹配)时,这类参数控制是否自动修复、修复的限制条件。
参数名 | 当前值 | 含义与作用 |
---|---|---|
osd_scrub_auto_repair | false | 是否自动修复 scrub 发现的不一致错误。当前为 false (关闭),需手动介入处理(避免自动修复误删数据,适合对数据安全性要求高的场景)。 |
osd_scrub_auto_repair_num_errors | 5 | 自动修复的最大错误数限制:即使开启 auto_repair ,当一个 PG 的不一致错误超过 5 个时,也停止自动修复,避免批量错误导致更大问题。 |
osd_scrub_invalid_stats | true | 是否在 scrub 后更新 PG 的“无效统计信息”(如损坏对象数量)。当前为 true ,便于通过 ceph pg stat 查看不一致状态。 |
五、性能调优:优化 scrub 的执行效率
这类参数控制 scrub 的执行细节,减少对业务的影响,提升检查效率。
参数名 | 当前值 | 含义与作用 |
---|---|---|
osd_scrub_chunk_min | 5 | 轻量 scrub 时,每次批量处理的最小 PG 数量:一次至少处理 5 个 PG,避免频繁切换任务。 |
osd_scrub_chunk_max | 15 | 轻量 scrub 时,每次批量处理的最大 PG 数量:一次最多处理 15 个 PG,避免单次任务过重。 |
osd_shallow_scrub_chunk_min | 50 | 轻量 scrub 针对“大 PG”(包含大量对象)的最小批量处理数:优化大 PG 的检查效率。 |
osd_shallow_scrub_chunk_max | 100 | 轻量 scrub 针对“大 PG”的最大批量处理数。 |
osd_deep_scrub_stride | 524288(字节) | 深度 scrub 时每次读取的数据块大小:当前为 512 KiB,即逐 512 KiB 块校验数据,平衡 IO 次数与单次 IO 大小。 |
osd_scrub_sleep | 0(秒) | 每次 scrub 操作间的休眠时间:当前为 0,即无休眠(适合 IO 性能充足的集群;若 IO 紧张,可设为 0.1~1 秒,降低 IO 突发)。 |
osd_scrub_extended_sleep | 0(秒) | 深度 scrub 时的额外休眠时间:当前为 0,作用与 osd_scrub_sleep 类似,仅针对深度检查。 |
osd_scrub_cost | 52428800 | scrub 操作的**“成本权重”**(用于 IO 调度):值越大,调度器认为 scrub 消耗的 IO 资源越多,会优先调度业务读写。 |
osd_scrub_event_cost | 4096 | scrub 事件(如元数据更新)的成本权重:与 osd_scrub_cost 配合,精细化控制 scrub 的 IO 优先级。 |
六、其他辅助参数
参数名 | 当前值 | 含义与作用 |
---|---|---|
mon_scrub_interval | 86400(秒) | Monitor 节点自身元数据 scrub 的间隔(24 小时):检查 Monitor 存储的集群配置、PG 映射等元数据一致性。 |
mon_scrub_max_keys | 100 | Monitor 元数据 scrub 时,每次处理的最大键数量:避免 Monitor 单次 scrub 负载过高。 |
mon_scrub_timeout | 300(秒) | Monitor 元数据 scrub 的超时时间:超过 5 分钟未完成则中断,防止 Monitor 卡死。 |
mon_scrub_inject_crc_mismatch | 0.0 | 测试用参数:注入 CRC 校验错误的概率(0=不注入),用于验证 scrub 的错误检测能力,生产环境禁用。 |