steadystate: add line for output-format=normal
authorVincent Fu <Vincent.Fu@sandisk.com>
Wed, 23 Nov 2016 16:06:00 +0000 (11:06 -0500)
committerVincent Fu <Vincent.Fu@sandisk.com>
Wed, 7 Dec 2016 21:01:19 +0000 (16:01 -0500)
Output contains whether steady state was attained, mean bw & iops, and value of steady state criterion

TODO
stat.c
steadystate.c
steadystate.h

diff --git a/TODO b/TODO
index b6f7e79..5a8d71d 100644 (file)
--- a/TODO
+++ b/TODO
@@ -2,8 +2,6 @@ Known issues/TODO (for steady-state)
 
 - Does not work over a network connection
 
-- Add output for --output-format=normal
-
 - Allow user to specify the frequency of measurements
 
 - Better documentation for output
diff --git a/stat.c b/stat.c
index a42ee9b..d635f0a 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -657,6 +657,34 @@ static void show_block_infos(int nr_block_infos, uint32_t *block_infos,
                         i == BLOCK_STATE_COUNT - 1 ? '\n' : ',');
 }
 
+static void show_ss_normal(struct thread_stat *ts, struct buf_output *out)
+{
+       char *p1, *p2;
+       struct steadystate_data *ss = ts->ss;
+       unsigned long long bw_mean, iops_mean;
+       const int i2p = is_power_of_2(ts->kb_base);
+
+       if (!ss->state)
+               return;
+
+       bw_mean = steadystate_bw_mean(ss);
+       iops_mean = steadystate_iops_mean(ss);
+
+       p1 = num2str(bw_mean / ts->kb_base, 6, ts->kb_base, i2p, ts->unit_base);
+       p2 = num2str(iops_mean, 6, 1, 0, 0);
+
+       log_buf(out, "  steadystate  : attained=%s, bw=%s/s, iops=%s, %s%s=%.3f%s\n",
+               ss->state & __FIO_SS_ATTAINED ? "yes" : "no",
+               p1, p2,
+               ss->state & __FIO_SS_IOPS ? "iops" : "bw",
+               ss->state & __FIO_SS_SLOPE ? " slope": " mean dev",
+               ss->criterion,
+               ss->state & __FIO_SS_PCT ? "%" : "");
+
+       free(p1);
+       free(p2);
+}
+
 static void show_thread_status_normal(struct thread_stat *ts,
                                      struct group_run_stats *rs,
                                      struct buf_output *out)
@@ -761,6 +789,9 @@ static void show_thread_status_normal(struct thread_stat *ts,
        if (ts->nr_block_infos)
                show_block_infos(ts->nr_block_infos, ts->block_infos,
                                  ts->percentile_list, out);
+
+       if (ts->ss)
+               show_ss_normal(ts, out);
 }
 
 static void show_ddir_status_terse(struct thread_stat *ts,
@@ -1255,13 +1286,10 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                }
        }
 
-       /* steady state detection; move this behind json+? */
        if (ts->ss) {
                struct json_object *data;
                struct json_array *iops, *bw;
                struct steadystate_data *ss = ts->ss;
-               unsigned long long sum_iops, sum_bw;
-               double mean_iops, mean_bw;
                int i, j, k;
                char ss_buf[64];
 
@@ -1299,17 +1327,13 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                        j = ss->head;
                else
                        j = ss->head == 0 ? ss->dur - 1 : ss->head - 1;
-               for (i = 0, sum_iops = 0, sum_bw = 0; i < ss->dur; i++) {
+               for (i = 0; i < ss->dur; i++) {
                        k = (j + i) % ss->dur;
-                       sum_bw += ss->bw_data[k];
-                       sum_iops += ss->iops_data[k];
                        json_array_add_value_int(bw, ss->bw_data[k]);
                        json_array_add_value_int(iops, ss->iops_data[k]);
                }
-               mean_bw = (double) sum_bw / ss->dur;
-               mean_iops = (double) sum_iops / ss->dur;
-               json_object_add_value_float(data, "bw_mean", mean_bw);
-               json_object_add_value_float(data, "iops_mean", mean_iops);
+               json_object_add_value_int(data, "bw_mean", steadystate_bw_mean(ss));
+               json_object_add_value_int(data, "iops_mean", steadystate_iops_mean(ss));
                json_object_add_value_array(data, "iops", iops);
                json_object_add_value_array(data, "bw", bw);
        }
index 696ad16..3468428 100644 (file)
@@ -38,6 +38,7 @@ void steadystate_setup(void)
 
                if (!td->o.group_reporting) {
                        steadystate_alloc(td);
+                       td->ss.state |= __FIO_SS_DATA;
                        continue;
                }
 
@@ -341,3 +342,25 @@ int td_steadystate_init(struct thread_data *td)
 
        return 0;
 }
+
+unsigned long long steadystate_bw_mean(struct steadystate_data *ss)
+{
+       int i;
+       unsigned long long sum;
+
+       for (i = 0, sum = 0; i < ss->dur; i++)
+               sum += ss->bw_data[i];
+
+       return sum / ss->dur;
+}
+
+unsigned long long steadystate_iops_mean(struct steadystate_data *ss)
+{
+       int i;
+       unsigned long long sum;
+
+       for (i = 0, sum = 0; i < ss->dur; i++)
+               sum += ss->iops_data[i];
+
+       return sum / ss->dur;
+}
index a23c45b..441817a 100644 (file)
@@ -6,6 +6,8 @@
 extern void steadystate_check(void);
 extern void steadystate_setup(void);
 extern int td_steadystate_init(struct thread_data *);
+extern unsigned long long steadystate_bw_mean(struct steadystate_data *);
+extern unsigned long long steadystate_iops_mean(struct steadystate_data *);
 
 extern bool steadystate_enabled;