[PATCH] fio: do seperate statistics between stonewalls as they are not related
authorJens Axboe <axboe@suse.de>
Wed, 9 Nov 2005 09:39:47 +0000 (10:39 +0100)
committerJens Axboe <axboe@suse.de>
Wed, 9 Nov 2005 09:39:47 +0000 (10:39 +0100)
fio.c

diff --git a/fio.c b/fio.c
index 076c378044cc5f363eaba5a058cf495a7f257737..39e84e261b88ac33197a0358cf750c17afdc4d92 100644 (file)
--- 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;
 }