char *io_p, *bw_p, *iops_p;
int i2p;
+ assert(ddir_rw(ddir));
+
if (!ts->runtime[ddir])
return;
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 (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) {
double p_of_agg;
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",
+ log_info(" issued r/w/d: total=%lu/%lu/%lu, short=%lu/%lu/%lu\n",
ts->total_io_u[0], ts->total_io_u[1],
- ts->short_io_u[0], ts->short_io_u[1]);
+ ts->total_io_u[2],
+ ts->short_io_u[0], ts->short_io_u[1],
+ ts->short_io_u[2]);
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);
unsigned long long bw;
double mean, dev;
+ assert(ddir_rw(ddir));
+
bw = 0;
if (ts->runtime[ddir])
bw = ts->io_bytes[ddir] / ts->runtime[ddir];
else
log_info(";%lu;%lu;%f;%f", 0UL, 0UL, 0.0, 0.0);
+ if (calc_lat(&ts->lat_stat[ddir], &min, &max, &mean, &dev))
+ log_info(";%lu;%lu;%f;%f", min, max, mean, dev);
+ else
+ log_info(";%lu;%lu;%f;%f", 0UL, 0UL, 0.0, 0.0);
+
if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) {
double p_of_agg;
log_info(";%lu;%lu;%f%%;%f;%f", 0UL, 0UL, 0.0, 0.0, 0.0);
}
+#define FIO_TERSE_VERSION "2"
static void show_thread_status_terse(struct thread_stat *ts,
struct group_run_stats *rs)
double usr_cpu, sys_cpu;
int i;
- log_info("%s;%d;%d", ts->name, ts->groupid, ts->error);
+ log_info("%s;%s;%d;%d", FIO_TERSE_VERSION, ts->name, ts->groupid,
+ ts->error);
show_ddir_status_terse(ts, rs, 0);
show_ddir_status_terse(ts, rs, 1);
memset(ts, 0, sizeof(*ts));
for (j = 0; j <= DDIR_WRITE; j++) {
+ ts->lat_stat[j].min_val = -1UL;
ts->clat_stat[j].min_val = -1UL;
ts->slat_stat[j].min_val = -1UL;
ts->bw_stat[j].min_val = -1UL;
for (l = 0; l <= DDIR_WRITE; l++) {
sum_stat(&ts->clat_stat[l], &td->ts.clat_stat[l], idx);
sum_stat(&ts->slat_stat[l], &td->ts.slat_stat[l], idx);
+ sum_stat(&ts->lat_stat[l], &td->ts.lat_stat[l], idx);
sum_stat(&ts->bw_stat[l], &td->ts.bw_stat[l], idx);
ts->stat_io_bytes[l] += td->ts.stat_io_bytes[l];
ts->io_u_lat_m[k] += td->ts.io_u_lat_m[k];
- for (k = 0; k <= DDIR_WRITE; k++) {
+ for (k = 0; k <= 2; k++) {
ts->total_io_u[k] += td->ts.total_io_u[k];
ts->short_io_u[k] += td->ts.short_io_u[k];
}
max_run[1] = rs->max_run[1];
if (rs->max_run[0])
- rs->agg[0] = (rs->io_kb[0] * rs->kb_base) / max_run[0];
+ rs->agg[0] = (rs->io_kb[0] * 1000) / max_run[0];
if (rs->max_run[1])
- rs->agg[1] = (rs->io_kb[1] * rs->kb_base) / max_run[1];
+ rs->agg[1] = (rs->io_kb[1] * 1000) / max_run[1];
}
/*
unsigned long val, enum fio_ddir ddir,
unsigned int bs)
{
+ if (!ddir_rw(ddir))
+ return;
+
__add_log_sample(iolog, val, ddir, bs, mtime_since_now(&td->epoch));
}
void add_agg_sample(unsigned long val, enum fio_ddir ddir, unsigned int bs)
{
- struct io_log *iolog = agg_io_log[ddir];
+ struct io_log *iolog;
+
+ if (!ddir_rw(ddir))
+ return;
+ iolog = agg_io_log[ddir];
__add_log_sample(iolog, val, ddir, bs, mtime_since_genesis());
}
{
struct thread_stat *ts = &td->ts;
+ if (!ddir_rw(ddir))
+ return;
+
add_stat_sample(&ts->clat_stat[ddir], usec);
if (ts->clat_log)
{
struct thread_stat *ts = &td->ts;
+ if (!ddir_rw(ddir))
+ return;
+
add_stat_sample(&ts->slat_stat[ddir], usec);
if (ts->slat_log)
add_log_sample(td, ts->slat_log, usec, ddir, bs);
}
+void add_lat_sample(struct thread_data *td, enum fio_ddir ddir,
+ unsigned long usec, unsigned int bs)
+{
+ struct thread_stat *ts = &td->ts;
+
+ if (!ddir_rw(ddir))
+ return;
+
+ add_stat_sample(&ts->lat_stat[ddir], usec);
+
+ if (ts->lat_log)
+ add_log_sample(td, ts->lat_log, usec, ddir, bs);
+}
+
void add_bw_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs,
struct timeval *t)
{
struct thread_stat *ts = &td->ts;
- unsigned long spent = mtime_since(&ts->stat_sample_time[ddir], t);
- unsigned long rate;
+ unsigned long spent, rate;
+
+ if (!ddir_rw(ddir))
+ return;
+ spent = mtime_since(&ts->stat_sample_time[ddir], t);
if (spent < td->o.bw_avg_time)
return;