]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: count created transactions
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 7 Jul 2021 01:42:23 +0000 (09:42 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 14 Jul 2021 02:52:14 +0000 (10:52 +0800)
Labeled by source.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/transaction.h

index bb7c2d6198c798b4b5456c3b0ad2f72744b6c455..d8bf3ff1388eb0ebf2bff6d250571438db9fb58b 100644 (file)
 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<src_t, sm::label_instance> 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);
index b6b0714e8905114d47673e87fa6421730ffbfeb9..b75c4d6097ae296cca4f150d2957533549da4a86 100644 (file)
@@ -4,6 +4,8 @@
 #pragma once
 
 #include <iostream>
+#include <unordered_map>
+#include <boost/functional/hash.hpp>
 
 #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<Transaction>(
       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<Transaction>(
       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<uint64_t, Transaction::SRC_MAX> trans_created_by_src;
+  } stats;
+  uint64_t& get_counter(
+      std::array<uint64_t, Transaction::SRC_MAX>& counters_by_src,
+      Transaction::src_t src) {
+    assert(static_cast<std::size_t>(src) < counters_by_src.size());
+    return counters_by_src[static_cast<std::size_t>(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
index e8832ffc96e5d3771d90cd442bbf346033953ae8..3ec37826b21934d39c25a2eef2f5d7f7c8e87e51 100644 (file)
@@ -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 <typename T>
 using with_trans_ertr = typename T::base_ertr::template extend<crimson::ct_error::eagain>;
 
 }
+
+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>{}((uint8_t)src);
+  }
+};
+
+}