From: Jens Axboe Date: Wed, 9 Nov 2005 09:39:47 +0000 (+0100) Subject: [PATCH] fio: do seperate statistics between stonewalls as they are not related X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=0d80f40dcdd17283e95502809202c46134ebc73c;p=disktools.git [PATCH] fio: do seperate statistics between stonewalls as they are not related --- diff --git a/fio.c b/fio.c index 076c378..39e84e2 100644 --- a/fio.c +++ b/fio.c @@ -106,6 +106,7 @@ static int rate_quit = 1; 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; @@ -199,6 +200,7 @@ struct thread_data { char file_name[256]; char directory[256]; int thread_number; + int groupid; int error; int fd; pid_t pid; @@ -1866,6 +1868,11 @@ static int add_job(struct thread_data *td, const char *jobname, int prioclass, if (td_read(td)) td->verify = 0; + if (td->stonewall && td->thread_number > 1) + groupid++; + + td->groupid = groupid; + if (setup_rate(td)) goto err; @@ -2271,7 +2278,7 @@ static int parse_jobs_ini(char *file) return 0; } -static int parse_options(int argc, char *argv[]) +static void parse_options(int argc, char *argv[]) { int i; @@ -2331,8 +2338,6 @@ static int parse_options(int argc, char *argv[]) break; } } - - return i; } static void print_thread_status(struct thread_data *td, int nr_running, @@ -2569,13 +2574,78 @@ int setup_thread_area(void) 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; @@ -2608,7 +2678,7 @@ int main(int argc, char *argv[]) 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"); @@ -2624,44 +2694,7 @@ int main(int argc, char *argv[]) } 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; }