Cephのテスト環境を構築してみた。
シナリオ通りに構築を進めていき、とりあえずは問題なくは終わった。
終わったんだけど、最後にステータスでも確認してみるかとceph healthを実行してみたところHEALTH_WARNが・・・
[root@ceph01 ~]# ceph health
HEALTH_WARN too many PGs per OSD (480 > max 300)
[root@ceph01 ~]#
OSDにたくさんのPGが割り当てられてる、といってるけど、具体的にはどれくらいあるんだろう?
と調べていくと、stackoverflowにある、下記のPGとOSDの関係性に関する質問を発見
「Ceph too many pgs per osd: all you need to know」
そこで紹介されている「Get the Number of Placement Groups Per Osd」に、OSD毎のPG数をコマンドで確認する手法が掲載されていた。
「ceph pg dump」の出力結果を整形して見やすいようにしている、というものだった。
ceph pg dump | awk '
BEGIN { IGNORECASE = 1 }
/^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]; sumpool[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",sumpool[i]); printf("|\n");
}'
これをテスト環境で実行してみると下記の様な出力を得られた
[root@ceph01 ~]# ceph pg dump | awk '
BEGIN { IGNORECASE = 1 }
/^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]; sumpool[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",sumpool[i]); printf("|\n");
}'
dumped all in format plain
pool : 4 5 6 7 8 9 10 11 12 13 14 1 2 15 3 | SUM
----------------------------------------------------------------------------------------------------------------------------------------
osd.4 39 29 25 36 27 24 35 34 30 28 34 33 35 29 32 | 470
osd.5 36 35 28 31 21 29 27 37 37 30 32 36 37 27 37 | 480
osd.6 38 37 30 35 30 24 37 33 32 31 27 32 33 31 27 | 477
osd.7 33 34 30 31 25 34 35 42 32 33 21 30 31 28 33 | 472
osd.8 29 32 39 35 28 39 31 34 36 35 38 34 35 24 21 | 490
osd.9 32 34 33 33 37 38 39 27 30 31 28 29 27 26 26 | 470
osd.10 39 31 34 24 35 36 35 40 34 37 37 45 32 31 37 | 527
osd.11 25 26 30 33 36 42 27 30 42 31 28 32 28 35 31 | 476
osd.0 27 39 38 29 35 24 34 26 28 31 38 23 33 31 32 | 468
osd.1 29 30 29 28 43 24 34 30 22 34 30 37 34 44 29 | 477
osd.2 27 32 35 33 31 38 21 24 30 26 37 26 26 36 33 | 455
osd.3 30 25 33 36 36 32 29 27 31 37 34 27 33 42 46 | 498
----------------------------------------------------------------------------------------------------------------------------------------
SUM : 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 |
[root@ceph01 ~]#
また、NAKAMURA Minoru’s Home Pageにある「RADOS の概略 (RADOS と CRUSH と Placement Group の関係)」は、Cephの理解に役に立った