@@ -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)
@@ -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;
@@ -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);