Ceph在某些情况下,需要进行数据均衡,后端的数据均衡IO会对client的IO造成影响从而影响到集群的业务IO,所以我们需要对数据均衡IO进行控制,主要是业务优先恢复优先操作前记得查看下默认参数值,操作完后记得恢复到原先参数

业务优先:

ceph tell osd.* injectargs '--osd-max-backfills 1 --osd-recovery-max-active 1 --osd-recovery-max-single-start 1'
ceph tell osd.* injectargs '--osd-recovery-sleep 1'

恢复优先:

ceph tell osd.* injectargs '--osd-max-backfills 5 --osd-recovery-max-active 5 --osd-recovery-max-single-start 5'
ceph tell osd.* injectargs '--osd-recovery-sleep 0'

查看配置信息:

ceph --admin-daemon  /var/run/ceph/ceph-osd.0.asok config show | grep -E "osd_max_backfills|osd_recovery_max_active|osd_recovery_max_single_start|osd_recovery_sleep"

参数解析:

osd_max_backfills : 一个osd上最多能有多少个pg同时做backfill。其中osd出去的最大backfill数量为osd_max_backfills ,osd进来的最大backfill数量也是osd_max_backfills ,所以每个osd最大的backfill数量为osd_max_backfills * 2; osd_recovery_sleep: 出队列后先Sleep一段时间,拉长两个Recovery的时间间隔;


以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为: osd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量; osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数; 这两个参数需要结合在一起分析: a.假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动1个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。 b.假设我们配置osd_recovery_max_single_start为2,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动2个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。例如第一个pg启动2个恢复操作,第二个pg启动1个恢复操作,第三个pg等待前两个pg 恢复操作完进行新的恢复。

默认配置参数:

"osd_max_backfills": "1",
"osd_recovery_sleep": "0",
"osd_recovery_max_active": "3",
"osd_recovery_max_single_start": "1",

推荐配置参数:

级别: 5%是业务优先,对业务影响最小; 100%恢复优先,对业务影响最大; 其他介于二者之间;

级别 osd_max_backfills osd_recovery_max_active osd_recovery_max_single_start osd_recovery_sleep osd_min_pg_log_entries osd_max_pg_log_entries
5% 1 1 1 1 1 2
25% 50 5 5 0.25 1 2
50% 50 5 5 0.15 1 2
75% 50 5 5 1 2
100% 50 5 5 1500 10000

osd_min_pg_log_entries 正常情况下PGLog的记录的条数, osd_max_pg_log_entries 异常情况下pglog记录的条数,达到该限制会进行trim操作