From 5360a708533f9e4404b951a2551cc1b36a0b34f2 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Mon, 17 Jun 2024 02:33:05 +0300 Subject: [PATCH] Make OSD also report derived stats --- src/osd/osd.h | 4 +++- src/osd/osd_cluster.cpp | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/osd/osd.h b/src/osd/osd.h index 208a2042..c1833c25 100644 --- a/src/osd/osd.h +++ b/src/osd/osd.h @@ -199,12 +199,14 @@ class osd_t ring_consumer_t consumer; // op statistics - osd_op_stats_t prev_stats; + osd_op_stats_t prev_stats, prev_report_stats; + timespec report_stats_ts; std::map inode_stats; std::map vanishing_inodes; const char* recovery_stat_names[2] = { "degraded", "misplaced" }; recovery_stat_t recovery_stat[2]; recovery_stat_t recovery_print_prev[2]; + recovery_stat_t recovery_report_prev[2]; // recovery auto-tuning int rtune_timer_id = -1; diff --git a/src/osd/osd_cluster.cpp b/src/osd/osd_cluster.cpp index 5cae1d5a..d75b0bb5 100644 --- a/src/osd/osd_cluster.cpp +++ b/src/osd/osd_cluster.cpp @@ -180,6 +180,12 @@ json11::Json osd_t::get_statistics() json11::Json::object st; timespec ts; clock_gettime(CLOCK_REALTIME, &ts); + uint64_t ts_diff = 0; + if (report_stats_ts.tv_sec != 0) + ts_diff = (ts.tv_sec - report_stats_ts.tv_sec + (ts.tv_nsec - report_stats_ts.tv_nsec) / 1000000000); + if (!ts_diff) + ts_diff = 1; + report_stats_ts = ts; char time_str[50] = { 0 }; sprintf(time_str, "%jd.%03ld", (uint64_t)ts.tv_sec, ts.tv_nsec/1000000); st["time"] = time_str; @@ -196,33 +202,50 @@ json11::Json osd_t::get_statistics() json11::Json::object op_stats, subop_stats; for (int i = OSD_OP_MIN; i <= OSD_OP_MAX; i++) { + auto n = (msgr.stats.op_stat_count[i] - prev_report_stats.op_stat_count[i]); op_stats[osd_op_names[i]] = json11::Json::object { { "count", msgr.stats.op_stat_count[i] }, { "usec", msgr.stats.op_stat_sum[i] }, { "bytes", msgr.stats.op_stat_bytes[i] }, + { "lat", (msgr.stats.op_stat_sum[i] - prev_report_stats.op_stat_sum[i]) / (n < 1 ? 1 : n) }, + { "bps", (msgr.stats.op_stat_bytes[i] - prev_report_stats.op_stat_bytes[i]) / ts_diff }, + { "iops", n / ts_diff }, }; } for (int i = OSD_OP_MIN; i <= OSD_OP_MAX; i++) { + auto n = (msgr.stats.subop_stat_count[i] - prev_report_stats.subop_stat_count[i]); subop_stats[osd_op_names[i]] = json11::Json::object { { "count", msgr.stats.subop_stat_count[i] }, { "usec", msgr.stats.subop_stat_sum[i] }, + { "lat", (msgr.stats.subop_stat_sum[i] - prev_report_stats.subop_stat_sum[i]) / (n < 1 ? 1 : n) }, + { "iops", n / ts_diff }, }; } st["op_stats"] = op_stats; st["subop_stats"] = subop_stats; + auto n0 = recovery_stat[0].count - recovery_report_prev[0].count; + auto n1 = recovery_stat[1].count - recovery_report_prev[1].count; st["recovery_stats"] = json11::Json::object { { recovery_stat_names[0], json11::Json::object { { "count", recovery_stat[0].count }, { "bytes", recovery_stat[0].bytes }, { "usec", recovery_stat[0].usec }, + { "lat", (recovery_stat[0].usec - recovery_report_prev[0].usec) / (n0 < 1 ? 1 : n0) }, + { "bps", (recovery_stat[0].bytes - recovery_report_prev[0].bytes) / ts_diff }, + { "iops", n0 / ts_diff }, } }, { recovery_stat_names[1], json11::Json::object { { "count", recovery_stat[1].count }, { "bytes", recovery_stat[1].bytes }, { "usec", recovery_stat[1].usec }, + { "lat", (recovery_stat[1].usec - recovery_report_prev[1].usec) / (n1 < 1 ? 1 : n1) }, + { "bps", (recovery_stat[1].bytes - recovery_report_prev[1].bytes) / ts_diff }, + { "iops", n1 / ts_diff }, } }, }; + prev_report_stats = msgr.stats; + memcpy(recovery_report_prev, recovery_stat, sizeof(recovery_stat)); return st; }