1. 查看集群使用容量
ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
61284G 26383G 34901G 56.95
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
rbd 0 256k 0 6931G 4
cephfs_metadata 1 43928k 0 6931G 1043729
cephfs_data 2 11603G 62.60 6931G 7083637
说明:
ceph对容量的计算分为两个维度:
- GLOBAL维度中有SIZE,AVAIL,RAW USED,%RAW USED
- POOLS的维度中有 USED,%USED,MAX AVAIL,OBJECTS
GLOBAL中的RAW USED :34901G, AVAIL:26383G
POOLS 中USED:11603G3 + (43928k/1024/1024)3 = 34809.123G MAX AVAIL:20793G
发现问题没,pools使用的跟global有偏差,少了一部分数据。
2. 分析mon源码
分析/src/mon/Monitor.cc代码,跟踪df逻辑如下:
从上面的代码可以知道,df命令的输出两个维度代码逻辑:
- GLOBAL维度pgmon()->dump_fs_stats
- POOLS这个维度pgmon()->dump_pool_stats
2.1 GLOBAL维度
void PGMapDigest::dump_fs_stats(stringstream *ss, Formatter *f, bool verbose) const
{
if (f) {
f->open_object_section("stats");
f->dump_int("total_bytes", osd_sum.kb * 1024ull);
f->dump_int("total_used_bytes", osd_sum.kb_used * 1024ull);
f->dump_int("total_avail_bytes", osd_sum.kb_avail * 1024ull);
if (verbose) {
f->dump_int("total_objects", pg_sum.stats.sum.num_objects);
}
f->close_section();
} else {
assert(ss != nullptr);
TextTable tbl;
tbl.define_column("SIZE", TextTable::LEFT, TextTable::RIGHT);
tbl.define_column("AVAIL", TextTable::LEFT, TextTable::RIGHT);
tbl.define_column("RAW USED", TextTable::LEFT, TextTable::RIGHT);