Linux Command - iostat
The Linux iostat command is used to display CPU and IO stats.
“On multiprocessor systems, CPU statistics are calculated system-wide as averages among all processors.”
The iostat command is part of the sysstat package. If iostat isn’t available on your system you may need to install sysstat first:
sudo apt install sysstat # Debian/Ubuntu/Mint
sudo yum install sysstat # RHEL/Fedora
sudo zypper install sysstat # OpenSUSE
sudo pacman -S sysstat # Arch Linux
sudo emerge -a app-admin/sysstat # Gentoo
Basic command format:
iostat interval count
interval | time in seconds between reports |
count | number of times to repeat report |
Report every 3 seconds continously:
iostat 3
Report every 2 seconds for 8 times:
iostat 2 8
JSON output:
iostat -o JSON 1 4
Options
Report:
-c | CPU utilization report. |
-d | Device utilization report. |
More:
-x | Display extended statistics. |
-s | Display a short (narrow) version of the report ( 80 char ) |
-y | Omit first report with stats since boot, if multple reports |
-z | omit output for devs with no activity |
Output:
-o JSON | json output |
–pretty | more human readable ( devs on right and sub reports) |
–compact | don’t break into sub reports ( useful with –pretty ) |
–human | human readable sizes |
-h | combines –human and –pretty |
Partitions:
-p | display for partitions |
-p ALL | display for all partitions, even non used |
-p sda | display for partitions, for this device |
More:
-j ID,LABEL,PATH,UUID,… device […],ALL ] | use persistent names |
-t | Print the time for each report displayed. |
Less useful/common options:
-k | Display statistics in kilobytes per second. |
-m | Display statistics in megabytes per second. |
-N | Display the registered device mapper names for any device mapper devices. |
-f directory | only use files from this dir |
+f directory | use standard kernel files and and files in this dir |
-g group_name { device […],ALL } | Display statistics for a group of devices. |
-H | global stats for groups, use with -g option |
–dec=xx | number of decimal places ( 2 is default ) |
-V | Print version number then exit. |
Reports
This section just covers what each field means.
CPU Utilization Report
%user | CPU utilization percentage at user level (application) |
%nice | CPU utilization percentage at user level with nice priority. |
%system | CPU utilization percentage atthe system level (kernel) |
%iowait | percentage of time that the CPU or CPUs were idle during outstanding disk I/O request |
%steal | percentage of time spent in involuntary wait while hypervisor servicing another virtual processor |
%idle | percentage of time that the CPU or CPUs were idle and the system did not have an outstanding disk I/O request. |
Device Utilization Report
Normal output fields:
Device: device (or partition) name as listed in the /dev directory. |tps | transfers ( I/O requests ) per second. Multiple logical requests per I/O request. A transfer is of indeterminate size.| |Blk_read/s (kB_read/s, MB_read/s) | blocks/kB/MB read per second| |Blk_wrtn/s (kB_wrtn/s, MB_wrtn/s) | blocks/kB/MB written per second| |Blk_dscd/s (kB_dscd/s, MB_dscd/s) | blocks/kB/MB data discarded per second| |Blk_read (kB_read, MB_read) | blocks/kB/MB data read| |Blk_wrtn (kB_wrtn, MB_wrtn) | blocks/kB/MB data written| |Blk_dscd (kB_dscd, MB_dscd) | blocks/kB/MB data discarded|
Short version output fields ( -s ):
Blk_w+d/s (kB_w+d/s, MB_w+d/s) | blocks/kB/MB data written or discarded per second |
Blk_w+d (kB_w+d, MB_w+d) | blocks/kB/MB data written or discarded |
Extended output fields ( -x ):
r/s | read requests completed per second for the device. (after merges) |
w/s | write requests completed per second for the device. (after merges) |
d/s | discard requests completed per second for the device. (after merges) |
f/s | flush requests completed per second for the device. (not tracked by partition, flush ops count as writes before merge) |
rsec/s (rkB/s, rMB/s) | sectors (kilobytes, megabytes) read from the device per second. |
wsec/s (wkB/s, wMB/s) | sectors (kilobytes, megabytes) written to the device per second. |
dsec/s (dkB/s, dMB/s) | sectors (kilobytes, megabytes) discarded for the device per second. |
rrqm/s | read requests merged per second that were queued to the device. |
wrqm/s | write requests merged per second that were queued to the device. |
drqm/s | discard requests merged per second that were queued to the device. |
%rrqm | read requests merged together before being sent to the device. |
%wrqm | write requests merged together before being sent to the device. |
%drqm | discard requests merged together before being sent to the device. |
rareq-sz | average size (in kilobytes) of the read requests |
wareq-sz | average size (in kilobytes) of the write requests |
dareq-sz | average size (in kilobytes) of the discard requests |
r_await | average time (in milliseconds) for read requests |
w_await | average time (in milliseconds) for write requests |
d_await | average time (in milliseconds) for discard requests |
f_await | average time (in milliseconds) for flush requests ( requests could be longer because they are batched). |
aqu-sz | average queue length of the requests that were issued to the device. ( old version was avgqu-sz ) |
%util | Percentage of elapsed time I/O requests were issued (bandwidth utilization, saturation occurs at 100% for devs serving requests serially) |
Not actually included in any output ( other variations of these are and this may change with different versions of the tool ):
sec/s (kB/s, MB/s) | sectors (kilobytes, megabytes) read from, written to or discarded for the device per second. |
rqm/s | I/O requests merged per second that were queued to the device. |
areq-sz | average size (in kilobytes) of the I/O requests ( old version field was: avgrq-sz ) |
await | average time (in milliseconds) for I/O requests |