X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=stat.c;h=40e3b1bade76d576849f7b497a344f1f8653b183;hp=7de2362132d9deae23017169c3d07f10389f4a5f;hb=19d3e967ff31c055c1497dd67f4d7305ec1607f4;hpb=b8bc8cba9512c6dce4891fda86de675053605ca2 diff --git a/stat.c b/stat.c index 7de23621..40e3b1ba 100644 --- a/stat.c +++ b/stat.c @@ -440,12 +440,14 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts, ts->percentile_list); } if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) { - double p_of_agg; + double p_of_agg = 100.0; const char *bw_str = "KB"; - p_of_agg = mean * 100 / (double) rs->agg[ddir]; - if (p_of_agg > 100.0) - p_of_agg = 100.0; + if (rs->agg[dir]) { + p_of_agg = mean * 100 / (double) rs->agg[ddir]; + if (p_of_agg > 100.0) + p_of_agg = 100.0; + } if (mean > 999999.9) { min /= 1000.0; @@ -653,9 +655,14 @@ static void show_ddir_status_terse(struct thread_stat *ts, free(ovals); if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) { - double p_of_agg; + double p_of_agg = 100.0; + + if (rs->agg[ddir]) { + p_of_agg = mean * 100 / (double) rs->agg[ddir]; + if (p_of_agg > 100.0) + p_of_agg = 100.0; + } - p_of_agg = mean * 100 / (double) rs->agg[ddir]; log_info(";%lu;%lu;%f%%;%f;%f", min, max, p_of_agg, mean, dev); } else log_info(";%lu;%lu;%f%%;%f;%f", 0UL, 0UL, 0.0, 0.0, 0.0); @@ -1145,11 +1152,17 @@ static void __add_log_sample(struct io_log *iolog, unsigned long val, iolog->nr_samples++; } +static inline void reset_io_stat(struct io_stat *ios) +{ + ios->max_val = ios->min_val = ios->samples = 0; + ios->mean.u.f = ios->S.u.f = 0; +} + static void add_log_sample(struct thread_data *td, struct io_log *iolog, unsigned long val, enum fio_ddir ddir, unsigned int bs) { - unsigned long elapsed, this_window, mr, mw; + unsigned long elapsed, this_window; if (!ddir_rw(ddir)) return; @@ -1170,20 +1183,34 @@ static void add_log_sample(struct thread_data *td, struct io_log *iolog, */ add_stat_sample(&iolog->avg_window[ddir], val); + /* + * If period hasn't passed, adding the above sample is all we + * need to do. + */ this_window = elapsed - iolog->avg_last; if (this_window < iolog->avg_msec) return; - mr = iolog->avg_window[DDIR_READ].mean.u.f; - mw = iolog->avg_window[DDIR_WRITE].mean.u.f; + /* + * Note an entry in the log. Use the mean from the logged samples, + * making sure to properly round up. Only write a log entry if we + * had actual samples done. + */ + if (iolog->avg_window[DDIR_READ].samples) { + unsigned long mr; - if (mr) + mr = iolog->avg_window[DDIR_READ].mean.u.f + 0.50; __add_log_sample(iolog, mr, DDIR_READ, 0, elapsed); - if (mw) + } + if (iolog->avg_window[DDIR_WRITE].samples) { + unsigned long mw; + + mw = iolog->avg_window[DDIR_WRITE].mean.u.f + 0.50; __add_log_sample(iolog, mw, DDIR_WRITE, 0, elapsed); + } - memset(&iolog->avg_window[DDIR_READ], 0, sizeof(struct io_stat)); - memset(&iolog->avg_window[DDIR_WRITE], 0, sizeof(struct io_stat)); + reset_io_stat(&iolog->avg_window[DDIR_READ]); + reset_io_stat(&iolog->avg_window[DDIR_WRITE]); iolog->avg_last = elapsed; } @@ -1293,10 +1320,8 @@ void add_iops_sample(struct thread_data *td, enum fio_ddir ddir, add_stat_sample(&ts->iops_stat[ddir], iops); - if (td->iops_log) { - assert(iops); + if (td->iops_log) add_log_sample(td, td->iops_log, iops, ddir, 0); - } fio_gettime(&td->iops_sample_time, NULL); td->stat_io_blocks[ddir] = td->this_io_blocks[ddir];