Skip to content

Commit 2433608

Browse files
committed
crimson/os/seastore/cache: report lru usage/in/out with trans and extent type
Signed-off-by: Yingxin Cheng <[email protected]>
1 parent b9c2fb7 commit 2433608

File tree

7 files changed

+332
-10
lines changed

7 files changed

+332
-10
lines changed

src/crimson/os/seastore/cache.cc

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,4 +2159,110 @@ Cache::do_get_caching_extent_by_type(
21592159
});
21602160
}
21612161

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+
21622268
}

src/crimson/os/seastore/cache.h

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ class Cache {
198198
Cache(ExtentPlacementManager &epm);
199199
~Cache();
200200

201+
cache_stats_t get_stats(bool report_detail, double seconds) const;
202+
201203
/// Creates empty transaction by source
202204
TransactionRef create_transaction(
203205
Transaction::src_t src,
@@ -1363,7 +1365,7 @@ class Cache {
13631365
return;
13641366
}
13651367
if (ext.is_stable_clean() && !ext.is_placeholder()) {
1366-
lru.move_to_top(ext);
1368+
lru.move_to_top(ext, p_src);
13671369
}
13681370
}
13691371

@@ -1419,6 +1421,7 @@ class Cache {
14191421

14201422
friend class crimson::os::seastore::backref::BtreeBackrefManager;
14211423
friend class crimson::os::seastore::BackrefManager;
1424+
14221425
/**
14231426
* lru
14241427
*
@@ -1431,16 +1434,38 @@ class Cache {
14311434
// current size (bytes)
14321435
size_t current_size = 0;
14331436

1437+
counter_by_extent_t<cache_size_stats_t> sizes_by_ext;
1438+
cache_io_stats_t overall_io;
1439+
cache_io_stats_t trans_io;
1440+
counter_by_src_t<counter_by_extent_t<cache_io_stats_t> >
1441+
trans_io_by_src_ext;
1442+
1443+
mutable cache_io_stats_t last_overall_io;
1444+
mutable cache_io_stats_t last_trans_io;
1445+
mutable counter_by_src_t<counter_by_extent_t<cache_io_stats_t> >
1446+
last_trans_io_by_src_ext;
1447+
14341448
CachedExtent::primary_ref_list lru;
14351449

1436-
void do_remove_from_lru(CachedExtent &extent) {
1450+
void do_remove_from_lru(
1451+
CachedExtent &extent,
1452+
const Transaction::src_t* p_src) {
14371453
assert(extent.is_stable_clean() && !extent.is_placeholder());
14381454
assert(extent.primary_ref_list_hook.is_linked());
14391455
assert(lru.size() > 0);
1440-
assert(current_size >= extent.get_length());
1456+
auto extent_length = extent.get_length();
1457+
assert(current_size >= extent_length);
14411458

14421459
lru.erase(lru.s_iterator_to(extent));
1443-
current_size -= extent.get_length();
1460+
current_size -= extent_length;
1461+
get_by_ext(sizes_by_ext, extent.get_type()).account_out(extent_length);
1462+
overall_io.account_out(extent_length);
1463+
if (p_src) {
1464+
trans_io.account_out(extent_length);
1465+
get_by_ext(
1466+
get_by_src(trans_io_by_src_ext, *p_src),
1467+
extent.get_type()).account_out(extent_length);
1468+
}
14441469
intrusive_ptr_release(&extent);
14451470
}
14461471

@@ -1459,32 +1484,48 @@ class Cache {
14591484
return lru.size();
14601485
}
14611486

1487+
void get_stats(
1488+
cache_stats_t &stats,
1489+
bool report_detail,
1490+
double seconds) const;
1491+
14621492
void remove_from_lru(CachedExtent &extent) {
14631493
assert(extent.is_stable_clean() && !extent.is_placeholder());
14641494

14651495
if (extent.primary_ref_list_hook.is_linked()) {
1466-
do_remove_from_lru(extent);
1496+
do_remove_from_lru(extent, nullptr);
14671497
}
14681498
}
14691499

1470-
void move_to_top(CachedExtent &extent) {
1500+
void move_to_top(
1501+
CachedExtent &extent,
1502+
const Transaction::src_t* p_src) {
14711503
assert(extent.is_stable_clean() && !extent.is_placeholder());
14721504

1505+
auto extent_length = extent.get_length();
14731506
if (extent.primary_ref_list_hook.is_linked()) {
14741507
// present, move to top (back)
14751508
assert(lru.size() > 0);
1476-
assert(current_size >= extent.get_length());
1509+
assert(current_size >= extent_length);
14771510
lru.erase(lru.s_iterator_to(extent));
14781511
lru.push_back(extent);
14791512
} else {
14801513
// absent, add to top (back)
1481-
current_size += extent.get_length();
1514+
current_size += extent_length;
1515+
get_by_ext(sizes_by_ext, extent.get_type()).account_in(extent_length);
1516+
overall_io.account_in(extent_length);
1517+
if (p_src) {
1518+
trans_io.account_in(extent_length);
1519+
get_by_ext(
1520+
get_by_src(trans_io_by_src_ext, *p_src),
1521+
extent.get_type()).account_in(extent_length);
1522+
}
14821523
intrusive_ptr_add_ref(&extent);
14831524
lru.push_back(extent);
14841525

14851526
// trim to capacity
14861527
while (current_size > capacity) {
1487-
do_remove_from_lru(lru.front());
1528+
do_remove_from_lru(lru.front(), p_src);
14881529
}
14891530
}
14901531
}
@@ -1493,7 +1534,7 @@ class Cache {
14931534
LOG_PREFIX(Cache::LRU::clear);
14941535
for (auto iter = lru.begin(); iter != lru.end();) {
14951536
SUBDEBUG(seastore_cache, "clearing {}", *iter);
1496-
do_remove_from_lru(*(iter++));
1537+
do_remove_from_lru(*(iter++), nullptr);
14971538
}
14981539
}
14991540

src/crimson/os/seastore/seastore.cc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ seastar::future<> SeaStore::report_stats()
590590
ceph_assert(seastar::this_shard_id() == primary_core);
591591
shard_device_stats.resize(seastar::smp::count);
592592
shard_io_stats.resize(seastar::smp::count);
593+
shard_cache_stats.resize(seastar::smp::count);
593594
return shard_stores.invoke_on_all([this](const Shard &local_store) {
594595
bool report_detail = false;
595596
double seconds = 0;
@@ -602,6 +603,8 @@ seastar::future<> SeaStore::report_stats()
602603
local_store.get_device_stats(report_detail, seconds);
603604
shard_io_stats[seastar::this_shard_id()] =
604605
local_store.get_io_stats(report_detail, seconds);
606+
shard_cache_stats[seastar::this_shard_id()] =
607+
local_store.get_cache_stats(report_detail, seconds);
605608
}).then([this] {
606609
LOG_PREFIX(SeaStore);
607610
auto now = seastar::lowres_clock::now();
@@ -697,6 +700,24 @@ seastar::future<> SeaStore::report_stats()
697700
<< ") ";
698701
}
699702
INFO("details: {}", oss_pending.str());
703+
704+
cache_stats_t cache_total = {};
705+
for (const auto& s : shard_cache_stats) {
706+
cache_total.add(s);
707+
}
708+
cache_size_stats_t lru_sizes_ps = cache_total.lru_sizes;
709+
lru_sizes_ps.size /= seastar::smp::count;
710+
lru_sizes_ps.num_extents /= seastar::smp::count;
711+
cache_io_stats_t lru_io_ps = cache_total.lru_io;
712+
lru_io_ps.in_size /= seastar::smp::count;
713+
lru_io_ps.in_num_extents /= seastar::smp::count;
714+
lru_io_ps.out_size /= seastar::smp::count;
715+
lru_io_ps.out_num_extents /= seastar::smp::count;
716+
INFO("cache lru: total{} {}; per-shard: total{} {}",
717+
cache_total.lru_sizes,
718+
cache_io_stats_printer_t{seconds, cache_total.lru_io},
719+
lru_sizes_ps,
720+
cache_io_stats_printer_t{seconds, lru_io_ps});
700721
return seastar::now();
701722
});
702723
}
@@ -2599,6 +2620,13 @@ shard_stats_t SeaStore::Shard::get_io_stats(
25992620
return ret;
26002621
}
26012622

2623+
cache_stats_t SeaStore::Shard::get_cache_stats(
2624+
bool report_detail, double seconds) const
2625+
{
2626+
return transaction_manager->get_cache_stats(
2627+
report_detail, seconds);
2628+
}
2629+
26022630
std::unique_ptr<SeaStore> make_seastore(
26032631
const std::string &device)
26042632
{

src/crimson/os/seastore/seastore.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ class SeaStore final : public FuturizedStore {
210210

211211
shard_stats_t get_io_stats(bool report_detail, double seconds) const;
212212

213+
cache_stats_t get_cache_stats(bool report_detail, double seconds) const;
214+
213215
private:
214216
struct internal_context_t {
215217
CollectionRef ch;
@@ -585,6 +587,7 @@ class SeaStore final : public FuturizedStore {
585587
seastar::lowres_clock::time_point::min();
586588
mutable std::vector<device_stats_t> shard_device_stats;
587589
mutable std::vector<shard_stats_t> shard_io_stats;
590+
mutable std::vector<cache_stats_t> shard_cache_stats;
588591
};
589592

590593
std::unique_ptr<SeaStore> make_seastore(

src/crimson/os/seastore/seastore_types.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,4 +980,36 @@ std::ostream& operator<<(std::ostream& out, const writer_stats_printer_t& p)
980980
return out;
981981
}
982982

983+
std::ostream& operator<<(std::ostream& out, const cache_io_stats_printer_t& p)
984+
{
985+
constexpr const char* dfmt = "{:.2f}";
986+
out << "in("
987+
<< fmt::format(dfmt, p.stats.get_in_mbs(p.seconds))
988+
<< "MiB/s,"
989+
<< fmt::format(dfmt, p.stats.get_in_avg_kb())
990+
<< "KiB,"
991+
<< fmt::format(dfmt, p.stats.in_num_extents/p.seconds)
992+
<< "ps) out("
993+
<< fmt::format(dfmt, p.stats.get_out_mbs(p.seconds))
994+
<< "MiB/s,"
995+
<< fmt::format(dfmt, p.stats.get_out_avg_kb())
996+
<< "KiB,"
997+
<< fmt::format(dfmt, p.stats.out_num_extents/p.seconds)
998+
<< "ps)";
999+
return out;
1000+
}
1001+
1002+
std::ostream& operator<<(std::ostream& out, const cache_size_stats_t& p)
1003+
{
1004+
constexpr const char* dfmt = "{:.2f}";
1005+
out << "("
1006+
<< fmt::format(dfmt, p.get_mb())
1007+
<< "MiB,"
1008+
<< fmt::format(dfmt, p.get_avg_kb())
1009+
<< "KiB,"
1010+
<< p.num_extents
1011+
<< ")";
1012+
return out;
9831013
}
1014+
1015+
} // namespace crimson::os::seastore

0 commit comments

Comments
 (0)