ceph集群reweight调整各osd权重使各osd pg数均衡

来源:互联网 发布:存档软件大全 编辑:程序博客网 时间:2024/06/09 16:55

ceph中各osd的pg数量是近似均匀的,可以认为各pg下的数据容量大致相等,因此从原理上来说保证各osd pg相等,则各osd上的磁盘使用量也差不多相同,但是由于算法做不到绝对均匀的原因某些osd上的pg数会相差比较大,这样某些osd上的空间使用量就会比较多。建议是ceph部署完成,各pool也创建完成后,主动手工观察,通过命令调整osd的权重来调整osd上的pg数


网上找的命令统计各osd上所有pg数: 

ceph pg dump | awk ' 

 /^pg_stat/ { col=1; while($col!="up") {col++}; col++ } 

 /^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0; 

 up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) } 

 for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];} 

END { 

 printf("\n"); 

 printf("pool :\t"); for (i in poollist) printf("%s\t",i); printf("| SUM \n"); 

 for (i in poollist) printf("--------"); printf("----------------\n"); 

 for (i in osdlist) { printf("osd.%i\t", i); sum=0; 

 for (j in poollist) { printf("%i\t", array[i,j]); sum+=array[i,j]; poollist[j]+=array[i,j] }; printf("| %i\n",sum) } 

 for (i in poollist) printf("--------"); printf("----------------\n"); 

 printf("SUM :\t"); for (i in poollist) printf("%s\t",poollist[i]); printf("|\n"); 

}'


上面这个是获取各osd所有pool的pg数,其实我们只关注default.rgw.buckets.data这个pool,其他pool数据很少,我们通过ceph df知道default.rgw.buckets.data的pool id是23,通过一个更简单命令得到23号pool在各osd上的pg数排序:

ceph pg dump|grep '^23\.'|awk -F ' ' '{print $1, $15}'|awk -F "[ ]|[[]|[,]|[]]" '{print $3, $4}'|tr -s ' ' '\n'|sort|uniq -c|sort -n

输出如下:

     95 1
     95 312
     96 252
     99 177
     99 265
     99 62
    101 121
    101 261

......

    132 102
    132 105
    132 179
    132 253
    132 256
    133 111
    133 115
    133 151
    133 203
    133 259
    133 271
    133 292
    134 257
    134 302
    134 61
    135 220


可以看到最少的osd.1上面只有95个pg,最多的osd.220上有135个pg,调整pg的命令:

ceph osd reweight-by-pg 105 default.rgw.buckets.data


注:105这个数字貌似不起作用,ceph内部会自己调整


由于每次手动观察比较麻烦,可以通过计算每次调整后的个osd上pg数的方差来判断效果,如果每次反差在减小,说明分布相对更均匀一些:

ceph pg dump|grep '^23\.'|awk -F ' ' '{print $1, $15}'|awk -F "[ ]|[[]|[,]|[]]" '{print $3, $4}'|tr -s ' ' '\n'|sort|uniq -c|sort -r|awk '{printf("%s\n", $1)}'|awk '{x[NR]=$0;s+=$0;n++} END{a=s/n;for(i in x) {ss += (x[i]-a)^2} sd = sqrt(ss/n); print "SD = "sd}'
dumped all in format plain
SD = 8.71607
[root@serverl96 ~]# 

原创粉丝点击