diff options
authorJens Axboe <>2005-12-07 20:20:27 +0100
committerJens Axboe <>2005-12-07 20:20:27 +0100
commite20d30479fd0ea6807b9636bc49dc49e36e5b29f (patch)
parent28f0d681668aaccb4f4a937b7771c313662685b0 (diff)
[PATCH] fio: add full explanation of the output of fio
2 files changed, 92 insertions, 1 deletions
diff --git a/README.fio b/README.fio
index c93a22d..66022aa 100644
--- a/README.fio
+++ b/README.fio
@@ -106,3 +106,89 @@ subsequent jobs.
Also see the examples/ dir for sample job files.
+Interpreting the output
+fio spits out a lot of output. While running, fio will display the
+status of the jobs created. An example of that would be:
+Threads now running: 2 : [ww] [5.73% done]
+The characters inside the square brackets denote the current status of
+each thread. The possible values (in typical life cycle order) are:
+P Thread setup, but not started.
+C Thread created and running, but not doing anything yet
+ R Running, doing sequential reads.
+ r Running, doing random reads.
+ W Running, doing sequential writes.
+ w Running, doing random writes.
+V Running, doing verification of written data.
+E Thread exited, not reaped by main thread yet.
+_ Thread reaped.
+The other values are fairly self explanatory - number of thread currently
+running and doing io, and the estimated completion percentage.
+When fio is done (or interrupted by ctrl-c), it will show the data for
+each thread, group of threads, and disks in that order. For each data
+direction, the output looks like:
+Client1 (g=0): err= 0:
+ write: io= 32MiB, bw= 666KiB/s, runt= 50320msec
+ slat (msec): min= 0, max= 136, avg= 0.03, dev= 1.92
+ clat (msec): min= 0, max= 631, avg=48.50, dev=86.82
+ bw (KiB/s) : min= 0, max= 1196, per=51.00%, avg=664.02, dev=681.68
+ cpu : usr=1.49%, sys=0.25%, ctx=7969
+The client number is printed, along with the group id and error of that
+thread. Below is the io statistics, here for writes. In the order listed,
+they denote:
+io= Number of megabytes io performed
+bw= Average bandwidth rate
+runt= The runtime of that thread
+ slat= Submission latency (avg being the average, dev being the
+ standard deviation). This is the time it took to submit
+ the io.
+ clat= Completion latency. Same names as slat, this denotes the
+ time from submission to completion of the io pieces.
+ bw= Bandwidth. Same names as the xlat stats, but also includes
+ an approximate percentage of total aggregate bandwidth
+ this thread received in this group. This last value is
+ only really useful if the threads in this group are on the
+ same disk, since they are then competing for disk access.
+cpu= CPU usage. User and system time, along with the number
+ of context switches this thread went through.
+After each client has been listed, the group statistics are printed. They
+will look like this:
+Run status group 0 (all jobs):
+ READ: io=64MiB, aggrb=22178, minb=11355, maxb=11814, mint=2840msec, maxt=2955msec
+ WRITE: io=64MiB, aggrb=1302, minb=666, maxb=669, mint=50093msec, maxt=50320msec
+For each data direction, it prints:
+io= Number of megabytes io performed.
+aggrb= Aggregate bandwidth of threads in this group.
+minb= The minimum average bandwidth a thread saw.
+maxb= The maximum average bandwidth a thread saw.
+mint= The minimum runtime of a thread.
+maxt= The maximum runtime of a thread.
+And finally, the disk statistics are printed. They will look like this:
+Disk stats (read/write):
+ sda: ios=16398/16511, merge=30/162, ticks=6853/819634, in_queue=826487, util=100.00%
+Each value is printed for both reads and writes, with reads first. The
+numbers denote:
+ios= Number of ios performed by all groups.
+merge= Number of merges io the io scheduler.
+ticks= Number of ticks we kept the disk busy.
+io_queue= Total time spent in the disk queue.
+util= The disk utilization. A value of 100% means we kept the disk
+ busy constantly, 50% would be a disk idling half of the time.
diff --git a/fio.c b/fio.c
index 5f7d53d..89f8e92 100644
--- a/fio.c
+++ b/fio.c
@@ -1797,7 +1797,7 @@ static void show_thread_status(struct thread_data *td,
if (!(td->io_bytes[0] + td->io_bytes[1]) && !td->error)
- printf("Client%d (g=%d): err=%2d:\n", td->thread_number, td->groupid, td->error);
+ printf("Client%d (groupid=%d): err=%2d:\n", td->thread_number, td->groupid, td->error);
show_ddir_status(td, rs, td->ddir);
show_ddir_status(td, rs, td->ddir ^ 1);
@@ -2145,6 +2145,11 @@ static void show_run_stats(void)
rs->agg[1] = (rs->io_mb[1]*1024*1000) / rs->max_run[1];
+ /*
+ * don't overwrite last signal output
+ */
+ printf("\n");
for (i = 0; i < thread_number; i++) {
td = &threads[i];
rs = &runstats[td->groupid];