iostat -x -d
can display many i/o statistic info. For util of iostat, the explanation is :
Percentage of CPU time during whic
iostat -x
(I used an old version of the source code to write this up before realizing it) displays information from /proc/diskstats
(documented here) and /proc/stat
(for CPU times; see man proc(5)) (and a few others, but that's not important for understanding).
You can see the relevant snippets of code in osgx's answer, but I couldn't make sense of them in isolation, so here's an extended explanation:
%util = blkio.ticks / deltams * 100%
deltams
is the time elapsed since last snapshot in ms. It uses CPU stats from /proc/stat
presumably because it gives better results than to rely on system time, but I don't know for sure. (Side note: for some reason the times are divided by HZ
, while the documentation states it's in USER_HZ
, I don't understand that.)blkio.ticks
is "# of milliseconds spent doing I/Os", from /proc/diskstats docs:
Field 9 -- # of I/Os currently in progress
The only field that should go to zero. Incremented as requests are
given to appropriate struct request_queue and decremented as they finish.
Field 10 -- # of milliseconds spent doing I/Os
This field increases so long as field 9 is nonzero.
i.e. my understanding is that ticks
is the number of ticks when any I/O request (for this device) was in progress multiplied by the duration between ticks.
So %util = 100%
means that each time the kernel looked (I guess it's 1000 times per second on modern kernels, see "HZ"), an I/O request was in progress.
Here's an excerpt from another post on iostat:
[%util is] how much time did the storage device have outstanding work (was busy).
In proper RAID environments it is more like “how much time did at least one disk in RAID array have something to do”. I’m deliberately excluding any kind of cache here – if request can be served from cache, the chance is quite negligible it will show up in %util, unlike in other values.
What this also means – the RAID subsystem can be loaded from 6.25% (one disk doing the work) to 100% (all of them busy). Thats quite a lot of insight in single value of ’100%’, isn’t it?