From 181e9110d49b75e6226b66d23fddc1016135067a Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Thu, 15 Jul 2021 14:36:09 +0800 Subject: [PATCH] crimson/os/seastore: measure read transaction efforts that are successful In order to calculate the ratio of discarded vs successful effort from read-only transactions. Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/cache.cc | 61 +++++++++++++++++++++++++++ src/crimson/os/seastore/cache.h | 15 ++++++- src/crimson/os/seastore/transaction.h | 11 ++++- 3 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index eab2d080296..514b92a21eb 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -249,6 +249,22 @@ void Cache::register_metrics() } ); + /** + * read_transactions_successful + */ + stats.read_transactions_successful = 0; + metrics.add_group( + "cache", + { + sm::make_counter( + "read_trans_successful", + stats.read_transactions_successful, + sm::description("total number of successful read transactions"), + {} + ), + } + ); + /* * cache_query: cache_access and cache_hit */ @@ -400,6 +416,32 @@ void Cache::register_metrics() } // effort_name } // src } // category + + /** + * read_effort_successful + */ + stats.read_effort_successful = {}; + auto register_read_effort_successful = + [this, &labels_by_counter] + (const char* counter_name, uint64_t& value) { + std::ostringstream oss_desc; + oss_desc << "total successful read transactional effort labeled by counter"; + metrics.add_group( + "cache", + { + sm::make_counter( + "read_effort_successful", + value, + sm::description(oss_desc.str()), + {labels_by_counter.find(counter_name)->second} + ), + } + ); + }; + for (auto& counter_name : {"EXTENTS", "BYTES"}) { + auto& value = stats.read_effort_successful.get_by_name(counter_name); + register_read_effort_successful(counter_name, value); + } } } @@ -562,6 +604,25 @@ void Cache::measure_efforts(Transaction& t, trans_efforts_t& efforts) */ } +void Cache::on_transaction_destruct(Transaction& t) +{ + LOG_PREFIX(Cache::on_transaction_destruct); + if (t.get_src() == Transaction::src_t::READ && + t.conflicted == false && + !t.is_weak()) { + DEBUGT("read is successful", t); + ++stats.read_transactions_successful; + + assert(t.retired_set.empty()); + assert(t.fresh_block_list.empty()); + assert(t.mutated_block_list.empty()); + stats.read_effort_successful.extents += t.read_set.size(); + for (auto &i: t.read_set) { + stats.read_effort_successful.bytes += i.ref->get_length(); + } + } +} + CachedExtentRef Cache::alloc_new_extent_by_type( Transaction &t, ///< [in, out] current transaction extent_types_t type, ///< [in] type tag diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 7413d5a513c..6d2d86d14fe 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -107,7 +107,10 @@ public: get_dummy_ordering_handle(), false, src, - last_commit + last_commit, + [this](Transaction& t) { + return on_transaction_destruct(t); + } ); retired_extent_gate.add_token(ret->retired_gate_token); DEBUGT("created source={}", *ret, src); @@ -125,7 +128,10 @@ public: get_dummy_ordering_handle(), true, src, - last_commit + last_commit, + [this](Transaction& t) { + return on_transaction_destruct(t); + } ); retired_extent_gate.add_token(ret->retired_gate_token); DEBUGT("created source={}", *ret, src); @@ -644,6 +650,8 @@ private: std::array invalidated_efforts_by_src; std::unordered_map> cache_query; + uint64_t read_transactions_successful; + effort_t read_effort_successful; } stats; template @@ -696,6 +704,9 @@ private: /// Measure efforts of a submitting/invalidating transaction void measure_efforts(Transaction& t, trans_efforts_t& efforts); + /// Introspect transaction when it is being destructed + void on_transaction_destruct(Transaction& t); + template get_extent_ret read_extent( TCachedExtentRef&& extent diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 3ec37826b21..11f99f8cc81 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -26,6 +26,7 @@ class Transaction; class Transaction { public: using Ref = std::unique_ptr; + using on_destruct_func_t = std::function; enum class get_extent_ret { PRESENT, ABSENT, @@ -171,15 +172,18 @@ public: OrderingHandle &&handle, bool weak, src_t src, - journal_seq_t initiated_after + journal_seq_t initiated_after, + on_destruct_func_t&& f ) : weak(weak), retired_gate_token(initiated_after), handle(std::move(handle)), + on_destruct(std::move(f)), src(src) {} ~Transaction() { + on_destruct(*this); for (auto i = write_set.begin(); i != write_set.end();) { i->state = CachedExtent::extent_state_t::INVALID; @@ -243,6 +247,8 @@ private: OrderingHandle handle; + on_destruct_func_t on_destruct; + const src_t src; }; using TransactionRef = Transaction::Ref; @@ -269,7 +275,8 @@ inline TransactionRef make_test_transaction() { get_dummy_ordering_handle(), false, Transaction::src_t::MUTATE, - journal_seq_t{} + journal_seq_t{}, + [](Transaction&) {} ); } -- 2.39.5