From f5568eb7209e43e6b916ea8450b2bd0c9484919a Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Fri, 16 Aug 2019 19:33:25 +0300 Subject: [PATCH] os/bluestore: introduce 'bluestore bluefs stats' admin socket command Signed-off-by: Igor Fedotov --- src/os/bluestore/BlueFS.cc | 23 ++++++++-------- src/os/bluestore/BlueFS.h | 7 +++-- src/os/bluestore/BlueStore.cc | 49 +++++++++++++++-------------------- src/os/bluestore/BlueStore.h | 2 +- 4 files changed, 39 insertions(+), 42 deletions(-) diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index a39abd86eff72..5b45596ce2bd7 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -62,6 +62,12 @@ public: ldout(bluefs->cct, 1) << __func__ << " cannot register SocketHook" << dendl; delete hook; hook = nullptr; + } else { + r = admin_socket->register_command("bluestore bluefs stats", + hook, + "Dump internal statistics for bluefs." + ""); + ceph_assert(r == 0); } } return hook; @@ -103,6 +109,9 @@ private: } f->dump_int("available_from_bluestore", extra_space); f->close_section(); + } else if (command == "bluestore bluefs stats") { + bluefs->dump_block_extents(ss); + bluefs->dump_volume_selector(ss); } else { ss << "Invalid command" << std::endl; return -ENOSYS; @@ -394,7 +403,6 @@ void BlueFS::dump_perf_counters(Formatter *f) void BlueFS::dump_block_extents(ostream& out) { - vselector->dump(cct); for (unsigned i = 0; i < MAX_BDEV; ++i) { if (!bdev[i]) { continue; @@ -610,7 +618,6 @@ int BlueFS::mount() _stop_alloc(); goto out; } - vselector->dump(cct); // init freelist for (auto& p : file_map) { @@ -668,8 +675,6 @@ void BlueFS::umount() super = bluefs_super_t(); log_t.clear(); _shutdown_logger(); - - vselector->dump(cct); } int BlueFS::prepare_new_device(int id, const bluefs_layout_t& layout) @@ -1258,7 +1263,6 @@ int BlueFS::_replay(bool noop, bool to_stdout) if (!noop) { FileRef f = _get_file(fnode.ino); -<<<<<<< HEAD if (cct->_conf->bluefs_log_replay_check_allocations) { // check initial log layout if (first_log_check) { @@ -1282,8 +1286,6 @@ int BlueFS::_replay(bool noop, bool to_stdout) } } - f->fnode = fnode; -======= if (fnode.ino != 1) { vselector->sub_usage(f->vselector_hint, f->fnode); } @@ -1292,7 +1294,6 @@ int BlueFS::_replay(bool noop, bool to_stdout) vselector->add_usage(f->vselector_hint, f->fnode); } ->>>>>>> os/bluestore: introduce volume selector abstraction to BlueFS if (fnode.ino > ino_last) { ino_last = fnode.ino; } @@ -3498,9 +3499,9 @@ void OriginalVolumeSelector::get_paths(const std::string& base, paths& res) cons #undef dout_prefix #define dout_prefix *_dout << "OriginalVolumeSelector: " -void OriginalVolumeSelector::dump(CephContext* c) { - ldout(c, 1) << "wal_total:" << wal_total +void OriginalVolumeSelector::dump(ostream& sout) { + sout<< "wal_total:" << wal_total << ", db_total:" << db_total << ", slow_total:" << slow_total - << dendl; + << std::endl; } diff --git a/src/os/bluestore/BlueFS.h b/src/os/bluestore/BlueFS.h index 9d8b8e48f2bc7..9bca340fed69c 100644 --- a/src/os/bluestore/BlueFS.h +++ b/src/os/bluestore/BlueFS.h @@ -90,7 +90,7 @@ public: virtual void sub_usage(void* file_hint, uint64_t fsize) = 0; virtual uint8_t select_prefer_bdev(void* hint) = 0; virtual void get_paths(const std::string& base, paths& res) const = 0; - virtual void dump(CephContext* cct) = 0; + virtual void dump(ostream& sout) = 0; }; class BlueFS; @@ -516,6 +516,9 @@ public: void set_volume_selector(BlueFSVolumeSelector* s) { vselector.reset(s); } + void dump_volume_selector(ostream& sout) { + vselector->dump(sout); + } void get_vselector_paths(const std::string& base, BlueFSVolumeSelector::paths& res) const { return vselector->get_paths(base, res); @@ -618,7 +621,7 @@ public: uint8_t select_prefer_bdev(void* hint) override; void get_paths(const std::string& base, paths& res) const override; - void dump(CephContext* cct) override; + void dump(ostream& sout) override; }; #endif diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index e146cf600f8e5..81db8c095a046 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -15597,60 +15597,53 @@ void* RocksDBBlueFSVolumeSelector::get_hint_by_dir(const string& dirname) const return reinterpret_cast(res); } -#undef dout_prefix -#define dout_prefix *_dout << "RocksDBBlueFSVolumeSelector: " - -void RocksDBBlueFSVolumeSelector::dump(CephContext* c) { - stringstream matrix_output; +void RocksDBBlueFSVolumeSelector::dump(ostream& sout) { auto max_x = per_level_per_dev_usage.get_max_x(); auto max_y = per_level_per_dev_usage.get_max_y(); - matrix_output << "LEVEL, WAL, DB, SLOW, ****, ****, REAL" << std::endl; + sout << "RocksDBBlueFSVolumeSelector: wal_total:" << l_totals[LEVEL_WAL - LEVEL_FIRST] + << ", db_total:" << l_totals[LEVEL_DB - LEVEL_FIRST] + << ", slow_total:" << l_totals[LEVEL_SLOW - LEVEL_FIRST] + << ", db_avail:" << db_avail4slow << std::endl + << " usage matrix:" << std::endl; + sout << "LEVEL, WAL, DB, SLOW, ****, ****, REAL" << std::endl; for (size_t l = 0; l < max_y; l++) { switch (l + LEVEL_FIRST) { case LEVEL_WAL: - matrix_output << "WAL "; break; + sout << "WAL "; break; case LEVEL_DB: - matrix_output << "DB "; break; + sout << "DB "; break; case LEVEL_SLOW: - matrix_output << "SLOW" << " "; break; + sout << "SLOW" << " "; break; case LEVEL_MAX: - matrix_output << "TOTALS "; break; + sout << "TOTALS "; break; } for (size_t d = 0; d < max_x - 1; d++) { - matrix_output << per_level_per_dev_usage.at(d, l) << ","; + sout << per_level_per_dev_usage.at(d, l) << ","; } - matrix_output << per_level_per_dev_usage.at(max_x - 1, l) << std::endl; + sout << per_level_per_dev_usage.at(max_x - 1, l) << std::endl; } ceph_assert(max_x == per_level_per_dev_max.get_max_x()); ceph_assert(max_y == per_level_per_dev_max.get_max_y()); - matrix_output << "MAXIMUMS:" << std::endl; + sout << "MAXIMUMS:" << std::endl; for (size_t l = 0; l < max_y; l++) { switch (l + LEVEL_FIRST) { case LEVEL_WAL: - matrix_output << "WAL "; break; + sout << "WAL "; break; case LEVEL_DB: - matrix_output << "DB "; break; + sout << "DB "; break; case LEVEL_SLOW: - matrix_output << "SLOW" << " "; break; + sout << "SLOW" << " "; break; case LEVEL_MAX: - matrix_output << "TOTALS "; break; + sout << "TOTALS "; break; } for (size_t d = 0; d < max_x - 1; d++) { - matrix_output << per_level_per_dev_max.at(d, l) << ","; + sout << per_level_per_dev_max.at(d, l) << ","; } - matrix_output << per_level_per_dev_max.at(max_x - 1, l); + sout << per_level_per_dev_max.at(max_x - 1, l); if (l < max_y - 1) { - matrix_output << std::endl; + sout << std::endl; } } - ldout(c, 1) - << "wal_total:" << l_totals[LEVEL_WAL - LEVEL_FIRST] - << ", db_total:" << l_totals[LEVEL_DB - LEVEL_FIRST] - << ", slow_total:" << l_totals[LEVEL_SLOW - LEVEL_FIRST] - << ", db_avail:" << db_avail4slow - << " usage matrix:" << std::endl - << matrix_output.str() - << dendl; } // ======================================================= diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 3652f5e5a8a4d..63bacc0a27541 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -3686,7 +3686,7 @@ public: const std::string& base, BlueFSVolumeSelector::paths& res) const override; - void dump(CephContext* cct) override; + void dump(ostream& sout) override; }; #endif -- 2.39.5