Aggregate slave device stats into the stats for master.
authorShehjar Tikoo <shehjart@gelato.unsw.edu.au>
Tue, 30 Sep 2008 01:11:35 +0000 (11:11 +1000)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 30 Sep 2008 06:34:57 +0000 (08:34 +0200)
But do so by adding new fields in the stats line.
We dont want the existing output format to get clobbered.
The new fields in master device line which contain
aggregated stats start with "aggr".

Signed-off-by: Shehjar Tikoo <shehjart@gelato.unsw.edu.au>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diskutil.c

index b409d8efe97397ba6ce407ea6ecad7f7d59b5fa3..82b393ac92f4f2f4c2e4bc0b6c962ef1a8874589 100644 (file)
@@ -422,6 +422,57 @@ void init_disk_util(struct thread_data *td)
                __init_disk_util(td, f);
 }
 
+static void aggregate_slaves_stats(struct disk_util *masterdu)
+{
+       struct disk_util_stat *dus;
+       struct flist_head *entry;
+       struct disk_util *slavedu;
+       double util, max_util = 0;
+       int slavecount = 0;
+
+       unsigned merges[2];
+       unsigned ticks[2];
+       unsigned time_in_queue;
+       unsigned long long sectors[2];
+       unsigned ios[2];
+
+       flist_for_each(entry, &masterdu->slaves) {
+               slavedu = flist_entry(entry, struct disk_util, slavelist);
+               dus = &slavedu->dus;
+               ios[0] += dus->ios[0];
+               ios[1] += dus->ios[1];
+               merges[0] += dus->merges[0];
+               merges[1] += dus->merges[1];
+               sectors[0] += dus->sectors[0];
+               sectors[1] += dus->sectors[1];
+               ticks[0] += dus->ticks[0];
+               ticks[1] += dus->ticks[1];
+               time_in_queue += dus->time_in_queue;
+               ++slavecount;
+
+               util = (double) (100 * dus->io_ticks / (double) slavedu->msec);
+               /* System utilization is the utilization of the
+                * component with the highest utilization.
+                */
+               if (util > max_util)
+                       max_util = util;
+
+       }
+
+       if (max_util > 100.0)
+               max_util = 100.0;
+
+       log_info(", aggrios=%u/%u, aggrmerge=%u/%u, aggrticks=%u/%u,"
+                       " aggrin_queue=%u, aggrutil=%3.2f%%",
+                       ios[0]/slavecount, ios[1]/slavecount,
+                       merges[0]/slavecount, merges[1]/slavecount,
+                       ticks[0]/slavecount, ticks[1]/slavecount,
+                       time_in_queue/slavecount, max_util);
+
+}
+
+
+
 void show_disk_util(void)
 {
        struct disk_util_stat *dus;
@@ -454,11 +505,19 @@ void show_disk_util(void)
                        log_info("  ");
 
                log_info("  %s: ios=%u/%u, merge=%u/%u, ticks=%u/%u, "
-                        "in_queue=%u, util=%3.2f%%\n", du->name,
+                        "in_queue=%u, util=%3.2f%%", 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);
+
+               /* If the device has slaves, aggregate the stats for
+                * those slave devices also.
+                */
+               if(!flist_empty(&du->slaves))
+                       aggregate_slaves_stats(du);
+
+               log_info("\n");
        }
 
        /*