From 326b79f75cc07dfbb9e4ff0a062fa7ade8e3e05d Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Mon, 11 Oct 2021 16:11:22 +0800 Subject: [PATCH] crimson/os/seastore: measure inline/ool record header fullness Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/cache.cc | 60 +++++++++++++++++++ src/crimson/os/seastore/cache.h | 11 ++++ .../os/seastore/extent_placement_manager.cc | 1 + src/crimson/os/seastore/seastore_types.cc | 4 +- src/crimson/os/seastore/seastore_types.h | 1 + src/crimson/os/seastore/transaction.h | 1 + 6 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index f7f32b8b04e..129e7e183aa 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -403,6 +403,52 @@ void Cache::register_metrics() ); } + /** + * Record header fullness + */ + auto record_type_label = sm::label("record_type"); + using namespace std::literals::string_view_literals; + const string_view record_type_names[] = { + "INLINE"sv, + "OOL"sv, + }; + for (auto& [src, src_label] : labels_by_src) { + if (src == src_t::READ) { + // READ transaction won't commit + continue; + } + auto& record_header_fullness = get_by_src( + stats.record_header_fullness_by_src, src); + for (auto& record_type_name : record_type_names) { + auto& fill_stat = [&record_type_name, + &record_header_fullness]() -> fill_stat_t& { + if (record_type_name == "INLINE") { + return record_header_fullness.inline_stats; + } else { + assert(record_type_name == "OOL"); + return record_header_fullness.ool_stats; + } + }(); + metrics.add_group( + "cache", + { + sm::make_counter( + "record_header_filled_bytes", + fill_stat.filled_bytes, + sm::description("filled bytes of record header"), + {src_label, record_type_label(record_type_name)} + ), + sm::make_counter( + "record_header_total_bytes", + fill_stat.total_bytes, + sm::description("total bytes of record header"), + {src_label, record_type_label(record_type_name)} + ), + } + ); + } + } + /** * Cached extents (including placeholders) * @@ -678,6 +724,11 @@ void Cache::mark_transaction_conflicted( efforts.num_ool_records += ool_stats.num_records; efforts.ool_record_overhead_bytes += ool_stats.header_bytes; + auto& record_header_fullness = get_by_src( + stats.record_header_fullness_by_src, t.get_src()); + record_header_fullness.ool_stats.filled_bytes += ool_stats.header_raw_bytes; + record_header_fullness.ool_stats.total_bytes += ool_stats.header_bytes; + if (t.get_src() == Transaction::src_t::CLEANER) { // CLEANER transaction won't contain any onode tree operations assert(t.onode_tree_stats.is_clear()); @@ -941,11 +992,20 @@ record_t Cache::prepare_record(Transaction &t) ceph_assert(ool_stats.extents.num == t.ool_block_list.size()); efforts.num_ool_records += ool_stats.num_records; efforts.ool_record_overhead_bytes += ool_stats.header_bytes; + + auto& record_header_fullness = get_by_src( + stats.record_header_fullness_by_src, t.get_src()); + record_header_fullness.ool_stats.filled_bytes += ool_stats.header_raw_bytes; + record_header_fullness.ool_stats.total_bytes += ool_stats.header_bytes; + auto record_size = get_encoded_record_length( record, segment_manager.get_block_size()); auto inline_overhead = record_size.mdlength + record_size.dlength - record.get_raw_data_size(); efforts.inline_record_overhead_bytes += inline_overhead; + record_header_fullness.inline_stats.filled_bytes += record_size.raw_mdlength; + record_header_fullness.inline_stats.total_bytes += record_size.mdlength; + return record; } diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index f1449adb221..b05d25e4f4f 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -697,11 +697,22 @@ private: template using counter_by_src_t = std::array; + struct fill_stat_t { + uint64_t filled_bytes = 0; + uint64_t total_bytes = 0; + }; + + struct record_header_fullness_t { + fill_stat_t inline_stats; + fill_stat_t ool_stats; + }; + struct { counter_by_src_t trans_created_by_src; counter_by_src_t committed_efforts_by_src; counter_by_src_t invalidated_efforts_by_src; counter_by_src_t cache_query_by_src; + counter_by_src_t record_header_fullness_by_src; success_read_trans_efforts_t success_read_efforts; uint64_t dirty_bytes = 0; diff --git a/src/crimson/os/seastore/extent_placement_manager.cc b/src/crimson/os/seastore/extent_placement_manager.cc index 4ed38a078a7..48a89ea273a 100644 --- a/src/crimson/os/seastore/extent_placement_manager.cc +++ b/src/crimson/os/seastore/extent_placement_manager.cc @@ -92,6 +92,7 @@ SegmentedAllocator::Writer::_write( auto& stats = t.get_ool_write_stats(); stats.extents.num += record.get_num_extents(); stats.extents.bytes += record_size.dlength; + stats.header_raw_bytes += record_size.raw_mdlength; stats.header_bytes += record_size.mdlength; stats.num_records += 1; diff --git a/src/crimson/os/seastore/seastore_types.cc b/src/crimson/os/seastore/seastore_types.cc index 86679827960..4dec2878398 100644 --- a/src/crimson/os/seastore/seastore_types.cc +++ b/src/crimson/os/seastore/seastore_types.cc @@ -137,7 +137,7 @@ record_size_t get_encoded_record_length( for (const auto &i: record.extents) { dlength += i.bl.length(); } - return record_size_t{mdlength, dlength}; + return record_size_t{raw_mdlength, mdlength, dlength}; } ceph::bufferlist encode_record( @@ -172,6 +172,8 @@ ceph::bufferlist encode_record( for (const auto &i: record.deltas) { encode(i, bl); } + ceph_assert(bl.length() == rsize.raw_mdlength); + if (bl.length() % block_size != 0) { bl.append_zero( block_size - (bl.length() % block_size)); diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index e4e5b778503..b2c70a574a6 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -836,6 +836,7 @@ struct record_header_t { std::ostream &operator<<(std::ostream &out, const extent_info_t &header); struct record_size_t { + extent_len_t raw_mdlength = 0; extent_len_t mdlength = 0; extent_len_t dlength = 0; }; diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index f1d2e1a52f6..4d406db99f9 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -302,6 +302,7 @@ public: struct ool_write_stats_t { io_stat_t extents; + uint64_t header_raw_bytes = 0; uint64_t header_bytes = 0; uint64_t num_records = 0; }; -- 2.39.5