From: Yingxin Cheng Date: Mon, 25 Oct 2021 08:40:59 +0000 (+0800) Subject: crimson/os/seastore/journal: measure io-depth and batching X-Git-Tag: v17.1.0~519^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=425ccdde356479c222b1d3e1bca80d418270e28f;p=ceph.git crimson/os/seastore/journal: measure io-depth and batching Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 8a976b847d829..55057b88bdf38 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -62,7 +62,9 @@ Journal::Journal( "seastore_journal_batch_flush_size"), journal_segment_manager), scanner(scanner) -{} +{ + register_metrics(); +} Journal::prep_replay_segments_fut Journal::prep_replay_segments( @@ -247,6 +249,45 @@ Journal::replay_ret Journal::replay( }); } +void Journal::register_metrics() +{ + record_submitter.reset_stats(); + namespace sm = seastar::metrics; + metrics.add_group( + "journal", + { + sm::make_counter( + "record_num", + [this] { + return record_submitter.get_record_batch_stats().num_io; + }, + sm::description("total number of records submitted") + ), + sm::make_counter( + "record_batch_num", + [this] { + return record_submitter.get_record_batch_stats().num_io_grouped; + }, + sm::description("total number of records batched") + ), + sm::make_counter( + "io_num", + [this] { + return record_submitter.get_io_depth_stats().num_io; + }, + sm::description("total number of io submitted") + ), + sm::make_counter( + "io_depth_num", + [this] { + return record_submitter.get_io_depth_stats().num_io_grouped; + }, + sm::description("total number of io depth") + ), + } + ); +} + Journal::JournalSegmentManager::JournalSegmentManager( SegmentManager& segment_manager) : segment_manager{segment_manager} @@ -631,6 +672,8 @@ Journal::RecordSubmitter::submit_pending( bool flush) { assert(!p_current_batch->is_submitting()); + record_batch_stats.increment( + p_current_batch->get_num_records() + 1); auto write_fut = [this, flush, record=std::move(record), &rsize]() mutable { if (flush && p_current_batch->is_empty()) { // fast path with direct write diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index 524b1977bc342..6e0aa3942ff84 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -8,6 +8,7 @@ #include #include +#include #include #include "include/ceph_assert.h" @@ -75,6 +76,7 @@ public: using close_ertr = crimson::errorator< crimson::ct_error::input_output_error>; close_ertr::future<> close() { + metrics.clear(); return journal_segment_manager.close(); } @@ -331,12 +333,35 @@ private: // OVERFLOW: outstanding_io > io_depth_limit is impossible }; + struct grouped_io_stats { + uint64_t num_io = 0; + uint64_t num_io_grouped = 0; + + void increment(uint64_t num_grouped_io) { + ++num_io; + num_io_grouped += num_grouped_io; + } + }; + public: RecordSubmitter(std::size_t io_depth, std::size_t batch_capacity, std::size_t batch_flush_size, JournalSegmentManager&); + grouped_io_stats get_record_batch_stats() const { + return record_batch_stats; + } + + grouped_io_stats get_io_depth_stats() const { + return io_depth_stats; + } + + void reset_stats() { + record_batch_stats = {}; + io_depth_stats = {}; + } + void set_write_pipeline(WritePipeline *_write_pipeline) { write_pipeline = _write_pipeline; } @@ -349,6 +374,7 @@ private: void increment_io() { ++num_outstanding_io; + io_depth_stats.increment(num_outstanding_io); update_state(); } @@ -410,12 +436,16 @@ private: RecordBatch* p_current_batch = nullptr; seastar::circular_buffer free_batch_ptrs; std::optional > wait_submit_promise; + + grouped_io_stats record_batch_stats; + grouped_io_stats io_depth_stats; }; SegmentProvider* segment_provider = nullptr; JournalSegmentManager journal_segment_manager; RecordSubmitter record_submitter; ExtentReader& scanner; + seastar::metrics::metric_group metrics; /// return ordered vector of segments to replay using replay_segments_t = std::vector< @@ -433,7 +463,6 @@ private: record_header_t header, const bufferlist &bl); -private: /// replays records starting at start through end of segment replay_ertr::future<> replay_segment( @@ -441,6 +470,8 @@ private: segment_header_t header, ///< [in] segment header delta_handler_t &delta_handler ///< [in] processes deltas in order ); + + void register_metrics(); }; using JournalRef = std::unique_ptr;