static int write_lat_log;
static int write_bw_log;
static int exitall_on_terminate;
+static int groupid;
static int thread_number;
static char *ini_file;
char file_name[256];
char directory[256];
int thread_number;
+ int groupid;
int error;
int fd;
pid_t pid;
if (td_read(td))
td->verify = 0;
+ if (td->stonewall && td->thread_number > 1)
+ groupid++;
+
+ td->groupid = groupid;
+
if (setup_rate(td))
goto err;
return 0;
}
-static int parse_options(int argc, char *argv[])
+static void parse_options(int argc, char *argv[])
{
int i;
break;
}
}
-
- return i;
}
static void print_thread_status(struct thread_data *td, int nr_running,
return 0;
}
-int main(int argc, char *argv[])
+struct group_run_stats {
+ unsigned long max_run[2], min_run[2];
+ unsigned long max_bw[2], min_bw[2];
+ unsigned long io_mb[2];
+ unsigned long agg[2];
+};
+
+static void show_group_stats(struct group_run_stats *rs, int id)
{
- static unsigned long max_run[2], min_run[2];
- static unsigned long max_bw[2], min_bw[2];
- static unsigned long io_mb[2], agg[2];
+ printf("\nRun status group %d:\n", id);
+
+ if (rs->max_run[DDIR_READ])
+ printf(" READ: io=%luMiB, aggrb=%lu, minb=%lu, maxb=%lu, mint=%lumsec, maxt=%lumsec\n", rs->io_mb[0], rs->agg[0], rs->min_bw[0], rs->max_bw[0], rs->min_run[0], rs->max_run[0]);
+ if (rs->max_run[DDIR_WRITE])
+ printf(" WRITE: io=%luMiB, aggrb=%lu, minb=%lu, maxb=%lu, mint=%lumsec, maxt=%lumsec\n", rs->io_mb[1], rs->agg[1], rs->min_bw[1], rs->max_bw[1], rs->min_run[1], rs->max_run[1]);
+}
+
+static void show_run_stats(void)
+{
+ struct group_run_stats *runstats, *rs;
int i;
+ runstats = malloc(sizeof(struct group_run_stats) * (groupid + 1));
+
+ for (i = 0; i < groupid + 1; i++) {
+ rs = &runstats[i];
+
+ rs->min_bw[0] = rs->min_run[0] = ~0UL;
+ rs->min_bw[1] = rs->min_run[1] = ~0UL;
+ rs->io_mb[0] = rs->io_mb[1] = 0;
+ rs->agg[0] = rs->agg[1] = 0;
+ }
+
+ for (i = 0; i < thread_number; i++) {
+ struct thread_data *td = &threads[i];
+ unsigned long bw = 0;
+
+ rs = &runstats[td->groupid];
+
+ if (!td->error) {
+ if (td->runtime < rs->min_run[td->ddir])
+ rs->min_run[td->ddir] = td->runtime;
+ if (td->runtime > rs->max_run[td->ddir])
+ rs->max_run[td->ddir] = td->runtime;
+
+ if (td->runtime)
+ bw = td->io_bytes / td->runtime;
+ if (bw < rs->min_bw[td->ddir])
+ rs->min_bw[td->ddir] = bw;
+ if (bw > rs->max_bw[td->ddir])
+ rs->max_bw[td->ddir] = bw;
+
+ rs->io_mb[td->ddir] += td->io_bytes >> 20;
+ }
+
+ show_thread_status(td);
+ }
+
+ for (i = 0; i < groupid + 1; i++) {
+ rs = &runstats[i];
+
+ if (rs->max_run[0])
+ rs->agg[0] = (rs->io_mb[0]*1024*1000) / rs->max_run[0];
+ if (rs->max_run[1])
+ rs->agg[1] = (rs->io_mb[1]*1024*1000) / rs->max_run[1];
+
+ show_group_stats(rs, i);
+ }
+}
+
+int main(int argc, char *argv[])
+{
if (setup_thread_area())
return 1;
def_thread.stonewall = DEF_STONEWALL;
def_thread.numjobs = DEF_NUMJOBS;
- i = parse_options(argc, argv);
+ parse_options(argc, argv);
if (!ini_file) {
printf("Need job file\n");
}
run_threads(argv);
-
- min_bw[0] = min_run[0] = ~0UL;
- min_bw[1] = min_run[1] = ~0UL;
- io_mb[0] = io_mb[1] = 0;
- agg[0] = agg[1] = 0;
- for (i = 0; i < thread_number; i++) {
- struct thread_data *td = &threads[i];
- unsigned long bw = 0;
-
- if (!td->error) {
- if (td->runtime < min_run[td->ddir])
- min_run[td->ddir] = td->runtime;
- if (td->runtime > max_run[td->ddir])
- max_run[td->ddir] = td->runtime;
-
- if (td->runtime)
- bw = td->io_bytes / td->runtime;
- if (bw < min_bw[td->ddir])
- min_bw[td->ddir] = bw;
- if (bw > max_bw[td->ddir])
- max_bw[td->ddir] = bw;
-
- io_mb[td->ddir] += td->io_bytes >> 20;
- }
-
- show_thread_status(td);
- }
-
- if (max_run[0])
- agg[0] = (io_mb[0] * 1024 * 1000) / max_run[0];
- if (max_run[1])
- agg[1] = (io_mb[1] * 1024 * 1000) / max_run[1];
-
- printf("\nRun status:\n");
- if (max_run[DDIR_READ])
- printf(" READ: io=%luMiB, aggrb=%lu, minb=%lu, maxb=%lu, mint=%lumsec, maxt=%lumsec\n", io_mb[0], agg[0], min_bw[0], max_bw[0], min_run[0], max_run[0]);
- if (max_run[DDIR_WRITE])
- printf(" WRITE: io=%luMiB, aggrb=%lu, minb=%lu, maxb=%lu, mint=%lumsec, maxt=%lumsec\n", io_mb[1], agg[1], min_bw[1], max_bw[1], min_run[1], max_run[1]);
+ show_run_stats();
return 0;
}