Skip to content

Commit 44747ff

Browse files
authored
Merge pull request ceph#59212 from cyx1231st/wip-seastore-more-reports
crimson/os/seastore/cache: report lru usage/in/out with trans and extent type Reviewed-by: Samuel Just <[email protected]> Reviewed-by: Xuehan Xu <[email protected]>
2 parents 964adda + 2433608 commit 44747ff

File tree

13 files changed

+551
-176
lines changed

13 files changed

+551
-176
lines changed

src/crimson/os/seastore/cache.cc

Lines changed: 148 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ Cache::Cache(
4444
"seastore_cache_lru_size"))
4545
{
4646
LOG_PREFIX(Cache::Cache);
47-
INFO("created, lru_size={}", lru.get_capacity());
47+
INFO("created, lru_capacity={}B", lru.get_capacity_bytes());
4848
register_metrics();
4949
segment_providers_by_device_id.resize(DEVICE_ID_MAX, nullptr);
5050
}
@@ -97,8 +97,7 @@ Cache::retire_extent_ret Cache::retire_extent_addr(
9797
TRANS_ID_NULL);
9898
DEBUGT("retire {}~{} as placeholder, add extent -- {}",
9999
t, addr, length, *ext);
100-
const auto t_src = t.get_src();
101-
add_extent(ext, &t_src);
100+
add_extent(ext);
102101
}
103102
t.add_to_read_set(ext);
104103
t.add_to_retired_set(ext);
@@ -126,8 +125,7 @@ void Cache::retire_absent_extent_addr(
126125
TRANS_ID_NULL);
127126
DEBUGT("retire {}~{} as placeholder, add extent -- {}",
128127
t, addr, length, *ext);
129-
const auto t_src = t.get_src();
130-
add_extent(ext, &t_src);
128+
add_extent(ext);
131129
t.add_to_read_set(ext);
132130
t.add_to_retired_set(ext);
133131
}
@@ -511,14 +509,14 @@ void Cache::register_metrics()
511509
sm::make_counter(
512510
"cache_lru_size_bytes",
513511
[this] {
514-
return lru.get_current_contents_bytes();
512+
return lru.get_current_size_bytes();
515513
},
516514
sm::description("total bytes pinned by the lru")
517515
),
518516
sm::make_counter(
519-
"cache_lru_size_extents",
517+
"cache_lru_num_extents",
520518
[this] {
521-
return lru.get_current_contents_extents();
519+
return lru.get_current_num_extents();
522520
},
523521
sm::description("total extents pinned by the lru")
524522
),
@@ -727,19 +725,12 @@ void Cache::register_metrics()
727725
);
728726
}
729727

730-
void Cache::add_extent(
731-
CachedExtentRef ref,
732-
const Transaction::src_t* p_src=nullptr)
728+
void Cache::add_extent(CachedExtentRef ref)
733729
{
734730
assert(ref->is_valid());
735731
assert(ref->user_hint == PLACEMENT_HINT_NULL);
736732
assert(ref->rewrite_generation == NULL_GENERATION);
737733
extents.insert(*ref);
738-
if (ref->is_dirty()) {
739-
add_to_dirty(ref);
740-
} else {
741-
touch_extent(*ref, p_src);
742-
}
743734
}
744735

745736
void Cache::mark_dirty(CachedExtentRef ref)
@@ -766,14 +757,11 @@ void Cache::add_to_dirty(CachedExtentRef ref)
766757

767758
void Cache::remove_from_dirty(CachedExtentRef ref)
768759
{
769-
if (ref->is_dirty()) {
770-
ceph_assert(ref->primary_ref_list_hook.is_linked());
771-
stats.dirty_bytes -= ref->get_length();
772-
dirty.erase(dirty.s_iterator_to(*ref));
773-
intrusive_ptr_release(&*ref);
774-
} else {
775-
ceph_assert(!ref->primary_ref_list_hook.is_linked());
776-
}
760+
assert(ref->is_dirty());
761+
ceph_assert(ref->primary_ref_list_hook.is_linked());
762+
stats.dirty_bytes -= ref->get_length();
763+
dirty.erase(dirty.s_iterator_to(*ref));
764+
intrusive_ptr_release(&*ref);
777765
}
778766

779767
void Cache::remove_extent(CachedExtentRef ref)
@@ -807,7 +795,7 @@ void Cache::commit_replace_extent(
807795
assert(next->version == prev->version + 1);
808796
extents.replace(*next, *prev);
809797

810-
if (prev->get_type() == extent_types_t::ROOT) {
798+
if (is_root_type(prev->get_type())) {
811799
assert(prev->is_stable_clean()
812800
|| prev->primary_ref_list_hook.is_linked());
813801
if (prev->is_dirty()) {
@@ -1093,7 +1081,7 @@ CachedExtentRef Cache::duplicate_for_write(
10931081
auto [iter, inserted] = i->mutation_pendings.insert(*ret);
10941082
ceph_assert(inserted);
10951083
t.add_mutated_extent(ret);
1096-
if (ret->get_type() == extent_types_t::ROOT) {
1084+
if (is_root_type(ret->get_type())) {
10971085
t.root = ret->cast<RootBlock>();
10981086
} else {
10991087
ret->last_committed_crc = i->last_committed_crc;
@@ -1187,7 +1175,7 @@ record_t Cache::prepare_record(
11871175

11881176
assert(i->get_version() > 0);
11891177
auto final_crc = i->calc_crc32c();
1190-
if (i->get_type() == extent_types_t::ROOT) {
1178+
if (is_root_type(i->get_type())) {
11911179
SUBTRACET(seastore_t, "writing out root delta {}B -- {}",
11921180
t, delta_length, *i);
11931181
assert(t.root == i);
@@ -1255,8 +1243,8 @@ record_t Cache::prepare_record(
12551243
retire_stat.increment(extent->get_length());
12561244
DEBUGT("retired and remove extent -- {}", t, *extent);
12571245
commit_retire_extent(t, extent);
1258-
if (is_backref_mapped_extent_node(extent)
1259-
|| is_retired_placeholder(extent->get_type())) {
1246+
if (is_backref_mapped_extent_node(extent) ||
1247+
is_retired_placeholder_type(extent->get_type())) {
12601248
rel_delta.alloc_blk_ranges.emplace_back(
12611249
extent->get_paddr(),
12621250
L_ADDR_NULL,
@@ -1289,7 +1277,7 @@ record_t Cache::prepare_record(
12891277
i->prepare_write();
12901278
i->prepare_commit();
12911279
bl.append(i->get_bptr());
1292-
if (i->get_type() == extent_types_t::ROOT) {
1280+
if (is_root_type(i->get_type())) {
12931281
ceph_assert(0 == "ROOT never gets written as a fresh block");
12941282
}
12951283

@@ -1354,7 +1342,7 @@ record_t Cache::prepare_record(
13541342
i->state = CachedExtent::extent_state_t::CLEAN;
13551343
assert(i->is_logical());
13561344
i->clear_modified_region();
1357-
touch_extent(*i);
1345+
touch_extent(*i, &trans_src);
13581346
DEBUGT("inplace rewrite ool block is commmitted -- {}", t, *i);
13591347
}
13601348

@@ -1576,9 +1564,11 @@ void Cache::complete_commit(
15761564
i->prior_instance.reset();
15771565
DEBUGT("add extent as fresh, inline={} -- {}",
15781566
t, is_inline, *i);
1579-
const auto t_src = t.get_src();
15801567
i->invalidate_hints();
1581-
add_extent(i, &t_src);
1568+
add_extent(i);
1569+
assert(!i->is_dirty());
1570+
const auto t_src = t.get_src();
1571+
touch_extent(*i, &t_src);
15821572
epm.commit_space_used(i->get_paddr(), i->get_length());
15831573
if (is_backref_mapped_extent_node(i)) {
15841574
DEBUGT("backref_list new {} len {}",
@@ -1619,7 +1609,7 @@ void Cache::complete_commit(
16191609
i->prior_instance = CachedExtentRef();
16201610
i->state = CachedExtent::extent_state_t::DIRTY;
16211611
assert(i->version > 0);
1622-
if (i->version == 1 || i->get_type() == extent_types_t::ROOT) {
1612+
if (i->version == 1 || is_root_type(i->get_type())) {
16231613
i->dirty_from_or_retired_at = start_seq;
16241614
DEBUGT("commit extent done, become dirty -- {}", t, *i);
16251615
} else {
@@ -1648,8 +1638,8 @@ void Cache::complete_commit(
16481638
for (auto &i: t.retired_set) {
16491639
auto &extent = i.extent;
16501640
extent->dirty_from_or_retired_at = start_seq;
1651-
if (is_backref_mapped_extent_node(extent)
1652-
|| is_retired_placeholder(extent->get_type())) {
1641+
if (is_backref_mapped_extent_node(extent) ||
1642+
is_retired_placeholder_type(extent->get_type())) {
16531643
DEBUGT("backref_list free {} len {}",
16541644
t,
16551645
extent->get_paddr(),
@@ -1694,8 +1684,13 @@ void Cache::complete_commit(
16941684
i->get_length(),
16951685
i->get_type(),
16961686
start_seq));
1697-
const auto t_src = t.get_src();
1698-
add_extent(i, &t_src);
1687+
add_extent(i);
1688+
if (i->is_dirty()) {
1689+
add_to_dirty(i);
1690+
} else {
1691+
const auto t_src = t.get_src();
1692+
touch_extent(*i, &t_src);
1693+
}
16991694
}
17001695
}
17011696
if (!backref_list.empty()) {
@@ -1752,8 +1747,8 @@ Cache::close_ertr::future<> Cache::close()
17521747
stats.dirty_bytes,
17531748
get_oldest_dirty_from().value_or(JOURNAL_SEQ_NULL),
17541749
get_oldest_backref_dirty_from().value_or(JOURNAL_SEQ_NULL),
1755-
lru.get_current_contents_extents(),
1756-
lru.get_current_contents_bytes(),
1750+
lru.get_current_num_extents(),
1751+
lru.get_current_size_bytes(),
17571752
extents.size(),
17581753
extents.get_bytes());
17591754
root.reset();
@@ -1860,7 +1855,7 @@ Cache::replay_delta(
18601855
std::make_pair(false, nullptr));
18611856
}
18621857

1863-
if (delta.type == extent_types_t::ROOT) {
1858+
if (is_root_type(delta.type)) {
18641859
TRACE("replay root delta at {} {}, remove extent ... -- {}, prv_root={}",
18651860
journal_seq, record_base, delta, *root);
18661861
remove_extent(root);
@@ -1871,6 +1866,7 @@ Cache::replay_delta(
18711866
journal_seq, record_base, delta, *root);
18721867
root->set_modify_time(modify_time);
18731868
add_extent(root);
1869+
add_to_dirty(root);
18741870
return replay_delta_ertr::make_ready_future<std::pair<bool, CachedExtentRef>>(
18751871
std::make_pair(true, root));
18761872
} else {
@@ -1881,7 +1877,7 @@ Cache::replay_delta(
18811877
if (ret) {
18821878
// no retired-placeholder should be exist yet because no transaction
18831879
// has been created.
1884-
assert(ret->get_type() != extent_types_t::RETIRED_PLACEHOLDER);
1880+
assert(!is_retired_placeholder_type(ret->get_type()));
18851881
return ret->wait_io().then([ret] {
18861882
return ret;
18871883
});
@@ -1898,7 +1894,9 @@ Cache::replay_delta(
18981894
delta.length,
18991895
nullptr,
19001896
[](CachedExtent &) {},
1901-
[](CachedExtent &) {}) :
1897+
[this](CachedExtent &ext) {
1898+
touch_extent(ext, nullptr);
1899+
}) :
19021900
_get_extent_if_cached(
19031901
delta.paddr)
19041902
).handle_error(
@@ -2009,7 +2007,7 @@ Cache::get_next_dirty_extents_ret Cache::get_next_dirty_extents(
20092007
if (result == Transaction::get_extent_ret::ABSENT) {
20102008
DEBUGT("extent is absent on t -- {}", t, *ext);
20112009
t.add_to_read_set(ext);
2012-
if (ext->get_type() == extent_types_t::ROOT) {
2010+
if (is_root_type(ext->get_type())) {
20132011
if (t.root) {
20142012
assert(&*t.root == &*ext);
20152013
ceph_assert(0 == "t.root would have to already be in the read set");
@@ -2161,4 +2159,110 @@ Cache::do_get_caching_extent_by_type(
21612159
});
21622160
}
21632161

2162+
cache_stats_t Cache::get_stats(
2163+
bool report_detail, double seconds) const
2164+
{
2165+
cache_stats_t ret;
2166+
lru.get_stats(ret, report_detail, seconds);
2167+
return ret;
2168+
}
2169+
2170+
void Cache::LRU::get_stats(
2171+
cache_stats_t &stats,
2172+
bool report_detail,
2173+
double seconds) const
2174+
{
2175+
LOG_PREFIX(Cache::LRU::get_stats);
2176+
2177+
stats.lru_sizes = cache_size_stats_t{current_size, lru.size()};
2178+
stats.lru_io = overall_io;
2179+
stats.lru_io.minus(last_overall_io);
2180+
2181+
if (report_detail && seconds != 0) {
2182+
cache_io_stats_t _trans_io = trans_io;
2183+
_trans_io.minus(last_trans_io);
2184+
2185+
cache_io_stats_t other_io = stats.lru_io;
2186+
other_io.minus(_trans_io);
2187+
2188+
counter_by_src_t<counter_by_extent_t<cache_io_stats_t> >
2189+
_trans_io_by_src_ext = trans_io_by_src_ext;
2190+
counter_by_src_t<cache_io_stats_t> trans_io_by_src;
2191+
for (uint8_t _src=0; _src<TRANSACTION_TYPE_MAX; ++_src) {
2192+
auto src = static_cast<transaction_type_t>(_src);
2193+
auto& io_by_ext = get_by_src(_trans_io_by_src_ext, src);
2194+
const auto& last_io_by_ext = get_by_src(last_trans_io_by_src_ext, src);
2195+
auto& trans_io_per_src = get_by_src(trans_io_by_src, src);
2196+
for (uint8_t _ext=0; _ext<EXTENT_TYPES_MAX; ++_ext) {
2197+
auto ext = static_cast<extent_types_t>(_ext);
2198+
auto& extent_io = get_by_ext(io_by_ext, ext);
2199+
const auto& last_extent_io = get_by_ext(last_io_by_ext, ext);
2200+
extent_io.minus(last_extent_io);
2201+
trans_io_per_src.add(extent_io);
2202+
}
2203+
}
2204+
2205+
std::ostringstream oss;
2206+
oss << "\nlru total" << stats.lru_sizes;
2207+
cache_size_stats_t data_sizes;
2208+
cache_size_stats_t mdat_sizes;
2209+
cache_size_stats_t phys_sizes;
2210+
for (uint8_t _ext=0; _ext<EXTENT_TYPES_MAX; ++_ext) {
2211+
auto ext = static_cast<extent_types_t>(_ext);
2212+
const auto extent_sizes = get_by_ext(sizes_by_ext, ext);
2213+
if (is_data_type(ext)) {
2214+
data_sizes.add(extent_sizes);
2215+
} else if (is_logical_metadata_type(ext)) {
2216+
mdat_sizes.add(extent_sizes);
2217+
} else if (is_physical_type(ext)) {
2218+
phys_sizes.add(extent_sizes);
2219+
}
2220+
}
2221+
oss << "\n data" << data_sizes
2222+
<< "\n mdat" << mdat_sizes
2223+
<< "\n phys" << phys_sizes;
2224+
2225+
oss << "\nlru io: trans-"
2226+
<< cache_io_stats_printer_t{seconds, _trans_io}
2227+
<< "; other-"
2228+
<< cache_io_stats_printer_t{seconds, other_io};
2229+
for (uint8_t _src=0; _src<TRANSACTION_TYPE_MAX; ++_src) {
2230+
auto src = static_cast<transaction_type_t>(_src);
2231+
const auto& trans_io_per_src = get_by_src(trans_io_by_src, src);
2232+
if (trans_io_per_src.is_empty()) {
2233+
continue;
2234+
}
2235+
cache_io_stats_t data_io;
2236+
cache_io_stats_t mdat_io;
2237+
cache_io_stats_t phys_io;
2238+
const auto& io_by_ext = get_by_src(_trans_io_by_src_ext, src);
2239+
for (uint8_t _ext=0; _ext<EXTENT_TYPES_MAX; ++_ext) {
2240+
auto ext = static_cast<extent_types_t>(_ext);
2241+
const auto extent_io = get_by_ext(io_by_ext, ext);
2242+
if (is_data_type(ext)) {
2243+
data_io.add(extent_io);
2244+
} else if (is_logical_metadata_type(ext)) {
2245+
mdat_io.add(extent_io);
2246+
} else if (is_physical_type(ext)) {
2247+
phys_io.add(extent_io);
2248+
}
2249+
}
2250+
oss << "\n " << src << ": "
2251+
<< cache_io_stats_printer_t{seconds, trans_io_per_src}
2252+
<< "\n data: "
2253+
<< cache_io_stats_printer_t{seconds, data_io}
2254+
<< "\n mdat: "
2255+
<< cache_io_stats_printer_t{seconds, mdat_io}
2256+
<< "\n phys: "
2257+
<< cache_io_stats_printer_t{seconds, phys_io};
2258+
}
2259+
2260+
INFO("{}", oss.str());
2261+
}
2262+
2263+
last_overall_io = overall_io;
2264+
last_trans_io = trans_io;
2265+
last_trans_io_by_src_ext = trans_io_by_src_ext;
2266+
}
2267+
21642268
}

0 commit comments

Comments
 (0)