Skip to content

Commit b8257b4

Browse files
committed
crimson/os/seastore: make segment cleaner do gc based on gc benefit cost ratio
Segments' benefit cost ratio is calculated: segment_last_mod_time = max{last modification time of all extents in the segment} segment_last_rewrite_time = max{last rewrite time of all extents in the segment} segment_utilization = segment_live_bytes / segment_size segment_age = current_time - max{segment_last_mod_time, segment_last_rewrite_time} benefit_cost_ratio = (1 - segment_utilization) * segment_age / (1 + segment_utilization) Segment cleaner always reclaim the segment with the largest benefit cost ratio Signed-off-by: Xuehan Xu <[email protected]>
1 parent e48fc34 commit b8257b4

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/crimson/os/seastore/segment_cleaner.h

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -895,28 +895,41 @@ class SegmentCleaner : public SegmentProvider {
895895

896896
// journal status helpers
897897

898+
double calc_gc_benefit_cost(segment_id_t id) const {
899+
double util = space_tracker->calc_utilization(id);
900+
auto cur_time = seastar::lowres_system_clock::now();
901+
auto segment = segments[id];
902+
assert(cur_time >= segment.last_modified);
903+
auto segment_age =
904+
cur_time - std::max(segment.last_modified, segment.last_rewritten);
905+
uint64_t age = segment_age.count();
906+
return (1 - util) * age / (1 + util);
907+
}
908+
898909
journal_seq_t get_next_gc_target() const {
899910
segment_id_t id = NULL_SEG_ID;
900911
segment_seq_t seq = NULL_SEG_SEQ;
901-
int64_t least_live_bytes = std::numeric_limits<int64_t>::max();
912+
double max_benefit_cost = 0;
902913
for (auto it = segments.begin();
903914
it != segments.end();
904915
++it) {
905916
auto _id = it->first;
906917
const auto& segment_info = it->second;
918+
double benefit_cost = calc_gc_benefit_cost(_id);
907919
if (segment_info.is_closed() &&
908920
!segment_info.is_in_journal(journal_tail_committed) &&
909-
space_tracker->get_usage(_id) < least_live_bytes) {
921+
benefit_cost > max_benefit_cost) {
910922
id = _id;
911923
seq = segment_info.journal_segment_seq;
912-
least_live_bytes = space_tracker->get_usage(id);
924+
max_benefit_cost = benefit_cost;
913925
}
914926
}
915927
if (id != NULL_SEG_ID) {
916928
crimson::get_logger(ceph_subsys_seastore_cleaner).debug(
917-
"SegmentCleaner::get_next_gc_target: segment {} seq {}",
929+
"SegmentCleaner::get_next_gc_target: segment {} seq {}, benefit_cost {}",
918930
id,
919-
seq);
931+
seq,
932+
max_benefit_cost);
920933
return journal_seq_t{seq, paddr_t::make_seg_paddr(id, 0)};
921934
} else {
922935
return JOURNAL_SEQ_NULL;

0 commit comments

Comments
 (0)