]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/segment_cleaner: improve log information
authorYingxin Cheng <yingxin.cheng@intel.com>
Fri, 24 Jun 2022 05:22:07 +0000 (13:22 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 29 Jun 2022 06:45:48 +0000 (14:45 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/async_cleaner.cc
src/crimson/os/seastore/async_cleaner.h

index 893383310ce84288b80df7cfe59fcfd236c27333..7d35c3eab70891d3dff662260d18cf92ef425464 100644 (file)
@@ -65,8 +65,8 @@ void segment_info_t::init_closed(
 
 std::ostream& operator<<(std::ostream &out, const segment_info_t &info)
 {
-  out << "seg_info_t("
-      << "state=" << info.state;
+  out << "seg_info_t(" << info.id
+      << "state=" << info.state;
   if (info.is_empty()) {
     // pass
   } else { // open or closed
@@ -569,11 +569,13 @@ segment_id_t AsyncCleaner::allocate_segment(
       segments.mark_open(seg_id, seq, type, category, generation);
       auto new_usage = calc_utilization(seg_id);
       adjust_segment_util(old_usage, new_usage);
-      INFO("opened, should_block_on_gc {}, projected_avail_ratio {}, "
-           "reclaim_ratio {}",
-           should_block_on_gc(),
+      INFO("opened, should_block_on_trim {}, should_block_on_reclaim {}, "
+           "projected_avail_ratio {}, reclaim_ratio {}, alive_ratio {}",
+           should_block_on_trim(),
+           should_block_on_reclaim(),
            get_projected_available_ratio(),
-           get_reclaim_ratio());
+           get_reclaim_ratio(),
+           get_alive_ratio());
       return seg_id;
     }
   }
@@ -670,11 +672,14 @@ void AsyncCleaner::close_segment(segment_id_t segment)
   }
   auto new_usage = calc_utilization(segment);
   adjust_segment_util(old_usage, new_usage);
-  INFO("closed, should_block_on_gc {}, projected_avail_ratio {}, "
-       "reclaim_ratio {}",
-       should_block_on_gc(),
+  INFO("closed, should_block_on_trim {}, should_block_on_reclaim {}, "
+       "projected_avail_ratio {}, reclaim_ratio {}, alive_ratio {} -- {}",
+       should_block_on_trim(),
+       should_block_on_reclaim(),
        get_projected_available_ratio(),
-       get_reclaim_ratio());
+       get_reclaim_ratio(),
+       get_alive_ratio(),
+       seg_info);
 }
 
 AsyncCleaner::trim_backrefs_ret AsyncCleaner::trim_backrefs(
@@ -888,7 +893,8 @@ AsyncCleaner::gc_reclaim_space_ret AsyncCleaner::gc_reclaim_space()
   if (!reclaim_state) {
     segment_id_t seg_id = get_next_reclaim_segment();
     auto &segment_info = segments[seg_id];
-    INFO("reclaim {} {} start", seg_id, segment_info);
+    INFO("reclaim {} {} start, usage={}",
+         seg_id, segment_info, space_tracker->calc_utilization(seg_id));
     ceph_assert(segment_info.is_closed());
     reclaim_state = reclaim_state_t::create(
         seg_id, segment_info.generation, segments.get_segment_size());
@@ -1023,9 +1029,10 @@ AsyncCleaner::gc_reclaim_space_ret AsyncCleaner::gc_reclaim_space()
       auto d = seastar::lowres_system_clock::now() - start;
       DEBUG("duration: {}, pavail_ratio before: {}, repeats: {}", d, pavail_ratio, runs);
       if (reclaim_state->is_complete()) {
-       INFO("reclaim {} finish, alive/total={}",
+       INFO("reclaim {} finish, reclaimed alive/total={}, usage={}",
              reclaim_state->get_segment_id(),
-             stats.reclaiming_bytes/(double)segments.get_segment_size());
+             stats.reclaiming_bytes/(double)segments.get_segment_size(),
+             space_tracker->calc_utilization(reclaim_state->get_segment_id()));
        stats.reclaimed_bytes += stats.reclaiming_bytes;
        stats.reclaimed_segment_bytes += segments.get_segment_size();
        stats.reclaiming_bytes = 0;
@@ -1058,6 +1065,7 @@ AsyncCleaner::mount_ret AsyncCleaner::mount()
   for (auto sm : sms) {
     segments.add_segment_manager(*sm);
   }
+  segments.assign_ids();
   metrics.clear();
   register_metrics();
 
@@ -1221,12 +1229,14 @@ AsyncCleaner::maybe_release_segment(Transaction &t)
       segments.mark_empty(to_release);
       auto new_usage = calc_utilization(to_release);
       adjust_segment_util(old_usage, new_usage);
-      INFOT("released, should_block_on_gc {}, projected_avail_ratio {}, "
-           "reclaim_ratio {}",
-           t,
-           should_block_on_gc(),
-           get_projected_available_ratio(),
-           get_reclaim_ratio());
+      INFOT("released, should_block_on_trim {}, should_block_on_reclaim {}, "
+            "projected_avail_ratio {}, reclaim_ratio {}, alive_ratio {}",
+            t,
+            should_block_on_trim(),
+            should_block_on_reclaim(),
+            get_projected_available_ratio(),
+            get_reclaim_ratio(),
+            get_alive_ratio());
       if (space_tracker->get_usage(to_release) != 0) {
         space_tracker->dump_usage(to_release);
         ceph_abort();
@@ -1372,7 +1382,8 @@ void AsyncCleaner::log_gc_state(const char *caller) const
       "unavailable_unused {}B; "
       "reclaim_ratio {}, "
       "available_ratio {}, "
-      "should_block_on_gc {}, "
+      "should_block_on_trim {}, "
+      "should_block_on_reclaim {}, "
       "gc_should_reclaim_space {}, "
       "journal_head {}, "
       "journal_tail_target {}, "
@@ -1392,7 +1403,8 @@ void AsyncCleaner::log_gc_state(const char *caller) const
       get_unavailable_unused_bytes(),
       get_reclaim_ratio(),
       segments.get_available_ratio(),
-      should_block_on_gc(),
+      should_block_on_trim(),
+      should_block_on_reclaim(),
       gc_should_reclaim_space(),
       segments.get_journal_head(),
       journal_tail_target,
index 5847f001f04e7286463e961d55a1e014b034cd63..19189b55cdfb7c0f9e9dce074aedf43152b62d5e 100644 (file)
@@ -29,6 +29,8 @@ namespace crimson::os::seastore {
 struct segment_info_t {
   using time_point = seastar::lowres_system_clock::time_point;
 
+  segment_id_t id = NULL_SEG_ID;
+
   // segment_info_t is initiated as set_empty()
   Segment::segment_state_t state = Segment::segment_state_t::EMPTY;
 
@@ -196,6 +198,12 @@ public:
 
   void add_segment_manager(SegmentManager &segment_manager);
 
+  void assign_ids() {
+    for (auto &item : segments) {
+      item.second.id = item.first;
+    }
+  }
+
   // initiate non-empty segments, the others are by default empty
   void init_closed(segment_id_t, segment_seq_t, segment_type_t,
                    data_category_t, reclaim_gen_t);
@@ -1157,6 +1165,9 @@ private:
     if (segments.get_unavailable_bytes() == 0) return 0;
     return (double)get_unavailable_unused_bytes() / (double)segments.get_unavailable_bytes();
   }
+  double get_alive_ratio() const {
+    return stats.used_bytes / (double)segments.get_total_bytes();
+  }
 
   /*
    * Space calculations (projected)