if (!rs->max_run[i])
continue;
- p1 = num2str(rs->io_kb[i], 6, 1000, 1);
- p2 = num2str(rs->agg[i], 6, 1000, 1);
- p3 = num2str(rs->min_bw[i], 6, 1000, 1);
- p4 = num2str(rs->max_bw[i], 6, 1000, 1);
+ p1 = num2str(rs->io_kb[i], 6, 1024, 1);
+ p2 = num2str(rs->agg[i], 6, 1024, 1);
+ p3 = num2str(rs->min_bw[i], 6, 1024, 1);
+ p4 = num2str(rs->max_bw[i], 6, 1024, 1);
log_info("%s: io=%siB, aggrb=%siB/s, minb=%siB/s, maxb=%siB/s,"
" mint=%llumsec, maxt=%llumsec\n", ddir_str[i], p1, p2,
#define ts_total_io_u(ts) \
((ts)->total_io_u[0] + (ts)->total_io_u[1])
-static void stat_calc_dist(struct thread_stat *ts, double *io_u_dist)
+static void stat_calc_dist(unsigned int *map, unsigned long total,
+ double *io_u_dist)
{
int i;
* Do depth distribution calculations
*/
for (i = 0; i < FIO_IO_U_MAP_NR; i++) {
- io_u_dist[i] = (double) ts->io_u_map[i]
- / (double) ts_total_io_u(ts);
- io_u_dist[i] *= 100.0;
- if (io_u_dist[i] < 0.1 && ts->io_u_map[i])
- io_u_dist[i] = 0.1;
+ if (total) {
+ io_u_dist[i] = (double) map[i] / (double) total;
+ io_u_dist[i] *= 100.0;
+ if (io_u_dist[i] < 0.1 && map[i])
+ io_u_dist[i] = 0.1;
+ } else
+ io_u_dist[i] = 0.0;
}
}
static void stat_calc_lat(struct thread_stat *ts, double *dst,
unsigned int *src, int nr)
{
+ unsigned long total = ts_total_io_u(ts);
int i;
/*
* Do latency distribution calculations
*/
for (i = 0; i < nr; i++) {
- dst[i] = (double) src[i] / (double) ts_total_io_u(ts);
- dst[i] *= 100.0;
- if (dst[i] < 0.01 && src[i])
- dst[i] = 0.01;
+ if (total) {
+ dst[i] = (double) src[i] / (double) total;
+ dst[i] *= 100.0;
+ if (dst[i] < 0.01 && src[i])
+ dst[i] = 0.01;
+ } else
+ dst[i] = 0.0;
}
}
int ddir)
{
const char *ddir_str[] = { "read ", "write" };
- unsigned long min, max;
+ unsigned long min, max, runt;
unsigned long long bw, iops;
double mean, dev;
char *io_p, *bw_p, *iops_p;
if (!ts->runtime[ddir])
return;
- bw = ts->io_bytes[ddir] / ts->runtime[ddir];
- iops = (1000 * ts->total_io_u[ddir]) / ts->runtime[ddir];
- io_p = num2str(ts->io_bytes[ddir] >> 10, 6, 1000, 1);
- bw_p = num2str(bw, 6, 1000, 1);
+ runt = ts->runtime[ddir];
+
+ bw = (1000 * ts->io_bytes[ddir]) / runt;
+ io_p = num2str(ts->io_bytes[ddir] >> 10, 6, 1024, 1);
+ bw_p = num2str(bw >> 10, 6, 1024, 1);
+
+ iops = (1000 * ts->total_io_u[ddir]) / runt;
iops_p = num2str(iops, 6, 1, 0);
log_info(" %s: io=%siB, bw=%siB/s, iops=%s, runt=%6lumsec\n",
if (!ts->error) {
log_info("%s: (groupid=%d, jobs=%d): err=%2d: pid=%d\n",
ts->name, ts->groupid, ts->members,
- ts->error, ts->pid);
+ ts->error, (int) ts->pid);
} else {
log_info("%s: (groupid=%d, jobs=%d): err=%2d (%s): pid=%d\n",
ts->name, ts->groupid, ts->members,
- ts->error, ts->verror, ts->pid);
+ ts->error, ts->verror, (int) ts->pid);
}
if (ts->description)
log_info(" cpu : usr=%3.2f%%, sys=%3.2f%%, ctx=%lu, majf=%lu,"
" minf=%lu\n", usr_cpu, sys_cpu, ts->ctx, ts->majf, ts->minf);
- stat_calc_dist(ts, io_u_dist);
- stat_calc_lat_u(ts, io_u_lat_u);
- stat_calc_lat_m(ts, io_u_lat_m);
-
+ stat_calc_dist(ts->io_u_map, ts_total_io_u(ts), io_u_dist);
log_info(" IO depths : 1=%3.1f%%, 2=%3.1f%%, 4=%3.1f%%, 8=%3.1f%%,"
" 16=%3.1f%%, 32=%3.1f%%, >=64=%3.1f%%\n", io_u_dist[0],
io_u_dist[1], io_u_dist[2],
io_u_dist[3], io_u_dist[4],
io_u_dist[5], io_u_dist[6]);
+
+ stat_calc_dist(ts->io_u_submit, ts->total_submit, io_u_dist);
+ log_info(" submit : 0=%3.1f%%, 4=%3.1f%%, 8=%3.1f%%, 16=%3.1f%%,"
+ " 32=%3.1f%%, 64=%3.1f%%, >=64=%3.1f%%\n", io_u_dist[0],
+ io_u_dist[1], io_u_dist[2],
+ io_u_dist[3], io_u_dist[4],
+ io_u_dist[5], io_u_dist[6]);
+ stat_calc_dist(ts->io_u_complete, ts->total_complete, io_u_dist);
+ log_info(" complete : 0=%3.1f%%, 4=%3.1f%%, 8=%3.1f%%, 16=%3.1f%%,"
+ " 32=%3.1f%%, 64=%3.1f%%, >=64=%3.1f%%\n", io_u_dist[0],
+ io_u_dist[1], io_u_dist[2],
+ io_u_dist[3], io_u_dist[4],
+ io_u_dist[5], io_u_dist[6]);
log_info(" issued r/w: total=%lu/%lu, short=%lu/%lu\n",
ts->total_io_u[0], ts->total_io_u[1],
ts->short_io_u[0], ts->short_io_u[1]);
-
+ stat_calc_lat_u(ts, io_u_lat_u);
+ stat_calc_lat_m(ts, io_u_lat_m);
show_latencies(io_u_lat_u, io_u_lat_m);
}
log_info(";%f%%;%f%%;%lu;%lu;%lu", usr_cpu, sys_cpu, ts->ctx, ts->majf,
ts->minf);
- stat_calc_dist(ts, io_u_dist);
+ stat_calc_dist(ts->io_u_map, ts_total_io_u(ts), io_u_dist);
stat_calc_lat_u(ts, io_u_lat_u);
stat_calc_lat_m(ts, io_u_lat_m);
for (k = 0; k < FIO_IO_U_MAP_NR; k++)
ts->io_u_map[k] += td->ts.io_u_map[k];
+ for (k = 0; k < FIO_IO_U_MAP_NR; k++)
+ ts->io_u_submit[k] += td->ts.io_u_submit[k];
+ for (k = 0; k < FIO_IO_U_MAP_NR; k++)
+ ts->io_u_complete[k] += td->ts.io_u_complete[k];
for (k = 0; k < FIO_IO_U_LAT_U_NR; k++)
ts->io_u_lat_u[k] += td->ts.io_u_lat_u[k];
for (k = 0; k < FIO_IO_U_LAT_M_NR; k++)
}
ts->total_run_time += td->ts.total_run_time;
+ ts->total_submit += td->ts.total_submit;
+ ts->total_complete += td->ts.total_complete;
}
for (i = 0; i < nr_ts; i++) {
rs->max_run[j] = ts->runtime[j];
bw = 0;
- if (ts->runtime[j])
- bw = ts->io_bytes[j]
- / (unsigned long long) ts->runtime[j];
+ if (ts->runtime[j]) {
+ unsigned long runt;
+
+ runt = ts->runtime[j] * 1024 / 1000;
+ bw = ts->io_bytes[j] / runt;
+ }
if (bw < rs->min_bw[j])
rs->min_bw[j] = bw;
if (bw > rs->max_bw[j])
}
for (i = 0; i < groupid + 1; i++) {
+ unsigned long max_run[2];
+
rs = &runstats[i];
+ max_run[0] = rs->max_run[0] * 1024 / 1000;
+ max_run[1] = rs->max_run[1] * 1024 / 1000;
if (rs->max_run[0])
- rs->agg[0] = (rs->io_kb[0]*1024) / rs->max_run[0];
+ rs->agg[0] = (rs->io_kb[0]*1024) / max_run[0];
if (rs->max_run[1])
- rs->agg[1] = (rs->io_kb[1]*1024) / rs->max_run[1];
+ rs->agg[1] = (rs->io_kb[1]*1024) / max_run[1];
}
/*
if (spent < td->o.bw_avg_time)
return;
- rate = (td->this_io_bytes[ddir] - ts->stat_io_bytes[ddir]) / spent;
+ rate = (td->this_io_bytes[ddir] - ts->stat_io_bytes[ddir]) * 1000 / spent / 1024;
add_stat_sample(&ts->bw_stat[ddir], rate);
if (ts->bw_log)