集群ceph df中pool 与 global不一致问题

本文探讨了在Ceph存储集群中,为何ceph df命令显示的全局(Global)容量与各个存储池(Pool)的可用容量不一致的问题。通过对ceph df处理逻辑的分析,发现Global统计基于osd磁盘的文件系统,而Pool统计涉及复杂的计算过程,包括dump_object_stat_sum函数和pg_stat_queue的更新。文章详细解释了POOL统计中MAX AVAIL可用空间的计算方法,涉及副本策略和weight的计算,帮助理解Ceph存储系统的统计机制。
摘要由CSDN通过智能技术生成

一 引言
某地存储项目中由于每天都需要统计存储使用量及业务量,在某一日统计存储使用量时发现global中容量与各池的可用容量不一致,由此产生疑问。
二 Global & Pool统计
分析代码,发现ceph df在monitor中的处理逻辑是monito.cc handle_command:
这部分代码里主要分为两部分:一部分是对于Global输出的统计,另外一部分是对于各池的统计。

{
      bool verbose = (detail == "detail");
      if (f)
        f->open_object_section("stats");

      pgservice->dump_fs_stats(&ds, f.get(), verbose);//Global统计
      if (!f)
        ds << '\n';
      pgservice->dump_pool_stats(osdmon()->osdmap, &ds, f.get(), verbose);//各存储池统计

      if (f) {
        f->close_section();
        f->flush(ds);
        ds << '\n';
      }
    }

非detail版本的Global主要依赖于osd_sum这个变量,这个变量的来源是osd_stat_t。osd_stat_t这个结构的值统计在update_osd_stat中。

三 Global统计

**monitor.cc:dump_fs_stats--->mgrstatmonitor.cc:dump_fs_stats**
void dump_fs_stats(stringstream *ss,
		     Formatter *f,
		     bool verbose) const override {
    digest.dump_fs_stats(ss, f, verbose);
  }
  **mgrstatmonitor.cc:dump_fs_stats:**
  
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);
    tbl.define_column("%RAW USED", TextTable::LEFT, TextTable::RIGHT);
    if (verbose) {
      tbl.define_column("OBJECTS", TextTable::LEFT, TextTable::RIGHT);
    }
    tbl << stringify(si_t(osd_sum.kb*1024))
        << stringify(si_t(osd_sum.kb_avail*1024))
        << stringify(si_t(osd_sum.kb_used*1024)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值