@@ -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+
24842574std::unique_ptr<SeaStore> make_seastore (
24852575 const std::string &device)
24862576{
0 commit comments