]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: measure read transaction efforts that are successful
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 15 Jul 2021 06:36:09 +0000 (14:36 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Tue, 20 Jul 2021 08:48:21 +0000 (16:48 +0800)
In order to calculate the ratio of discarded vs successful effort from
read-only transactions.

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 eab2d0802963db6c967297fb35987295f9da5751..514b92a21eb60c604ee61edb326d11edb963f8a8 100644 (file)
@@ -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
index 7413d5a513cad743536dcf08c633ce96ddb8320d..6d2d86d14fe338e513dbc4c4063cb3038724a01c 100644 (file)
@@ -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<trans_efforts_t, Transaction::SRC_MAX> invalidated_efforts_by_src;
     std::unordered_map<src_ext_t, query_counters_t,
                        boost::hash<src_ext_t>> cache_query;
+    uint64_t read_transactions_successful;
+    effort_t read_effort_successful;
   } stats;
 
   template <typename CounterT>
@@ -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 <typename T>
   get_extent_ret<T> read_extent(
     TCachedExtentRef<T>&& extent
index 3ec37826b21934d39c25a2eef2f5d7f7c8e87e51..11f99f8cc81315378f7c671a9b619d12a3687702 100644 (file)
@@ -26,6 +26,7 @@ class Transaction;
 class Transaction {
 public:
   using Ref = std::unique_ptr<Transaction>;
+  using on_destruct_func_t = std::function<void(Transaction&)>;
   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&) {}
   );
 }