diff options
-rw-r--r-- | xlators/debug/io-stats/src/io-stats.c | 77 |
1 files changed, 74 insertions, 3 deletions
diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c index 988182acb63..9033d724dc2 100644 --- a/xlators/debug/io-stats/src/io-stats.c +++ b/xlators/debug/io-stats/src/io-stats.c @@ -37,6 +37,7 @@ #include "defaults.h" #include "logging.h" #include "cli1-xdr.h" +#include "statedump.h" #define MAX_LIST_MEMBERS 100 @@ -86,9 +87,10 @@ struct ios_stat_head { }; struct ios_lat { - double min; - double max; - double avg; + double min; + double max; + double avg; + uint64_t total; }; struct ios_global_stats { @@ -1052,6 +1054,8 @@ update_ios_latency_stats (struct ios_global_stats *stats, double elapsed, GF_ASSERT (stats); + stats->latency[op].total += elapsed; + if (!stats->latency[op].min) stats->latency[op].min = elapsed; if (stats->latency[op].min > elapsed) @@ -2661,6 +2665,69 @@ io_stats_clear (struct ios_conf *conf) return ret; } +int32_t +io_priv (xlator_t *this) +{ + int i; + char key[GF_DUMP_MAX_BUF_LEN]; + char key_prefix_cumulative[GF_DUMP_MAX_BUF_LEN]; + char key_prefix_incremental[GF_DUMP_MAX_BUF_LEN]; + double min, max, avg; + uint64_t count, total; + struct ios_conf *conf = NULL; + + conf = this->private; + if (!conf) + return -1; + + if(!conf->count_fop_hits || !conf->measure_latency) + return -1; + + gf_proc_dump_write("cumulative.data_read", "%"PRIu64, + conf->cumulative.data_read); + gf_proc_dump_write("cumulative.data_written", "%"PRIu64, + conf->cumulative.data_written); + + gf_proc_dump_write("incremental.data_read", "%"PRIu64, + conf->incremental.data_read); + gf_proc_dump_write("incremental.data_written", "%"PRIu64, + conf->incremental.data_written); + + snprintf (key_prefix_cumulative, GF_DUMP_MAX_BUF_LEN, "%s.cumulative", + this->name); + snprintf (key_prefix_incremental, GF_DUMP_MAX_BUF_LEN, "%s.incremental", + this->name); + + for (i = 0; i < GF_FOP_MAXVALUE; i++) { + count = conf->cumulative.fop_hits[i]; + total = conf->cumulative.latency[i].total; + min = conf->cumulative.latency[i].min; + max = conf->cumulative.latency[i].max; + avg = conf->cumulative.latency[i].avg; + + gf_proc_dump_build_key (key, key_prefix_cumulative, + (char *)gf_fop_list[i]); + + gf_proc_dump_write (key,"%"PRId64",%"PRId64",%.03f,%.03f,%.03f", + count, total, min, max, avg); + + count = conf->incremental.fop_hits[i]; + total = conf->incremental.latency[i].total; + min = conf->incremental.latency[i].min; + max = conf->incremental.latency[i].max; + avg = conf->incremental.latency[i].avg; + + gf_proc_dump_build_key (key, key_prefix_incremental, + (char *)gf_fop_list[i]); + + gf_proc_dump_write (key,"%"PRId64",%"PRId64",%.03f,%.03f,%.03f", + count, total, min, max, avg); + + } + + return 0; +} + int reconfigure (xlator_t *this, dict_t *options) { @@ -2993,6 +3060,10 @@ out: return ret; } +struct xlator_dumpops dumpops = { + .priv = io_priv +}; + struct xlator_fops fops = { .stat = io_stats_stat, .readlink = io_stats_readlink, |