]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/scrub: new/modified perf counters for scrub preemption 65836/head
authorRonen Friedman <rfriedma@redhat.com>
Wed, 8 Oct 2025 16:54:40 +0000 (11:54 -0500)
committerRonen Friedman <rfriedma@redhat.com>
Thu, 9 Oct 2025 05:13:15 +0000 (00:13 -0500)
A new 'scrub_[replicated/ec]_io_intersects' counter is added, to count
the times a client write op intersects the active scrub chunk range.
A new 'scrub_[replicated/ec]_io_blocked' counter counts the times
the write op did not preempt the scrub, and instead blocked for the
scrub to release the chunk.

The existing labeled counter <label>_write_blocked is still there,
but will be removed in 'Umbrella'.  Its meaning was modified,
to mimic the new 'scrub_[replicated/ec]_io_blocked' counter.

Signed-off-by: Ronen Friedman <rfriedma@redhat.com>
src/osd/osd_perf_counters.cc
src/osd/osd_perf_counters.h
src/osd/scrubber/pg_scrubber.cc
src/osd/scrubber/pg_scrubber.h
src/osd/scrubber_common.h

index 26a3a74fcab7c1626a05cdc2cdfc80bae4589128..85a4fe37fd5e138b2345b76d365390cf60c73db3 100644 (file)
@@ -407,6 +407,14 @@ PerfCounters *build_osd_logger(CephContext *cct) {
       l_osd_scrub_rppool_failed_elapsed,
       "failed_scrubs_replicated_elapsed",
       "time to scrub failure replicated");
+  osd_plb.add_u64_counter(
+      l_osd_scrub_rppool_write_intersects,
+      "scrub_replicated_io_intersects",
+      "client write op intersects chunk range");
+  osd_plb.add_u64_counter(
+      l_osd_scrub_rppool_write_blocked,
+      "scrub_replicated_io_blocked",
+      "write op did not preempt the scrub");
 
   // the replica reservation process - replicated pool
   osd_plb.add_u64_counter(
@@ -456,6 +464,14 @@ PerfCounters *build_osd_logger(CephContext *cct) {
   osd_plb.add_time_avg(
       l_osd_scrub_ec_failed_elapsed, "failed_scrubs_ec_elapsed",
       "time to scrub failure ec");
+  osd_plb.add_u64_counter(
+      l_osd_scrub_ec_write_intersects,
+      "scrub_ec_io_intersects",
+      "client write op intersects chunk range");
+  osd_plb.add_u64_counter(
+      l_osd_scrub_ec_write_blocked,
+      "scrub_ec_io_blocked",
+      "write op did not preempt the scrub");
 
   // the secondaries reservation process - EC
   osd_plb.add_u64_counter(
index 0eae8fad8cd39107049d1f7a28ec51a04b2ea2f7..4948b361499ddc5e674505762471fb74fd558466 100644 (file)
@@ -170,6 +170,8 @@ enum osd_counter_idx_t {
   l_osd_scrub_rppool_successful_elapsed, ///< time to complete a successful scrub
   l_osd_scrub_rppool_failed, ///< failed scrubs count
   l_osd_scrub_rppool_failed_elapsed, ///< time from start to failure
+  l_osd_scrub_rppool_write_intersects, ///< client write op intersects chunk range
+  l_osd_scrub_rppool_write_blocked, ///< write op did not preempt the scrub
 
   // ----   scrub reservation process - replicated pools
 
@@ -196,6 +198,8 @@ enum osd_counter_idx_t {
   l_osd_scrub_ec_successful_elapsed, ///< time to complete a successful scrub
   l_osd_scrub_ec_failed, ///< failed scrubs count
   l_osd_scrub_ec_failed_elapsed, ///< time from start to failure
+  l_osd_scrub_ec_write_intersects, ///< client write op intersects chunk range
+  l_osd_scrub_ec_write_blocked, ///< write op did not preempt the scrub
 
   // ----   scrub reservation process - EC
 
index eb9c0c697e373490f3ccc9f74efd8e41eb68a086..222e80c508045bb7443da8a813a66306e09a290d 100644 (file)
@@ -1020,7 +1020,8 @@ bool PgScrubber::write_blocked_by_scrub(const hobject_t& soid)
     return false;
   }
 
-  get_labeled_counters()->inc(scrbcnt_write_blocked);
+  const auto& unlabeled_cntrs_idx = get_unlabeled_counters();
+  get_osd_perf_counters()->inc(unlabeled_cntrs_idx.write_intersects);
   dout(20) << __func__ << " " << soid << " can preempt? "
           << preemption_data.is_preemptable() << " already preempted? "
           << preemption_data.was_preempted() << dendl;
@@ -1042,6 +1043,10 @@ bool PgScrubber::write_blocked_by_scrub(const hobject_t& soid)
 
     return false;
   }
+
+  get_osd_perf_counters()->inc(unlabeled_cntrs_idx.write_blocked);
+  // to be removed in version 'Umbrella':
+  get_labeled_counters()->inc(scrbcnt_write_blocked);
   return true;
 }
 
index e7174c55db66b1b2962d2752f5caa5ee2478fb0c..983804dfc306da413f6d333c7a7f5af777de8130 100644 (file)
@@ -150,6 +150,8 @@ static inline constexpr ScrubCounterSet io_counters_replicated{
   .successful_elapsed = l_osd_scrub_rppool_successful_elapsed,
   .failed_cnt = l_osd_scrub_rppool_failed,
   .failed_elapsed = l_osd_scrub_rppool_failed_elapsed,
+  .write_intersects = l_osd_scrub_rppool_write_intersects,
+  .write_blocked = l_osd_scrub_rppool_write_blocked,
   // replica-reservation-related:
   .rsv_successful_cnt = l_osd_scrub_rppool_reserv_success,
   .rsv_successful_elapsed = l_osd_scrub_rppool_reserv_successful_elapsed,
@@ -175,6 +177,8 @@ static inline constexpr ScrubCounterSet io_counters_ec{
   .successful_elapsed = l_osd_scrub_ec_successful_elapsed,
   .failed_cnt = l_osd_scrub_ec_failed,
   .failed_elapsed = l_osd_scrub_ec_failed_elapsed,
+  .write_intersects = l_osd_scrub_ec_write_intersects,
+  .write_blocked = l_osd_scrub_ec_write_blocked,
   // replica-reservation-related:
   .rsv_successful_cnt = l_osd_scrub_ec_reserv_success,
   .rsv_successful_elapsed = l_osd_scrub_ec_reserv_successful_elapsed,
index b814d01fa85a7baac52ce4ed276a9fce3ec2161c..9158c30762f57cb9bc5a18997d47db2d9c5c40a0 100644 (file)
@@ -322,6 +322,8 @@ struct ScrubCounterSet {
   osd_counter_idx_t successful_elapsed; ///< time to complete a successful scrub
   osd_counter_idx_t failed_cnt; ///< failed scrubs count
   osd_counter_idx_t failed_elapsed; ///< time from start to failure
+  osd_counter_idx_t write_intersects; ///< client write op intersects chunk range
+  osd_counter_idx_t write_blocked; ///< write op did not preempt the scrub
   // reservation process related:
   osd_counter_idx_t rsv_successful_cnt; ///< completed reservation processes
   osd_counter_idx_t rsv_successful_elapsed; ///< time to all-reserved