#include <dirent.h>
#include <libgen.h>
#include <math.h>
-#include <assert.h>
#include "fio.h"
}
}
+static void stat_calc_dist(struct thread_stat *ts, 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;
+ io_u_dist[i] *= 100.0;
+ }
+}
+
+static void stat_calc_lat(struct thread_stat *ts, double *io_u_lat)
+{
+ int i;
+
+ /*
+ * Do latency distribution calculations
+ */
+ for (i = 0; i < FIO_IO_U_LAT_NR; i++) {
+ io_u_lat[i] = (double) ts->io_u_lat[i] / (double) ts->total_io_u;
+ io_u_lat[i] *= 100.0;
+ }
+}
+
static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
int ddir)
{
unsigned long runtime;
double io_u_dist[FIO_IO_U_MAP_NR];
double io_u_lat[FIO_IO_U_LAT_NR];
- int i;
if (!(ts->io_bytes[0] + ts->io_bytes[1]))
return;
fprintf(f_out, " cpu : usr=%3.2f%%, sys=%3.2f%%, ctx=%lu\n", usr_cpu, sys_cpu, ts->ctx);
- /*
- * 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;
- io_u_dist[i] *= 100.0;
- }
+ stat_calc_dist(ts, io_u_dist);
+ stat_calc_lat(ts, io_u_lat);
fprintf(f_out, " 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]);
- /*
- * Do latency distribution calculations
- */
- for (i = 0; i < FIO_IO_U_LAT_NR; i++) {
- io_u_lat[i] = (double) ts->io_u_lat[i] / (double) ts->total_io_u;
- io_u_lat[i] *= 100.0;
- }
-
fprintf(f_out, " lat (msec): 2=%3.1f%%, 4=%3.1f%%, 10=%3.1f%%, 20=%3.1f%%, 50=%3.1f%%, 100=%3.1f%%\n", io_u_lat[0], io_u_lat[1], io_u_lat[2], io_u_lat[3], io_u_lat[4], io_u_lat[5]);
fprintf(f_out, " lat (msec): 250=%3.1f%%, 500=%3.1f%%, 750=%3.1f%%, 1000=%3.1f%%, >=2000=%3.1f%%\n", io_u_lat[6], io_u_lat[7], io_u_lat[8], io_u_lat[9], io_u_lat[10]);
static void show_thread_status_terse(struct thread_stat *ts,
struct group_run_stats *rs)
{
+ double io_u_dist[FIO_IO_U_MAP_NR];
+ double io_u_lat[FIO_IO_U_LAT_NR];
double usr_cpu, sys_cpu;
fprintf(f_out, "%s,%d,%d", ts->name, ts->groupid, ts->error);
sys_cpu = 0;
}
- fprintf(f_out, ",%f%%,%f%%,%lu\n", usr_cpu, sys_cpu, ts->ctx);
+ fprintf(f_out, ",%f%%,%f%%,%lu", usr_cpu, sys_cpu, ts->ctx);
+
+ stat_calc_dist(ts, io_u_dist);
+ stat_calc_lat(ts, io_u_lat);
+
+ fprintf(f_out, ",%3.1f%%,%3.1f%%,%3.1f%%,%3.1f%%,%3.1f%%,%3.1f%%,%3.1f%%", 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]);
+
+ fprintf(f_out, "%3.1f%%,%3.1f%%,%3.1f%%,%3.1f%%,%3.1f%%,%3.1f%%\n", io_u_lat[0], io_u_lat[1], io_u_lat[2], io_u_lat[3], io_u_lat[4], io_u_lat[5]);
+ fprintf(f_out, "%3.1f%%,%3.1f%%,%3.1f%%,%3.1f%%,%3.1f%%", io_u_lat[6], io_u_lat[7], io_u_lat[8], io_u_lat[9], io_u_lat[10]);
+
+ if (ts->description)
+ fprintf(f_out, ",%s", ts->description);
+
+ fprintf(f_out, "\n");
}
static void __sum_stat(struct io_stat *dst, struct io_stat *src, int nr)
mean = src->mean;
S = src->S;
} else {
- mean = ((src->mean * (double) nr) + dst->mean) / ((double) nr + 1.0);
- S = ((src->S * (double) nr) + dst->S) / ((double) nr + 1.0);
+ mean = ((src->mean * (double) (nr - 1)) + dst->mean) / ((double) nr);
+ S = ((src->S * (double) (nr - 1)) + dst->S) / ((double) nr);
}
dst->mean = mean;
members++;
if (!ts->groupid) {
+ /*
+ * These are per-group shared already
+ */
ts->name = td->name;
ts->description = td->description;
- ts->error = td->error;
ts->groupid = td->groupid;
+
+ /*
+ * first pid in group, not very useful...
+ */
ts->pid = td->pid;
+ }
+
+ if (td->error && !ts->error) {
+ ts->error = td->error;
ts->verror = td->verror;
}
rbw = wbw = 0;
if (ts->runtime[0])
- rbw = td->io_bytes[0] / (unsigned long long) ts->runtime[0];
+ rbw = ts->io_bytes[0] / (unsigned long long) ts->runtime[0];
if (ts->runtime[1])
- wbw = td->io_bytes[1] / (unsigned long long) ts->runtime[1];
+ wbw = ts->io_bytes[1] / (unsigned long long) ts->runtime[1];
if (rbw < rs->min_bw[0])
rs->min_bw[0] = rbw;
static inline void add_stat_sample(struct io_stat *is, unsigned long data)
{
double val = data;
- double delta, n;
+ double delta;
if (data > is->max_val)
is->max_val = data;
is->min_val = data;
delta = val - is->mean;
- n = is->samples + 1.0;
- is->mean += delta / n;
+ is->mean += delta / (is->samples + 1.0);
is->S += delta * (val - is->mean);
is->samples++;