]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal: measure io-depth and batching 43617/head
authorYingxin Cheng <yingxin.cheng@intel.com>
Mon, 25 Oct 2021 08:40:59 +0000 (16:40 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 3 Nov 2021 07:11:41 +0000 (15:11 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h

index 8a976b847d82912680d48a7523bdb3adfcd30a04..55057b88bdf38c117c6791b8f09621917eafba9f 100644 (file)
@@ -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
index 524b1977bc342abc8884ed2e9853a3208d6b409c..6e0aa3942ff84f3ca6314bbd688f95ba397883a2 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <seastar/core/circular_buffer.hh>
 #include <seastar/core/future.hh>
+#include <seastar/core/metrics.hh>
 #include <seastar/core/shared_future.hh>
 
 #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<RecordBatch*> free_batch_ptrs;
     std::optional<seastar::promise<> > 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<Journal>;