]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/seastore: add lba tree metrics for lba tree profiling 43123/head
authorchunmei-liu <chunmei.liu@intel.com>
Thu, 9 Sep 2021 05:25:45 +0000 (22:25 -0700)
committerchunmei-liu <chunmei.liu@intel.com>
Tue, 14 Sep 2021 01:52:14 +0000 (18:52 -0700)
Signed-off-by: chunmei-liu <chunmei.liu@intel.com>
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h
src/crimson/os/seastore/lba_manager/btree/lba_btree.h

index aa058a976e379efa9f1d88720ed7c37dfde36e54..46acd549ae2d3b55e9cd26d42d37158731213945 100644 (file)
@@ -49,6 +49,7 @@ BtreeLBAManager::get_mappings(
       return LBABtree::iterate_repeat(
        c,
        btree.upper_bound_right(c, offset),
+       false,
        [&ret, offset, length](auto &pos) {
          if (pos.is_end() || pos.get_key() >= (offset + length)) {
            return LBABtree::iterate_repeat_ret_inner(
@@ -135,6 +136,7 @@ BtreeLBAManager::alloc_extent(
   LOG_PREFIX(BtreeLBAManager::alloc_extent);
   DEBUGT("hint: {}, length: {}", t, hint, len);
   auto c = get_context(t);
+  ++LBABtree::lba_tree_inner_stats.num_alloc_extents;
   return with_btree_state<state_t>(
     c,
     hint,
@@ -142,6 +144,7 @@ BtreeLBAManager::alloc_extent(
       return LBABtree::iterate_repeat(
        c,
        btree.upper_bound_right(c, hint),
+       true,
        [&state, len](auto &pos) {
          if (pos.is_end() || pos.get_key() >= (state.last_end + len)) {
            state.insert_iter = pos;
@@ -282,6 +285,7 @@ BtreeLBAManager::scan_mappings_ret BtreeLBAManager::scan_mappings(
       return LBABtree::iterate_repeat(
        c,
        btree.upper_bound_right(c, begin),
+       false,
        [f=std::move(f), begin, end](auto &pos) {
          if (pos.is_end() || pos.get_key() >= end) {
            return LBABtree::iterate_repeat_ret_inner(
@@ -313,6 +317,7 @@ BtreeLBAManager::scan_mapped_space_ret BtreeLBAManager::scan_mapped_space(
          return LBABtree::iterate_repeat(
            c,
            btree.lower_bound(c, 0, &visitor),
+           false,
            [&visitor](auto &pos) {
              if (pos.is_end()) {
                return LBABtree::iterate_repeat_ret_inner(
@@ -424,7 +429,31 @@ BtreeLBAManager::BtreeLBAManager(
   SegmentManager &segment_manager,
   Cache &cache)
   : segment_manager(segment_manager),
-    cache(cache) {}
+    cache(cache)
+{
+  register_metrics();
+}
+
+LBABtree::lba_tree_inner_stats_t LBABtree::lba_tree_inner_stats;
+void BtreeLBAManager::register_metrics()
+{
+  namespace sm = seastar::metrics;
+  metrics.add_group(
+    "LBA",
+    {
+      sm::make_counter(
+        "alloc_extents",
+        LBABtree::lba_tree_inner_stats.num_alloc_extents,
+        sm::description("total number of lba alloc_extent operations")
+      ),
+      sm::make_counter(
+        "alloc_extents_iter_nexts",
+        LBABtree::lba_tree_inner_stats.num_alloc_extents_iter_nexts,
+        sm::description("total number of iterator next operations during extent allocation")
+      ),
+    }
+  );
+}
 
 BtreeLBAManager::update_refcount_ret BtreeLBAManager::update_refcount(
   Transaction &t,
index a0834b159c24c7ff55ed576444dd8d7a30d671e4..578712be81a78b0cfd9246c12af6a504d68386ea 100644 (file)
@@ -129,6 +129,8 @@ private:
 
   static btree_range_pin_t &get_pin(CachedExtent &e);
 
+  seastar::metrics::metric_group metrics;
+  void register_metrics();
   template <typename F, typename... Args>
   auto with_btree(
     op_context_t c,
index 0bc13f78155ac7f9d102a73f75c33ac0aeb26546..6afa31f4ccde6a824b5c067876c95b51cbb50be7 100644 (file)
@@ -27,6 +27,11 @@ public:
 
   using mapped_space_visitor_t = LBAManager::scan_mapped_space_func_t;
 
+  struct lba_tree_inner_stats_t {
+    uint64_t num_alloc_extents = 0;
+    uint64_t num_alloc_extents_iter_nexts = 0;
+  } static lba_tree_inner_stats;
+
   class iterator {
   public:
     iterator(const iterator &rhs) noexcept :
@@ -252,26 +257,30 @@ public:
   static base_iertr::future<> iterate_repeat(
     op_context_t c,
     iterator_fut &&iter_fut,
+    bool need_count,
     F &&f,
     mapped_space_visitor_t *visitor=nullptr) {
     return std::move(
       iter_fut
-    ).si_then([c, visitor, f=std::forward<F>(f)](auto iter) {
+    ).si_then([c, need_count, visitor, f=std::forward<F>(f)](auto iter) {
       return seastar::do_with(
        iter,
        std::move(f),
-       [c, visitor](auto &pos, auto &f) {
+       [c, need_count, visitor](auto &pos, auto &f) {
          return trans_intr::repeat(
-           [c, visitor, &f, &pos] {
+           [c, need_count, visitor, &f, &pos] {
              return f(
                pos
-             ).si_then([c, visitor, &pos](auto done) {
+             ).si_then([c, need_count, visitor, &pos](auto done) {
                if (done == seastar::stop_iteration::yes) {
                  return iterate_repeat_ret_inner(
                    interruptible::ready_future_marker{},
                    seastar::stop_iteration::yes);
                } else {
                  ceph_assert(!pos.is_end());
+                 if (need_count) {
+                   ++LBABtree::lba_tree_inner_stats.num_alloc_extents_iter_nexts;
+                 }
                  return pos.next(
                    c, visitor
                  ).si_then([&pos](auto next) {