+ iops = (1000 * (uint64_t)ts->total_io_u[ddir]) / runt;
+ iops_p = num2str(iops, 6, 1, 0);
+
+ log_info(" %s: io=%sB, bw=%sB/s, iops=%s, runt=%6llumsec\n",
+ ddir_str[ddir], io_p, bw_p, iops_p,
+ ts->runtime[ddir]);
+
+ free(io_p);
+ free(bw_p);
+ free(iops_p);
+
+ if (calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev)) {
+ const char *base = "(usec)";
+ char *minp, *maxp;
+
+ if (!usec_to_msec(&min, &max, &mean, &dev))
+ base = "(msec)";
+
+ minp = num2str(min, 6, 1, 0);
+ maxp = num2str(max, 6, 1, 0);
+
+ log_info(" slat %s: min=%s, max=%s, avg=%5.02f,"
+ " stdev=%5.02f\n", base, minp, maxp, mean, dev);
+
+ free(minp);
+ free(maxp);
+ }
+ if (calc_lat(&ts->clat_stat[ddir], &min, &max, &mean, &dev)) {
+ const char *base = "(usec)";
+ char *minp, *maxp;
+
+ if (!usec_to_msec(&min, &max, &mean, &dev))
+ base = "(msec)";
+
+ minp = num2str(min, 6, 1, 0);
+ maxp = num2str(max, 6, 1, 0);
+
+ log_info(" clat %s: min=%s, max=%s, avg=%5.02f,"
+ " stdev=%5.02f\n", base, minp, maxp, mean, dev);
+
+ free(minp);
+ free(maxp);
+ }
+ if (calc_lat(&ts->lat_stat[ddir], &min, &max, &mean, &dev)) {
+ const char *base = "(usec)";
+ char *minp, *maxp;
+
+ if (!usec_to_msec(&min, &max, &mean, &dev))
+ base = "(msec)";
+
+ minp = num2str(min, 6, 1, 0);
+ maxp = num2str(max, 6, 1, 0);
+
+ log_info(" lat %s: min=%s, max=%s, avg=%5.02f,"
+ " stdev=%5.02f\n", base, minp, maxp, mean, dev);
+
+ free(minp);
+ free(maxp);
+ }
+ if (ts->clat_percentiles) {
+ show_clat_percentiles(ts->io_u_plat[ddir],
+ ts->clat_stat[ddir].samples,
+ ts->percentile_list);
+ }
+ if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) {
+ double p_of_agg;
+
+ p_of_agg = mean * 100 / (double) rs->agg[ddir];
+ log_info(" bw (KB/s) : min=%5lu, max=%5lu, per=%3.2f%%,"
+ " avg=%5.02f, stdev=%5.02f\n", min, max, p_of_agg,
+ mean, dev);
+ }