diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 10db3a0732b..02fbe9a59b4 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -231,6 +231,29 @@ 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("the number of the lbc hits of data writes"), + {sm::label_instance("shard_store_index", std::to_string(store_index))}), + sm::make_counter( + "write_hit_cold", + stats.write_hit_cold, + sm::description("the number of the lbc misses of data writes"), + {sm::label_instance("shard_store_index", std::to_string(store_index))}), + sm::make_counter( + "read_hit_hot", + stats.read_hit_hot, + sm::description("the number of the lbc hits of data reads"), + {sm::label_instance("shard_store_index", std::to_string(store_index))}), + sm::make_counter( + "read_hit_cold", + stats.read_hit_cold, + sm::description("the number of the lbc misses of data reads"), + {sm::label_instance("shard_store_index", std::to_string(store_index))}), + }); + { /* * efforts discarded/committed @@ -2181,6 +2204,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 df3fdf90e98..0b67f16ccc2 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 @@ -1868,6 +1873,11 @@ private: std::array trans_conflicts_by_srcs; counter_by_src_t trans_conflicts_by_unknown; + uint64_t write_hit_hot = 0; + uint64_t write_hit_cold = 0; + uint64_t read_hit_hot = 0; + uint64_t read_hit_cold = 0; + 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 8a0d683c065..28d1a7b0ef4 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); @@ -1613,11 +1614,17 @@ ObjectDataHandler::read_ret ObjectDataHandler::read( DEBUGT("got extent: {}", ctx.t, *maybe_indirect_extent.extent); 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 73beb38d0f2..aee35094449 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -540,7 +540,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 53272f5a6f4..3c576d78b23 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{},