Skip to content

Commit f6877e9

Browse files
committed
crimson/os/seastar: report transaction iops/conflicts/outstanding
Also report details in shard 0. Signed-off-by: Yingxin Cheng <[email protected]>
1 parent a2c657d commit f6877e9

File tree

3 files changed

+164
-9
lines changed

3 files changed

+164
-9
lines changed

src/crimson/os/seastore/seastore.cc

Lines changed: 99 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,7 @@ seastar::future<> SeaStore::report_stats()
589589
{
590590
ceph_assert(seastar::this_shard_id() == primary_core);
591591
shard_device_stats.resize(seastar::smp::count);
592+
shard_io_stats.resize(seastar::smp::count);
592593
return shard_stores.invoke_on_all([this](const Shard &local_store) {
593594
bool report_detail = false;
594595
if (seastar::this_shard_id() == 0) {
@@ -597,6 +598,8 @@ seastar::future<> SeaStore::report_stats()
597598
}
598599
shard_device_stats[seastar::this_shard_id()] =
599600
local_store.get_device_stats(report_detail);
601+
shard_io_stats[seastar::this_shard_id()] =
602+
local_store.get_io_stats(report_detail);
600603
}).then([this] {
601604
LOG_PREFIX(SeaStore);
602605
auto now = seastar::lowres_clock::now();
@@ -607,27 +610,28 @@ seastar::future<> SeaStore::report_stats()
607610
std::chrono::duration<double> duration_d = now - last_tp;
608611
double seconds = duration_d.count();
609612
last_tp = now;
610-
device_stats_t ts = {};
613+
614+
device_stats_t device_total = {};
611615
for (const auto &s : shard_device_stats) {
612-
ts.add(s);
616+
device_total.add(s);
613617
}
614618
constexpr const char* dfmt = "{:.2f}";
615-
auto d_ts_num_io = static_cast<double>(ts.num_io);
619+
auto device_total_num_io = static_cast<double>(device_total.num_io);
616620

617621
std::ostringstream oss_iops;
618-
auto iops = ts.num_io/seconds;
622+
auto iops = device_total.num_io/seconds;
619623
oss_iops << "device IOPS: "
620624
<< fmt::format(dfmt, iops)
621625
<< " "
622-
<< fmt::format(dfmt, iops/shard_device_stats.size())
626+
<< fmt::format(dfmt, iops/seastar::smp::count)
623627
<< "(";
624628

625629
std::ostringstream oss_bd;
626-
auto bd_mb = ts.total_bytes/seconds/(1<<20);
630+
auto bd_mb = device_total.total_bytes/seconds/(1<<20);
627631
oss_bd << "device bandwidth(MiB): "
628632
<< fmt::format(dfmt, bd_mb)
629633
<< " "
630-
<< fmt::format(dfmt, bd_mb/shard_device_stats.size())
634+
<< fmt::format(dfmt, bd_mb/seastar::smp::count)
631635
<< "(";
632636

633637
for (const auto &s : shard_device_stats) {
@@ -639,8 +643,40 @@ seastar::future<> SeaStore::report_stats()
639643

640644
INFO("{}", oss_iops.str());
641645
INFO("{}", oss_bd.str());
642-
INFO("device IO depth per writer: {:.2f}", ts.total_depth/d_ts_num_io);
643-
INFO("device bytes per write: {:.2f}", ts.total_bytes/d_ts_num_io);
646+
INFO("device IO depth per writer: {:.2f}",
647+
device_total.total_depth/device_total_num_io);
648+
INFO("device bytes per write: {:.2f}",
649+
device_total.total_bytes/device_total_num_io);
650+
651+
shard_stats_t io_total = {};
652+
for (const auto &s : shard_io_stats) {
653+
io_total.add(s);
654+
}
655+
INFO("trans IOPS: {:.2f},{:.2f},{:.2f},{:.2f} per-shard: {:.2f},{:.2f},{:.2f},{:.2f}",
656+
io_total.io_num/seconds,
657+
io_total.read_num/seconds,
658+
io_total.get_bg_num()/seconds,
659+
io_total.flush_num/seconds,
660+
io_total.io_num/seconds/seastar::smp::count,
661+
io_total.read_num/seconds/seastar::smp::count,
662+
io_total.get_bg_num()/seconds/seastar::smp::count,
663+
io_total.flush_num/seconds/seastar::smp::count);
664+
auto calc_conflicts = [](uint64_t ios, uint64_t repeats) {
665+
return (double)(repeats-ios)/ios;
666+
};
667+
INFO("trans conflicts: {:.2f},{:.2f},{:.2f}",
668+
calc_conflicts(io_total.io_num, io_total.repeat_io_num),
669+
calc_conflicts(io_total.read_num, io_total.repeat_read_num),
670+
calc_conflicts(io_total.get_bg_num(), io_total.get_repeat_bg_num()));
671+
INFO("trans outstanding: {},{},{},{} per-shard: {:.2f},{:.2f},{:.2f},{:.2f}",
672+
io_total.pending_io_num,
673+
io_total.pending_read_num,
674+
io_total.pending_bg_num,
675+
io_total.pending_flush_num,
676+
(double)io_total.pending_io_num/seastar::smp::count,
677+
(double)io_total.pending_read_num/seastar::smp::count,
678+
(double)io_total.pending_bg_num/seastar::smp::count,
679+
(double)io_total.pending_flush_num/seastar::smp::count);
644680
return seastar::now();
645681
});
646682
}
@@ -2481,6 +2517,60 @@ device_stats_t SeaStore::Shard::get_device_stats(bool report_detail) const
24812517
return transaction_manager->get_device_stats(report_detail);
24822518
}
24832519

2520+
shard_stats_t SeaStore::Shard::get_io_stats(bool report_detail) const
2521+
{
2522+
auto now = seastar::lowres_clock::now();
2523+
if (last_tp == seastar::lowres_clock::time_point::min()) {
2524+
last_tp = now;
2525+
last_shard_stats = shard_stats;
2526+
return {};
2527+
}
2528+
std::chrono::duration<double> duration_d = now - last_tp;
2529+
double seconds = duration_d.count();
2530+
last_tp = now;
2531+
2532+
shard_stats_t ret = shard_stats;
2533+
ret.minus(last_shard_stats);
2534+
last_shard_stats = shard_stats;
2535+
if (report_detail) {
2536+
LOG_PREFIX(SeaStore::get_io_stats);
2537+
auto calc_conflicts = [](uint64_t ios, uint64_t repeats) {
2538+
return (double)(repeats-ios)/ios;
2539+
};
2540+
INFO("iops={:.2f},{:.2f},{:.2f}({:.2f},{:.2f},{:.2f},{:.2f}),{:.2f} "
2541+
"conflicts={:.2f},{:.2f},{:.2f}({:.2f},{:.2f},{:.2f},{:.2f}) "
2542+
"outstanding={}({},{},{},{},{}),{},{},{}",
2543+
// iops
2544+
ret.io_num/seconds,
2545+
ret.read_num/seconds,
2546+
ret.get_bg_num()/seconds,
2547+
ret.trim_alloc_num/seconds,
2548+
ret.trim_dirty_num/seconds,
2549+
ret.cleaner_main_num/seconds,
2550+
ret.cleaner_cold_num/seconds,
2551+
ret.flush_num/seconds,
2552+
// conflicts
2553+
calc_conflicts(ret.io_num, ret.repeat_io_num),
2554+
calc_conflicts(ret.read_num, ret.repeat_read_num),
2555+
calc_conflicts(ret.get_bg_num(), ret.get_repeat_bg_num()),
2556+
calc_conflicts(ret.trim_alloc_num, ret.repeat_trim_alloc_num),
2557+
calc_conflicts(ret.trim_dirty_num, ret.repeat_trim_dirty_num),
2558+
calc_conflicts(ret.cleaner_main_num, ret.repeat_cleaner_main_num),
2559+
calc_conflicts(ret.cleaner_cold_num, ret.repeat_cleaner_cold_num),
2560+
// outstanding
2561+
ret.pending_io_num,
2562+
ret.starting_io_num,
2563+
ret.waiting_collock_io_num,
2564+
ret.waiting_throttler_io_num,
2565+
ret.processing_inlock_io_num,
2566+
ret.processing_postlock_io_num,
2567+
ret.pending_read_num,
2568+
ret.pending_bg_num,
2569+
ret.pending_flush_num);
2570+
}
2571+
return ret;
2572+
}
2573+
24842574
std::unique_ptr<SeaStore> make_seastore(
24852575
const std::string &device)
24862576
{

src/crimson/os/seastore/seastore.h

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

207207
device_stats_t get_device_stats(bool report_detail) const;
208208

209+
shard_stats_t get_io_stats(bool report_detail) const;
210+
209211
private:
210212
struct internal_context_t {
211213
CollectionRef ch;
@@ -501,6 +503,9 @@ class SeaStore final : public FuturizedStore {
501503
void register_metrics();
502504

503505
mutable shard_stats_t shard_stats;
506+
mutable seastar::lowres_clock::time_point last_tp =
507+
seastar::lowres_clock::time_point::min();
508+
mutable shard_stats_t last_shard_stats;
504509
};
505510

506511
public:
@@ -577,6 +582,7 @@ class SeaStore final : public FuturizedStore {
577582
mutable seastar::lowres_clock::time_point last_tp =
578583
seastar::lowres_clock::time_point::min();
579584
mutable std::vector<device_stats_t> shard_device_stats;
585+
mutable std::vector<shard_stats_t> shard_io_stats;
580586
};
581587

582588
std::unique_ptr<SeaStore> make_seastore(

src/crimson/os/seastore/seastore_types.h

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2396,6 +2396,65 @@ struct shard_stats_t {
23962396

23972397
uint64_t flush_num = 0;
23982398
uint64_t pending_flush_num = 0;
2399+
2400+
uint64_t get_bg_num() const {
2401+
return trim_alloc_num +
2402+
trim_dirty_num +
2403+
cleaner_main_num +
2404+
cleaner_cold_num;
2405+
}
2406+
2407+
uint64_t get_repeat_bg_num() const {
2408+
return repeat_trim_alloc_num +
2409+
repeat_trim_dirty_num +
2410+
repeat_cleaner_main_num +
2411+
repeat_cleaner_cold_num;
2412+
}
2413+
2414+
void add(const shard_stats_t &o) {
2415+
io_num += o.io_num;
2416+
repeat_io_num += o.repeat_io_num;
2417+
pending_io_num += o.pending_io_num;
2418+
starting_io_num += o.starting_io_num;
2419+
waiting_collock_io_num += o.waiting_collock_io_num;
2420+
waiting_throttler_io_num += o.waiting_throttler_io_num;
2421+
processing_inlock_io_num += o.processing_inlock_io_num;
2422+
processing_postlock_io_num += o.processing_postlock_io_num;
2423+
2424+
read_num += o.read_num;
2425+
repeat_read_num += o.repeat_read_num;
2426+
pending_read_num += o.pending_read_num;
2427+
2428+
pending_bg_num += o.pending_bg_num;
2429+
trim_alloc_num += o.trim_alloc_num;
2430+
repeat_trim_alloc_num += o.repeat_trim_alloc_num;
2431+
trim_dirty_num += o.trim_dirty_num;
2432+
repeat_trim_dirty_num += o.repeat_trim_dirty_num;
2433+
cleaner_main_num += o.cleaner_main_num;
2434+
repeat_cleaner_main_num += o.repeat_cleaner_main_num;
2435+
cleaner_cold_num += o.cleaner_cold_num;
2436+
repeat_cleaner_cold_num += o.repeat_cleaner_cold_num;
2437+
2438+
flush_num += o.flush_num;
2439+
pending_flush_num += o.pending_flush_num;
2440+
}
2441+
2442+
void minus(const shard_stats_t &o) {
2443+
// realtime(e.g. pending) stats are not related
2444+
io_num -= o.io_num;
2445+
repeat_io_num -= o.repeat_io_num;
2446+
read_num -= o.read_num;
2447+
repeat_read_num -= o.repeat_read_num;
2448+
trim_alloc_num -= o.trim_alloc_num;
2449+
repeat_trim_alloc_num -= o.repeat_trim_alloc_num;
2450+
trim_dirty_num -= o.trim_dirty_num;
2451+
repeat_trim_dirty_num -= o.repeat_trim_dirty_num;
2452+
cleaner_main_num -= o.cleaner_main_num;
2453+
repeat_cleaner_main_num -= o.repeat_cleaner_main_num;
2454+
cleaner_cold_num -= o.cleaner_cold_num;
2455+
repeat_cleaner_cold_num -= o.repeat_cleaner_cold_num;
2456+
flush_num -= o.flush_num;
2457+
}
23992458
};
24002459

24012460
}

0 commit comments

Comments
 (0)