From bd12bd7636ef4f9c90f053ba15665a1adc9c6ab7 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Wed, 7 Jul 2021 09:42:23 +0800 Subject: [PATCH] crimson/os/seastore/cache: count created transactions Labeled by source. Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/cache.cc | 61 ++++++++++++++++++++++++++- src/crimson/os/seastore/cache.h | 24 +++++++++++ src/crimson/os/seastore/transaction.h | 21 +++++++++ 3 files changed, 105 insertions(+), 1 deletion(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index bb7c2d6198c79..d8bf3ff1388eb 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -16,7 +16,10 @@ namespace crimson::os::seastore { Cache::Cache(SegmentManager &segment_manager) : - segment_manager(segment_manager) {} + segment_manager(segment_manager) +{ + register_metrics(); +} Cache::~Cache() { @@ -80,6 +83,62 @@ void Cache::dump_contents() DEBUG("exit"); } +void Cache::register_metrics() +{ + namespace sm = seastar::metrics; + using src_t = Transaction::src_t; + + auto src_label = sm::label("src"); + std::map labels_by_src { + {src_t::MUTATE, src_label("MUTATE")}, + {src_t::READ, src_label("READ")}, + {src_t::INIT, src_label("INIT")}, + {src_t::CLEANER, src_label("CLEANER")}, + }; + + /* + * trans_created + */ + stats.trans_created_by_src.fill(0); + auto register_trans_created = [this, &labels_by_src](src_t src) { + std::ostringstream oss_desc; + oss_desc << "total number of transaction created (src=" + << src << ")"; + metrics.add_group( + "cache", + { + sm::make_counter( + "trans_created", + get_counter(stats.trans_created_by_src, src), + sm::description(oss_desc.str()), + {labels_by_src.find(src)->second} + ), + } + ); + }; + for (auto& [src, label] : labels_by_src) { + register_trans_created(src); + } + + metrics.add_group( + "cache", + { + sm::make_counter( + "trans_created", + [this] { + uint64_t total = 0; + for (auto& v : stats.trans_created_by_src) { + total += v; + } + return total; + }, + sm::description("total number of transaction created"), + {src_label("ALL")} + ), + } + ); +} + void Cache::add_extent(CachedExtentRef ref) { LOG_PREFIX(Cache::add_extent); diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index b6b0714e89051..b75c4d6097ae2 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -4,6 +4,8 @@ #pragma once #include +#include +#include #include "seastar/core/shared_future.hh" @@ -98,6 +100,9 @@ public: TransactionRef create_transaction( Transaction::src_t src) { LOG_PREFIX(Cache::create_transaction); + + ++(get_counter(stats.trans_created_by_src, src)); + auto ret = std::make_unique( get_dummy_ordering_handle(), false, @@ -113,6 +118,9 @@ public: TransactionRef create_weak_transaction( Transaction::src_t src) { LOG_PREFIX(Cache::create_weak_transaction); + + ++(get_counter(stats.trans_created_by_src, src)); + auto ret = std::make_unique( get_dummy_ordering_handle(), true, @@ -126,6 +134,9 @@ public: /// Resets transaction preserving void reset_transaction_preserve_handle(Transaction &t) { + if (t.did_reset()) { + ++(get_counter(stats.trans_created_by_src, t.get_src())); + } t.reset_preserve_handle(last_commit); } @@ -561,6 +572,19 @@ private: */ CachedExtent::list dirty; + struct { + std::array trans_created_by_src; + } stats; + uint64_t& get_counter( + std::array& counters_by_src, + Transaction::src_t src) { + assert(static_cast(src) < counters_by_src.size()); + return counters_by_src[static_cast(src)]; + } + + seastar::metrics::metric_group metrics; + void register_metrics(); + /// alloc buffer for cached extent bufferptr alloc_cache_buf(size_t size) { // TODO: memory pooling etc diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index e8832ffc96e5d..3ec37826b2193 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -201,6 +201,13 @@ public: to_release = NULL_SEG_ID; retired_gate_token.reset(initiated_after); conflicted = false; + if (!has_reset) { + has_reset = true; + } + } + + bool did_reset() const { + return has_reset; } private: @@ -232,6 +239,8 @@ private: bool conflicted = false; + bool has_reset = false; + OrderingHandle handle; const src_t src; @@ -324,3 +333,15 @@ template using with_trans_ertr = typename T::base_ertr::template extend; } + +namespace std { + +template<> +struct hash<::crimson::os::seastore::Transaction::src_t> { + std::size_t operator()( + const ::crimson::os::seastore::Transaction::src_t& src) const noexcept { + return std::hash{}((uint8_t)src); + } +}; + +} -- 2.39.5