X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=stat.c;h=f399e912c2196717574fada5f6554bcfbdad4c2d;hb=f6dea4d33fb57a6e7cb64414793c57f10b702851;hp=702716e2a828cfa020f1ea7a627a5af965eae4dd;hpb=81ab0b3ab4db39033e020a1e611197fe04df6c3e;p=fio.git diff --git a/stat.c b/stat.c index 702716e2..f399e912 100644 --- a/stat.c +++ b/stat.c @@ -121,13 +121,17 @@ static void show_clat_percentiles(unsigned int *io_u_plat, unsigned long nr, fio_fp64_t *plist) { unsigned long sum = 0; - unsigned int len, i, j = 0; - int is_last = 0; + unsigned int len, i, j = 0, minv = -1U, maxv = 0; + unsigned int *ovals = NULL, oval_len = 0; + int is_last, scale_down; len = 0; while (len < FIO_IO_U_LIST_MAX_LEN && plist[len].u.f != 0.0) len++; + if (!len) + return; + /* * Sort the percentile list. Note that it may already be sorted if * we are using the default values, but since it's a short list this @@ -136,38 +140,75 @@ static void show_clat_percentiles(unsigned int *io_u_plat, unsigned long nr, if (len > 1) qsort((void*)plist, len, sizeof(plist[0]), double_cmp); - log_info(" clat percentiles (usec):\n |"); - + /* + * Calculate bucket values, note down max and min values + */ + is_last = 0; for (i = 0; i < FIO_IO_U_PLAT_NR && !is_last; i++) { sum += io_u_plat[i]; while (sum >= (plist[j].u.f / 100.0 * nr)) { - char fbuf[8]; - assert(plist[j].u.f <= 100.0); - /* for formatting */ - if (j != 0 && (j % 4) == 0) - log_info(" |"); - - /* end of the list */ - is_last = (j == len - 1); - - if (plist[j].u.f < 10.0) - sprintf(fbuf, " %2.2f", plist[j].u.f); - else - sprintf(fbuf, "%2.2f", plist[j].u.f); + if (j == oval_len) { + oval_len += 100; + ovals = realloc(ovals, oval_len * sizeof(unsigned int)); + } - log_info(" %sth=[%5u]%c", fbuf, plat_idx_to_val(i), - (is_last? '\n' : ',')); + ovals[j] = plat_idx_to_val(i); + if (ovals[j] < minv) + minv = ovals[j]; + if (ovals[j] > maxv) + maxv = ovals[j]; + is_last = (j == len - 1); if (is_last) break; - if (j % 4 == 3) /* for formatting */ - log_info("\n"); j++; } } + + /* + * We default to usecs, but if the value range is such that we + * should scale down to msecs, do that. + */ + if (minv > 2000 && maxv > 99999) { + scale_down = 1; + log_info(" clat percentiles (msec):\n |"); + } else { + scale_down = 0; + log_info(" clat percentiles (usec):\n |"); + } + + for (j = 0; j < len; j++) { + char fbuf[8]; + + /* for formatting */ + if (j != 0 && (j % 4) == 0) + log_info(" |"); + + /* end of the list */ + is_last = (j == len - 1); + + if (plist[j].u.f < 10.0) + sprintf(fbuf, " %2.2f", plist[j].u.f); + else + sprintf(fbuf, "%2.2f", plist[j].u.f); + + if (scale_down) + ovals[j] = (ovals[j] + 999) / 1000; + + log_info(" %sth=[%5u]%c", fbuf, ovals[j], is_last ? '\n' : ','); + + if (is_last) + break; + + if (j % 4 == 3) /* for formatting */ + log_info("\n"); + } + + if (ovals) + free(ovals); } static int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, @@ -198,7 +239,7 @@ void show_group_stats(struct group_run_stats *rs) const char *ddir_str[] = { " READ", " WRITE" }; int i; - log_info("\nRun status group %d (all jobs):\n", rs->groupid); + log_info("Run status group %d (all jobs):\n", rs->groupid); for (i = 0; i <= DDIR_WRITE; i++) { const int i2p = is_power_of_2(rs->kb_base); @@ -517,16 +558,20 @@ static void show_ddir_status_terse(struct thread_stat *ts, struct group_run_stats *rs, int ddir) { unsigned long min, max; - unsigned long long bw; + unsigned long long bw, iops; double mean, dev; assert(ddir_rw(ddir)); - bw = 0; - if (ts->runtime[ddir]) - bw = ts->io_bytes[ddir] / ts->runtime[ddir]; + iops = bw = 0; + if (ts->runtime[ddir]) { + uint64_t runt = ts->runtime[ddir]; + + bw = ts->io_bytes[ddir] / runt; + iops = (1000 * (uint64_t) ts->total_io_u[ddir]) / runt; + } - log_info(";%llu;%llu;%llu", ts->io_bytes[ddir] >> 10, bw, + log_info(";%llu;%llu;%llu;%llu", ts->io_bytes[ddir] >> 10, bw, iops, ts->runtime[ddir]); if (calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev)) @@ -553,7 +598,7 @@ static void show_ddir_status_terse(struct thread_stat *ts, log_info(";%lu;%lu;%f%%;%f;%f", 0UL, 0UL, 0.0, 0.0, 0.0); } -#define FIO_TERSE_VERSION "2" +#define FIO_TERSE_VERSION "3" static void show_thread_status_terse(struct thread_stat *ts, struct group_run_stats *rs) @@ -914,7 +959,12 @@ void show_run_stats(void) show_group_stats(rs); } - show_disk_util(); + if (is_backend) + fio_server_send_du(); + else + show_disk_util(); + + free_disk_util(); } free(runstats);