]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/cache: add hit ratio metric
authorZhang Song <zhangsong02@qianxin.com>
Wed, 3 Sep 2025 08:06:54 +0000 (16:06 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 7 Jul 2026 08:15:31 +0000 (16:15 +0800)
Signed-off-by: Zhang Song <zhangsong02@qianxin.com>
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/object_data_handler.cc
src/crimson/os/seastore/transaction.h
src/crimson/os/seastore/transaction_manager.h

index 79a0b0088ff810643aca3040d013bf214552c2ab..b1558cccc494b21e87c8eba710fe4aea23120d90 100644 (file)
@@ -231,6 +231,13 @@ void Cache::register_metrics(store_index_t store_index)
     }
   );
 
+  metrics.add_group("cache", {
+    sm::make_counter("write_hit_hot", stats.write_hit_hot, sm::description("")),
+    sm::make_counter("write_hit_cold", stats.write_hit_cold, sm::description("")),
+    sm::make_counter("read_hit_hot", stats.read_hit_hot, sm::description("")),
+    sm::make_counter("read_hit_cold", stats.read_hit_cold, sm::description("")),
+  });
+
   {
     /*
      * efforts discarded/committed
@@ -2192,6 +2199,9 @@ void Cache::complete_commit(
         i->set_invalid(t);
     }
   }
+
+  stats.write_hit_hot += t.write_hit_hot;
+  stats.write_hit_cold += t.write_hit_cold;
 }
 
 void Cache::init()
index b5b0afd6defb5bcf77d7d4cd6c33fe3566ddb17f..fc81d1bc941427cabcb33e7d103f21e27b7d81c7 100644 (file)
@@ -761,6 +761,11 @@ public:
     return epm.is_pure_rbm();
   }
 
+  void update_read_ratio(Transaction &t) {
+    stats.read_hit_hot += t.read_hit_hot;
+    stats.read_hit_cold += t.read_hit_cold;
+  }
+
 private:
   using get_extent_ertr = base_ertr;
   template <typename T>
@@ -1870,6 +1875,11 @@ private:
     std::array<uint64_t, NUM_SRC_COMB> trans_conflicts_by_srcs;
     counter_by_src_t<uint64_t> trans_conflicts_by_unknown;
 
+    uint64_t write_hit_hot;
+    uint64_t write_hit_cold;
+    uint64_t read_hit_hot;
+    uint64_t read_hit_cold;
+
     rewrite_stats_t trim_rewrites;
     rewrite_stats_t reclaim_rewrites;
   } stats;
index 1e7796a358fc941c3823164359953ca06f29149e..ee494fbe6c325175e5811d9092190abd2561f234 100644 (file)
@@ -1578,6 +1578,7 @@ ObjectDataHandler::read_ret ObjectDataHandler::read(
       read_len,
       pin_start,
       pin_len);
+
     rpins.emplace_back(
       pin, read_start_aligned, read_len_aligned,
       unalign_start_offset, read_len);
@@ -1612,11 +1613,17 @@ ObjectDataHandler::read_ret ObjectDataHandler::read(
     }
     auto paddr = maybe_indirect_extent.extent->get_paddr();
     all_cold &= ctx.tm.is_cold_device(paddr.get_device_id());
+
+    if (paddr.is_absolute()) {
+      ctx.tm.update_read_ratio(ctx.t, paddr.get_device_id());
+    }
+
   }
   if (!all_cold) {
     assert(ctx.tm.is_prefix_cached(prefix));
     ctx.tm.update_logical_bucket_for_read(prefix);
   }
+  ctx.tm.submit_read_ratio(ctx.t);
   co_return std::move(ret);
 }
 
index 03191ee571677ee320fb8b57a362cdbda0ff85d3..3f5ff0fa75a7bec304d2deff1a92d2a2ad997b3f 100644 (file)
@@ -520,7 +520,16 @@ public:
   friend class crimson::os::seastore::SeaStore;
   friend class TransactionConflictCondition;
 
+  uint64_t write_hit_hot = 0;
+  uint64_t write_hit_cold = 0;
+  uint64_t read_hit_hot = 0;
+  uint64_t read_hit_cold = 0;
+
   void reset_preserve_handle() {
+    write_hit_hot = 0;
+    write_hit_cold = 0;
+    read_hit_hot = 0;
+    read_hit_cold = 0;
     root.reset();
     offset = 0;
     delayed_temp_offset = 0;
index 7636f36ba50fb850edfddf2cbdd560647d5c0181..a35e522a75b11bb23866ddc1d01ec418546fea93 100644 (file)
@@ -245,6 +245,28 @@ public:
     }
   };
 
+  void update_hit_ratio(Transaction& t, device_id_t id) {
+    if (epm->is_cold_device(id)) {
+      t.write_hit_cold++;
+    } else {
+      t.write_hit_hot++;
+    }
+  }
+
+  void update_read_ratio(Transaction& t, device_id_t id) {
+    if (epm->is_cold_device(id)) {
+      t.read_hit_cold++;
+    } else {
+      t.read_hit_hot++;
+    }
+  }
+
+  void submit_read_ratio(Transaction& t) {
+    if (cache) {
+      cache->update_read_ratio(t);
+    }
+  }
+
   template <typename T>
   using lextent_init_func_t = std::function<void (T&)>;
   /**
@@ -1223,6 +1245,9 @@ public:
       return cut_mapping<T>(
        t, (laddr + aligned_len).checked_to_laddr(), std::move(mapping), false);
     } else {
+      if (mapping.is_linked_direct() && mapping.get_val().is_absolute()) {
+       update_hit_ratio(t, mapping.get_val().get_device_id());
+      }
       return remove(t, std::move(mapping)
       ).handle_error_interruptible(
        punch_mappings_iertr::pass_further{},