From b18f4c129dde9783be64d699e2f261bb6729f732 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Thu, 5 May 2016 17:17:04 +0200 Subject: [PATCH] Better max estimate for line graphs Use maximum of rolling average as the upper range end for the line graph to use better the available space in the plot. Signed-off-by: Jan Kara Signed-off-by: Jens Axboe --- iowatcher/main.c | 33 +++++++++++++++++++-------------- iowatcher/plot.c | 28 ++++++++++++++++++++++++---- iowatcher/plot.h | 1 + 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/iowatcher/main.c b/iowatcher/main.c index 2797afb..cbe9155 100644 --- a/iowatcher/main.c +++ b/iowatcher/main.c @@ -774,7 +774,7 @@ static void plot_tput(struct plot *plot, unsigned int min_seconds, struct trace_file *tf; char *units; char line[128]; - u64 max = 0; + u64 max = 0, val; if (active_graphs[TPUT_GRAPH_INDEX] == 0) return; @@ -783,10 +783,12 @@ static void plot_tput(struct plot *plot, unsigned int min_seconds, svg_alloc_legend(plot, num_traces * 2); list_for_each_entry(tf, &all_traces, list) { - if (tf->tput_writes_gld->max > max) - max = tf->tput_writes_gld->max; - if (tf->tput_reads_gld->max > max) - max = tf->tput_reads_gld->max; + val = line_graph_roll_avg_max(tf->tput_writes_gld); + if (val > max) + max = val; + val = line_graph_roll_avg_max(tf->tput_reads_gld); + if (val > max) + max = val; } list_for_each_entry(tf, &all_traces, list) { if (tf->tput_writes_gld->max > 0) @@ -835,7 +837,7 @@ static void plot_fio_tput(struct plot *plot, struct trace_file *tf; char *units; char line[128]; - u64 max = 0; + u64 max = 0, val; if (num_fio_traces == 0 || active_graphs[FIO_GRAPH_INDEX] == 0) return; @@ -844,8 +846,9 @@ static void plot_fio_tput(struct plot *plot, svg_alloc_legend(plot, num_fio_traces); list_for_each_entry(tf, &fio_traces, list) { - if (tf->fio_gld->max > max) - max = tf->fio_gld->max; + val = line_graph_roll_avg_max(tf->fio_gld); + if (val > max) + max = val; } list_for_each_entry(tf, &fio_traces, list) { @@ -1190,7 +1193,7 @@ static void plot_latency(struct plot *plot, unsigned int min_seconds, struct trace_file *tf; char *units; char line[128]; - u64 max = 0; + u64 max = 0, val; if (active_graphs[LATENCY_GRAPH_INDEX] == 0) return; @@ -1199,8 +1202,9 @@ static void plot_latency(struct plot *plot, unsigned int min_seconds, svg_alloc_legend(plot, num_traces); list_for_each_entry(tf, &all_traces, list) { - if (tf->latency_gld->max > max) - max = tf->latency_gld->max; + val = line_graph_roll_avg_max(tf->latency_gld); + if (val > max) + max = val; } list_for_each_entry(tf, &all_traces, list) @@ -1236,14 +1240,15 @@ static void plot_iops(struct plot *plot, unsigned int min_seconds, { struct trace_file *tf; char *units; - u64 max = 0; + u64 max = 0, val; if (active_graphs[IOPS_GRAPH_INDEX] == 0) return; list_for_each_entry(tf, &all_traces, list) { - if (tf->iop_gld->max > max) - max = tf->iop_gld->max; + val = line_graph_roll_avg_max(tf->iop_gld); + if (val > max) + max = val; } list_for_each_entry(tf, &all_traces, list) diff --git a/iowatcher/plot.c b/iowatcher/plot.c index 012d4f9..372406b 100644 --- a/iowatcher/plot.c +++ b/iowatcher/plot.c @@ -759,6 +759,29 @@ void scale_line_graph_time(u64 *max, char **units) *max /= div; } +static int rolling_span(struct graph_line_data *gld) +{ + if (rolling_avg_secs) + return rolling_avg_secs; + return (gld->stop_seconds - gld->min_seconds) / 25; +} + + +double line_graph_roll_avg_max(struct graph_line_data *gld) +{ + unsigned int i; + int rolling; + double avg, max = 0; + + rolling = rolling_span(gld); + for (i = gld->min_seconds; i < gld->stop_seconds; i++) { + avg = rolling_avg(gld->data, i, rolling); + if (avg > max) + max = avg; + } + return max; +} + int svg_line_graph(struct plot *plot, struct graph_line_data *gld, char *color, int thresh1, int thresh2) { unsigned int i; @@ -776,10 +799,8 @@ int svg_line_graph(struct plot *plot, struct graph_line_data *gld, char *color, if (thresh1 && thresh2) rolling = 0; - else if (rolling_avg_secs) - rolling = rolling_avg_secs; else - rolling = (gld->stop_seconds - gld->min_seconds) / 25; + rolling = rolling_span(gld); for (i = gld->min_seconds; i < gld->stop_seconds; i++) { avg = rolling_avg(gld->data, i, rolling); @@ -795,7 +816,6 @@ int svg_line_graph(struct plot *plot, struct graph_line_data *gld, char *color, x = (double)(i - gld->min_seconds) / xscale; if (!thresh1 && !thresh2) { - if (!printed_header) { write_check(fd, start, strlen(start)); printed_header = 1; diff --git a/iowatcher/plot.h b/iowatcher/plot.h index 7e87b1d..d65bbcf 100644 --- a/iowatcher/plot.h +++ b/iowatcher/plot.h @@ -137,6 +137,7 @@ char *pick_fio_color(void); char *pick_cpu_color(void); void reset_cpu_color(void); int svg_io_graph(struct plot *plot, struct graph_dot_data *gdd); +double line_graph_roll_avg_max(struct graph_line_data *gld); int svg_line_graph(struct plot *plot, struct graph_line_data *gld, char *color, int thresh1, int thresh2); struct graph_line_data *alloc_line_data(unsigned int min_seconds, unsigned int max_seconds, unsigned int stop_seconds); struct graph_dot_data *alloc_dot_data(unsigned int min_seconds, unsigned int max_seconds, u64 min_offset, u64 max_offset, unsigned int stop_seconds, char *color, char *label); -- 2.25.1