[PATCH] fio: add cpu usage stats
authorJens Axboe <axboe@suse.de>
Tue, 8 Nov 2005 09:08:04 +0000 (10:08 +0100)
committerJens Axboe <axboe@suse.de>
Tue, 8 Nov 2005 09:08:04 +0000 (10:08 +0100)
fio.c

diff --git a/fio.c b/fio.c
index 271afe557a750f56ed218a1bc46648993cc3e714..898e0627a65985f46830fcb45e2ac97b01657979 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -323,6 +323,8 @@ struct thread_data {
        struct io_log *bw_log;
 
        struct timeval start;
+       struct rusage ru_start;
+       struct rusage ru_end;
 
        struct list_head io_hist_list;
 };
@@ -1638,6 +1640,8 @@ static void *thread_main(int shm_id, int offset, char *argv[])
 
        gettimeofday(&td->start, NULL);
 
+       getrusage(RUSAGE_SELF, &td->ru_start);
+
        while (td->loops--) {
                gettimeofday(&td->stat_sample_time, NULL);
 
@@ -1670,6 +1674,7 @@ static void *thread_main(int shm_id, int offset, char *argv[])
        }
 
        td->runtime = mtime_since_now(&td->start);
+       getrusage(RUSAGE_SELF, &td->ru_end);
        ret = 0;
 
        if (td->bw_log)
@@ -1728,8 +1733,8 @@ static int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max,
 static void show_thread_status(struct thread_data *td)
 {
        int prio, prio_class;
-       unsigned long min, max, bw = 0;
-       double mean, dev;
+       unsigned long min, max, bw = 0, ctx;
+       double mean, dev, usr_cpu, sys_cpu;
 
        if (!td->io_bytes && !td->error)
                return;
@@ -1748,6 +1753,23 @@ static void show_thread_status(struct thread_data *td)
                printf("  clat (msec): min=%5lu, max=%5lu, avg=%5.02f, dev=%5.02f\n", min, max, mean, dev);
        if (calc_lat(&td->bw_stat, &min, &max, &mean, &dev))
                printf("  bw (KiB/s) : min=%5lu, max=%5lu, avg=%5.02f, dev=%5.02f\n", min, max, mean, dev);
+
+       if (td->runtime) {
+               unsigned long t;
+
+               t = mtime_since(&td->ru_start.ru_utime, &td->ru_end.ru_utime);
+               usr_cpu = (double) t * 100 / (double) td->runtime;
+
+               t = mtime_since(&td->ru_start.ru_stime, &td->ru_end.ru_stime);
+               sys_cpu = (double) t * 100 / (double) td->runtime;
+       } else {
+               usr_cpu = 0;
+               sys_cpu = 0;
+       }
+
+       ctx = td->ru_end.ru_nvcsw + td->ru_end.ru_nivcsw - (td->ru_start.ru_nvcsw + td->ru_start.ru_nivcsw);
+
+       printf("  cpu        : usr=%3.2f%%, sys=%3.2f%%, ctx=%lu\n", usr_cpu, sys_cpu, ctx);
 }
 
 static int setup_rate(struct thread_data *td)