summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kara <jack@suse.com>2016-05-05 17:17:04 +0200
committerJens Axboe <axboe@fb.com>2016-05-05 09:20:18 -0600
commitb18f4c129dde9783be64d699e2f261bb6729f732 (patch)
treea7e2d779b76eeface3ffb10efbeb4c29860ecbaa
parentd1422556dbff03e982aeb2faf5893b4363621bee (diff)
downloadblktrace-b18f4c129dde9783be64d699e2f261bb6729f732.tar.gz
blktrace-b18f4c129dde9783be64d699e2f261bb6729f732.tar.bz2
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 <jack@suse.com> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--iowatcher/main.c33
-rw-r--r--iowatcher/plot.c28
-rw-r--r--iowatcher/plot.h1
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);