From: chunmei-liu Date: Thu, 9 Sep 2021 05:25:45 +0000 (-0700) Subject: crimson/seastore: add lba tree metrics for lba tree profiling X-Git-Tag: v17.1.0~888^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=47389d5a73cef903c9c10684181a383856066b9a;p=ceph.git crimson/seastore: add lba tree metrics for lba tree profiling Signed-off-by: chunmei-liu --- diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc index aa058a976e379..46acd549ae2d3 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc @@ -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( 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, diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h index a0834b159c24c..578712be81a78 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h @@ -129,6 +129,8 @@ private: static btree_range_pin_t &get_pin(CachedExtent &e); + seastar::metrics::metric_group metrics; + void register_metrics(); template auto with_btree( op_context_t c, diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree.h b/src/crimson/os/seastore/lba_manager/btree/lba_btree.h index 0bc13f78155ac..6afa31f4ccde6 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.h @@ -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)](auto iter) { + ).si_then([c, need_count, visitor, f=std::forward(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) {