diff mbox

[1/9] Better max estimate for line graphs

Message ID 1462461432-1900-2-git-send-email-jack@suse.cz (mailing list archive)
State New, archived
Headers show

Commit Message

Jan Kara May 5, 2016, 3:17 p.m. UTC
From: Jan Kara <jack@suse.com>

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>
---
 iowatcher/main.c | 33 +++++++++++++++++++--------------
 iowatcher/plot.c | 28 ++++++++++++++++++++++++----
 iowatcher/plot.h |  1 +
 3 files changed, 44 insertions(+), 18 deletions(-)
diff mbox

Patch

diff --git a/iowatcher/main.c b/iowatcher/main.c
index 2797afb91866..cbe915571c0e 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 012d4f97e635..372406b47569 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 7e87b1d134db..d65bbcf3396e 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);