From: Xuehan Xu Date: Thu, 9 Dec 2021 04:26:39 +0000 (+0800) Subject: crimson/os/seastore/EPM: differentiate new extents and rewritten extents X-Git-Tag: v18.0.0~1268^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e9aa3497415ac00c955d16bb6a284bde1f2f7066;p=ceph.git crimson/os/seastore/EPM: differentiate new extents and rewritten extents 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 --- diff --git a/src/common/options/crimson.yaml.in b/src/common/options/crimson.yaml.in index 6ce7b68be0db..8f14d59a7a63 100644 --- a/src/common/options/crimson.yaml.in +++ b/src/common/options/crimson.yaml.in @@ -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 diff --git a/src/crimson/common/interruptible_future.h b/src/crimson/common/interruptible_future.h index d7f09b6dfa08..81abd258eb38 100644 --- a/src/crimson/common/interruptible_future.h +++ b/src/crimson/common/interruptible_future.h @@ -1239,7 +1239,7 @@ public: return make_interruptible( ::crimson::repeat( [action=std::move(action), - interrupt_condition=interrupt_cond.interrupt_cond] { + interrupt_condition=interrupt_cond.interrupt_cond]() mutable { return call_with_interruption( interrupt_condition, std::move(action)).to_future(); diff --git a/src/crimson/os/seastore/extent_placement_manager.cc b/src/crimson/os/seastore/extent_placement_manager.cc index 44f0172ad8c8..5d891777b81b 100644 --- a/src/crimson/os/seastore/extent_placement_manager.cc +++ b/src/crimson/os/seastore/extent_placement_manager.cc @@ -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( - "seastore_init_rewrite_segments_num_per_device"), + "seastore_init_write_segments_num_per_device"), [&] { return Writer{sp, sm}; } diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index bd464abc3454..a626ea9ed8bc 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -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 writers; }; diff --git a/src/crimson/os/seastore/segment_cleaner.cc b/src/crimson/os/seastore/segment_cleaner.cc index 3fbcaa4571b2..dc22701fd9ef 100644 --- a/src/crimson/os/seastore/segment_cleaner.cc +++ b/src/crimson/os/seastore/segment_cleaner.cc @@ -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, diff --git a/src/crimson/os/seastore/segment_cleaner.h b/src/crimson/os/seastore/segment_cleaner.h index 4f0596f9edcb..9d410a72f8bc 100644 --- a/src/crimson/os/seastore/segment_cleaner.h +++ b/src/crimson/os/seastore/segment_cleaner.h @@ -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) {