From: Zhang Song Date: Wed, 3 Sep 2025 08:06:54 +0000 (+0800) Subject: crimson/os/seastore/cache: add hit ratio metric X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f31b840079eb96f967f56f3d188dbf7ee2698521;p=ceph-ci.git crimson/os/seastore/cache: add hit ratio metric Signed-off-by: Zhang Song Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 79a0b0088ff..b1558cccc49 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -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() diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index b5b0afd6def..fc81d1bc941 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -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 @@ -1870,6 +1875,11 @@ private: std::array trans_conflicts_by_srcs; counter_by_src_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; diff --git a/src/crimson/os/seastore/object_data_handler.cc b/src/crimson/os/seastore/object_data_handler.cc index 1e7796a358f..ee494fbe6c3 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -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); } diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 03191ee5716..3f5ff0fa75a 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -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; diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 7636f36ba50..a35e522a75b 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -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 using lextent_init_func_t = std::function; /** @@ -1223,6 +1245,9 @@ public: return cut_mapping( 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{},