Better max estimate for line graphs
authorJan Kara <jack@suse.com>
Thu, 5 May 2016 15:17:04 +0000 (17:17 +0200)
committerJens Axboe <axboe@fb.com>
Thu, 5 May 2016 15:20:18 +0000 (09:20 -0600)
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 <jack@suse.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
iowatcher/main.c
iowatcher/plot.c
iowatcher/plot.h

index 2797afb918665367d0d1cd295e92eef34979ef85..cbe915571c0e8f3c7d28db2ce44940f57ae101c9 100644 (file)
@@ -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)
index 012d4f97e6358c07ea4941b57676d1170b047e3f..372406b47569c42f8e0e7f2e7ace07eb1c7d6a48 100644 (file)
@@ -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;
index 7e87b1d134db3a8c364bcf095f66b377a66d903f..d65bbcf3396e02064d28495cb28547556dca005d 100644 (file)
@@ -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);