[PATCH] fio: extend disk stats to cover more than just utilization
authorJens Axboe <axboe@suse.de>
Wed, 30 Nov 2005 10:06:42 +0000 (11:06 +0100)
committerJens Axboe <axboe@suse.de>
Wed, 30 Nov 2005 10:06:42 +0000 (11:06 +0100)
fio.c
fio.h

diff --git a/fio.c b/fio.c
index 3529d025920eb175122e2429292401ace72b1b50..e1dd4c5b0792c63903f8910071ed1a1ab19865bd 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -1572,43 +1572,58 @@ static char *find_block_dir(dev_t dev, char *path)
        return found;
 }
 
-static int get_io_ticks(struct disk_util *du)
+static int get_io_ticks(struct disk_util *du, struct disk_util_stat *dus)
 {
-       int i1, i2, i3, i4, i5, i6, i7, i8, i9;
-       unsigned long long ull1, ull2;
+       unsigned in_flight;
        char line[256];
        FILE *f;
        char *p;
 
        f = fopen(du->path, "r");
        if (!f)
-               return 0;
+               return 1;
 
        p = fgets(line, sizeof(line), f);
        if (!p) {
                fclose(f);
-               return 0;
+               return 1;
        }
 
-       if (sscanf(p, "%8u %8u %8llu %8u %8u %8u %8llu %8u %8u %8u %8u", &i1, &i2, &ull1, &i3, &i4, &i5, &ull2, &i6, &i7, &i8, &i9) != 11) {
+       if (sscanf(p, "%8u %8u %8llu %8u %8u %8u %8llu %8u %8u %8u %8u", &dus->ios[0], &dus->merges[0], &dus->sectors[0], &dus->ticks[0], &dus->ios[1], &dus->merges[1], &dus->sectors[1], &dus->ticks[1], &in_flight, &dus->io_ticks, &dus->time_in_queue) != 11) {
                fclose(f);
-               return 0;
+               return 1;
        }
 
        fclose(f);
-       return i8;
+       return 0;
 }
 
 static void update_io_tick_disk(struct disk_util *du)
 {
-       unsigned long ticks = get_io_ticks(du);
+       struct disk_util_stat __dus, *dus, *ldus;
        struct timeval t;
 
-       du->io_ticks += (ticks - du->last_io_ticks);
-       du->last_io_ticks = ticks;
+       if (get_io_ticks(du, &__dus))
+               return;
+
+       dus = &du->dus;
+       ldus = &du->last_dus;
+
+       dus->sectors[0] += (__dus.sectors[0] - ldus->sectors[0]);
+       dus->sectors[1] += (__dus.sectors[1] - ldus->sectors[1]);
+       dus->ios[0] += (__dus.ios[0] - ldus->ios[0]);
+       dus->ios[1] += (__dus.ios[1] - ldus->ios[1]);
+       dus->merges[0] += (__dus.merges[0] - ldus->merges[0]);
+       dus->merges[1] += (__dus.merges[1] - ldus->merges[1]);
+       dus->ticks[0] += (__dus.ticks[0] - ldus->ticks[0]);
+       dus->ticks[1] += (__dus.ticks[1] - ldus->ticks[1]);
+       dus->io_ticks += (__dus.io_ticks - ldus->io_ticks);
+       dus->time_in_queue += (__dus.time_in_queue - ldus->time_in_queue);
+
        gettimeofday(&t, NULL);
        du->msec += mtime_since(&du->time, &t);
        memcpy(&du->time, &t, sizeof(t));
+       memcpy(ldus, &__dus, sizeof(__dus));
 }
 
 static void update_io_ticks(void)
@@ -1648,7 +1663,7 @@ static void disk_util_add(dev_t dev, char *path)
        du->dev = dev;
 
        gettimeofday(&du->time, NULL);
-       du->last_io_ticks = get_io_ticks(du);
+       get_io_ticks(du, &du->last_dus);
 
        list_add_tail(&du->list, &disk_list);
 }
@@ -2146,20 +2161,22 @@ static void show_group_stats(struct group_run_stats *rs, int id)
 
 static void show_disk_util(void)
 {
+       struct disk_util_stat *dus;
        struct list_head *entry;
        struct disk_util *du;
        double util;
 
-       printf("\nDisk utilization:\n");
+       printf("\nDisk stats:\n");
 
        list_for_each(entry, &disk_list) {
                du = list_entry(entry, struct disk_util, list);
+               dus = &du->dus;
 
-               util = (double) 100 * du->io_ticks / (double) du->msec;
+               util = (double) 100 * du->dus.io_ticks / (double) du->msec;
                if (util > 100.0)
                        util = 100.0;
 
-               printf("  %s: %3.2f%%\n", du->name, util);
+               printf("  %s: ios=%u/%u, merge=%u/%u, ticks=%u/%u, in_queue=%u, util=%3.2f%%\n", du->name, dus->ios[0], dus->ios[1], dus->merges[0], dus->merges[1], dus->ticks[0], dus->ticks[1], dus->time_in_queue, util);
        }
 }
 
diff --git a/fio.h b/fio.h
index 221e97c5b59ceaa99cfd323d3052ab74202ff59c..81056a61df798cc778418b24ae65325cfaf32f2b 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -218,13 +218,25 @@ enum {
 
 #define MAX_JOBS       (1024)
 
+struct disk_util_stat {
+       unsigned ios[2];
+       unsigned merges[2];
+       unsigned long long sectors[2];
+       unsigned ticks[2];
+       unsigned io_ticks;
+       unsigned time_in_queue;
+};
+
 struct disk_util {
        struct list_head list;
 
        char *name;
        char path[256];
        dev_t dev;
-       unsigned long io_ticks, last_io_ticks;
+
+       struct disk_util_stat dus;
+       struct disk_util_stat last_dus;
+
        unsigned long msec;
        struct timeval time;
 };