]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/EPM: differentiate new extents and rewritten extents
authorXuehan Xu <xxhdx1985126@gmail.com>
Thu, 9 Dec 2021 04:26:39 +0000 (12:26 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Mon, 7 Mar 2022 02:24:52 +0000 (10:24 +0800)
For new extents, randomly write them into a group of writers; while, for
rewritten extents, write them into a dedicated writer. Since rewritten
extents are sorted by their age, writing them into a single writer should
speed up the convergence of the ages of extents in the same segment.

Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/common/options/crimson.yaml.in
src/crimson/common/interruptible_future.h
src/crimson/os/seastore/extent_placement_manager.cc
src/crimson/os/seastore/extent_placement_manager.h
src/crimson/os/seastore/segment_cleaner.cc
src/crimson/os/seastore/segment_cleaner.h

index 6ce7b68be0db884a56b091d577e696cd81e956b5..8f14d59a7a63a130518d02f65eb98bd6fafffa87 100644 (file)
@@ -40,10 +40,10 @@ options:
   default: true
   see_also:
   - seastore_device_size
-- name: seastore_init_rewrite_segments_num_per_device
+- name: seastore_init_write_segments_num_per_device
   type: uint
   level: dev
-  desc: Initial number of segments for rewriting extents per device
+  desc: Initial number of segments for writing new extents per device
   default: 6
 - name: seastore_journal_batch_capacity
   type: uint
index d7f09b6dfa086516bdb725030d21d4515ff9023d..81abd258eb384469129d343ae90199d89a10239e 100644 (file)
@@ -1239,7 +1239,7 @@ public:
       return make_interruptible(
          ::crimson::repeat(
            [action=std::move(action),
-           interrupt_condition=interrupt_cond<InterruptCond>.interrupt_cond] {
+           interrupt_condition=interrupt_cond<InterruptCond>.interrupt_cond]() mutable {
            return call_with_interruption(
                      interrupt_condition,
                      std::move(action)).to_future();
index 44f0172ad8c8f276c023bbd06a3ccd29ea2b56a0..5d891777b81b1c7f87ee50d46544aa448c2fed36 100644 (file)
@@ -10,11 +10,12 @@ namespace crimson::os::seastore {
 SegmentedAllocator::SegmentedAllocator(
   SegmentProvider& sp,
   SegmentManager& sm)
+  : rewriter(sp, sm)
 {
   std::generate_n(
     std::back_inserter(writers),
     crimson::common::get_conf<uint64_t>(
-      "seastore_init_rewrite_segments_num_per_device"),
+      "seastore_init_write_segments_num_per_device"),
     [&] {
       return Writer{sp, sm};
     }
index bd464abc3454a1ef65d73a44c042f180b9f7272e..a626ea9ed8bcc8145131a587d43bd21a95bb0b1e 100644 (file)
@@ -220,7 +220,11 @@ public:
     SegmentManager& sm);
 
   Writer &get_writer(placement_hint_t hint) {
-    return writers[std::rand() % writers.size()];
+    if (hint == placement_hint_t::REWRITE) {
+      return rewriter;
+    } else {
+      return writers[std::rand() % writers.size()];
+    }
   }
 
   alloc_paddr_iertr::future<> alloc_ool_extents_paddr(
@@ -249,6 +253,7 @@ public:
     });
   }
 private:
+  Writer rewriter;
   std::vector<Writer> writers;
 };
 
index 3fbcaa4571b244237d4784b03e436aae9fb32182..dc22701fd9ef98853a9fa8416d84bdfeaedfa919 100644 (file)
@@ -168,6 +168,14 @@ void SpaceTrackerDetailed::dump_usage(segment_id_t id) const
     block_size_by_segment_manager[id.device_id()]);
 }
 
+void SpaceTrackerSimple::dump_usage(segment_id_t id) const
+{
+  logger().info(
+    "SpaceTrackerSimple::dump_usage id: {}, live_bytes: {}",
+    id,
+    live_bytes_by_segment[id].live_bytes);
+}
+
 SegmentCleaner::SegmentCleaner(
   config_t config,
   ExtentReaderRef&& scr,
index 4f0596f9edcb5f5611391733454e25f56135fbe1..9d410a72f8bcb827836acbb62b80f8d851b81ba9 100644 (file)
@@ -390,7 +390,7 @@ public:
     return (double)seg_bytes.live_bytes / (double)seg_bytes.total_bytes;
   }
 
-  void dump_usage(segment_id_t) const final {}
+  void dump_usage(segment_id_t) const final;
 
   void reset() final {
     for (auto &i : live_bytes_by_segment) {