X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=stat.c;h=4bfacf71dc7dcce0dc48bb2ba39c33475aadaa7c;hp=96af94ba683deb5b4de2420e7fd04cf10e7b7d88;hb=412c7d91f9bac0b5e857a0daa4233d0ff5e01154;hpb=3c746856fd63f3f7624a34ea70e226a290d9cc01 diff --git a/stat.c b/stat.c index 96af94ba..4bfacf71 100644 --- a/stat.c +++ b/stat.c @@ -1255,6 +1255,64 @@ 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]; + + snprintf(ss_buf, sizeof(ss_buf), "%s%s:%f%s", + ss->check_iops ? "iops" : "bw", + ss->check_slope ? "_slope" : "", + (float) ss->limit, + ss->pct ? "%" : ""); + + tmp = json_create_object(); + json_object_add_value_object(root, "steadystate", tmp); + json_object_add_value_string(tmp, "ss", ss_buf); + json_object_add_value_int(tmp, "duration", (int)ss->dur); + json_object_add_value_int(tmp, "steadystate_ramptime", ss->ramp_time / 1000000L); + json_object_add_value_int(tmp, "attained", ss->attained); + + snprintf(ss_buf, sizeof(ss_buf), "%f%s", (float) ss->criterion, ss->pct ? "%" : ""); + json_object_add_value_string(tmp, "criterion", ss_buf); + json_object_add_value_float(tmp, "max_deviation", ss->deviation); + json_object_add_value_float(tmp, "slope", ss->slope); + + data = json_create_object(); + json_object_add_value_object(tmp, "data", data); + bw = json_create_array(); + iops = json_create_array(); + + /* + ** if ss was attained or the buffer is not full, + ** ss->head points to the first element in the list. + ** otherwise it actually points to the second element + ** in the list + */ + if (ss->attained || ss->sum_y == 0) + 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++) { + 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_array(data, "iops", iops); + json_object_add_value_array(data, "bw", bw); + } + return root; } @@ -1578,6 +1636,11 @@ void __show_run_stats(void) ts->block_infos[k] = td->ts.block_infos[k]; sum_thread_stats(ts, &td->ts, idx == 1); + + if (td->o.ss_dur) + ts->ss = &td->ss; + else + ts->ss = NULL; } for (i = 0; i < nr_ts; i++) { @@ -2211,28 +2274,36 @@ void add_clat_sample(struct thread_data *td, enum fio_ddir ddir, add_clat_percentile_sample(ts, usec, ddir); if (iolog && iolog->hist_msec) { - struct io_hist *hw = &(iolog->hist_window[ddir]); - (hw->samples)++; + struct io_hist *hw = &iolog->hist_window[ddir]; + + hw->samples++; elapsed = mtime_since_now(&td->epoch); - if (! hw->hist_last) + if (!hw->hist_last) hw->hist_last = elapsed; this_window = elapsed - hw->hist_last; if (this_window >= iolog->hist_msec) { + unsigned int *io_u_plat; + unsigned int *dst; + /* - * Make a byte-for-byte copy of the latency histogram stored in - * td->ts.io_u_plat[ddir], recording it in a log sample. Note that - * the matching call to free() is located in iolog.c after printing - * this sample to the log file. + * Make a byte-for-byte copy of the latency histogram + * stored in td->ts.io_u_plat[ddir], recording it in a + * log sample. Note that the matching call to free() is + * located in iolog.c after printing this sample to the + * log file. */ - unsigned int *io_u_plat = (unsigned int *)(td->ts.io_u_plat[ddir]); - unsigned int *dst = malloc(FIO_IO_U_PLAT_NR * sizeof(unsigned int)); - memcpy(dst, io_u_plat, FIO_IO_U_PLAT_NR * sizeof(unsigned int)); - __add_log_sample(iolog, (uint64_t)dst, ddir, bs, elapsed, offset); + io_u_plat = (unsigned int *) td->ts.io_u_plat[ddir]; + dst = malloc(FIO_IO_U_PLAT_NR * sizeof(unsigned int)); + memcpy(dst, io_u_plat, + FIO_IO_U_PLAT_NR * sizeof(unsigned int)); + __add_log_sample(iolog, (unsigned long )dst, ddir, bs, + elapsed, offset); /* - * Update the last time we recorded as being now, minus any drift - * in time we encountered before actually making the record. + * Update the last time we recorded as being now, minus + * any drift in time we encountered before actually + * making the record. */ hw->hist_last = elapsed - (this_window - iolog->hist_msec); hw->samples = 0;