iostat — quick reference
Default reports and intervals
| When to use | Command |
|---|---|
| CPU and disk stats since boot (or last boot) | iostat |
| Refresh every N seconds | iostat N |
| N samples at M-second intervals | iostat M N |
| Show version (sysstat package) | iostat -V |
CPU only
| When to use | Command |
|---|---|
| CPU utilization report only | iostat -c |
| CPU stats every 2 seconds | iostat -c 2 |
| CPU report with timestamp | iostat -c -t |
Disk devices
| When to use | Command |
|---|---|
| Device throughput only (no CPU header) | iostat -d |
| Extended disk stats (await, %util, …) | iostat -x |
| Extended stats every 2 seconds | iostat -x 2 |
| One device only | iostat -x sda |
| Hide devices with zero activity | iostat -z |
| Show device-mapper names instead of dm-N | iostat -N |
Partitions and units
| When to use | Command |
|---|---|
| Include partition rows | iostat -p |
| Partitions on one disk | iostat -p sda |
| All partitions including idle | iostat -p ALL |
| Kilobytes per second | iostat -k |
| Megabytes per second | iostat -m |
| Timestamp on each report | iostat -t |
Structured output
| When to use | Command |
|---|---|
| JSON output for scripts | iostat -o JSON |
| Extended disk stats as JSON | iostat -x -o JSON |
| Shorter column widths | iostat -s |
iostat — command syntax
Synopsis from sysstat 12.7.5 on Ubuntu 25.04:
iostat [ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -s ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ --dec={ 0 | 1 | 2 } ] [ -j { ID | LABEL | PATH | UUID | ... } ]
[ -o JSON ] [ -p { <device> [,...] | ALL } ] [ <interval> [ <count> ] ]iostat reads kernel counters; it does not change system state. Historical archives for sar need the sysstat data collector enabled (systemctl enable --now sysstat on Debian/Ubuntu); see the systemctl command for enabling collector units.
iostat — command examples
Essential Default CPU and disk summary
The first screen after boot averages — useful baseline before you add intervals.
Run the command:
iostat | head -15Sample output:
Linux 7.0.0-27-generic (server1) 07/01/2026 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.16 0.04 13.02 1.59 0.00 78.18
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
dm-0 172.93 6243.01 165.76 0.00 1916105 50876 0
sda 93.64 4115.49 135.61 0.00 1273344 41984 0tps is transfers per second; kB_read/s and kB_wrtn/s are throughput rates.
Essential Live samples every second (interval count)
Pass interval and count to watch a workload for a fixed window.
Run the command:
iostat 1 2 | head -25Sample output:
Linux 7.0.0-27-generic (server1) 07/01/2026 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.17 0.04 13.03 1.59 0.00 78.17
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
dm-0 172.88 6241.18 165.71 0.00 1916105 50876 0
sda 93.64 4115.49 135.61 0.00 1273344 41984 0
avg-cpu: %user %nice %system %iowait %steal %idle
4.02 0.00 5.03 0.00 0.00 90.95The second avg-cpu block is the 1-second sample; compare %iowait across intervals during a slow job.
Essential CPU utilization only (-c)
When disk noise is not needed, -c drops the device table.
Run the command:
iostat -cSample output:
Linux 7.0.0-27-generic (server1) 07/01/2026 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.16 0.04 13.02 1.59 0.00 78.18High %iowait means CPUs were idle waiting for disk I/O — pair with iostat -x on devices.
Common Extended disk metrics (-x)
-x adds latency and utilization columns — the usual starting point for disk bottlenecks.
Run the command:
iostat -x sdaSample output:
Linux 7.0.0-27-generic (server1) 07/01/2026 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.17 0.04 13.02 1.59 0.00 78.18
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz f/s f_await aqu-sz %util
sda 78.27 4115.49 29.81 27.58 1.35 52.58 8.44 135.61 11.71 58.11 2.07 16.06 0.00 0.00 0.00 0.00 0.00 0.00 1.10 2.16 0.13 7.53Watch %util near 100% and await rising — signs the device cannot keep up.
Common Device table without CPU (-d)
Scripts that only care about disk throughput use -d to skip the CPU header.
Run the command:
iostat -d | head -12Sample output:
Linux 7.0.0-27-generic (server1) 07/01/2026 _x86_64_ (2 CPU)
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
dm-0 172.92 6242.60 165.75 0.00 1916105 50876 0
sda 93.64 4115.49 135.61 0.00 1273344 41984 0Add an interval: iostat -d 2 5 for five samples two seconds apart.
Common Throughput in megabytes (-m)
Large sequential workloads are easier to read in MB/s.
Run the command:
iostat -m | head -10Sample output:
Linux 7.0.0-27-generic (server1) 07/01/2026 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.17 0.04 13.03 1.59 0.00 78.17
Device tps MB_read/s MB_wrtn/s MB_dscd/s MB_read MB_wrtn MB_dscd
dm-0 172.89 6.10 0.16 0.00 1871 49 0-k forces kilobytes if your default display differs.
Common Partition-level stats (-p)
See whether one partition on a disk dominates I/O.
Run the command:
iostat -p | head -12Sample output:
Linux 7.0.0-27-generic (server1) 07/01/2026 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.17 0.04 13.03 1.59 0.00 78.17
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
loop0 0.19 3.54 0.00 0.00 1086 0 0
loop5 1.33 19.05 0.00 0.00 5849 0 0Use iostat -p sda to limit partition rows to one parent disk.
Advanced LVM names with -N
On LVM systems, dm-0 is opaque. -N maps to the volume name.
Run the command:
iostat -N | head -10Sample output:
Linux 7.0.0-27-generic (server1) 07/01/2026 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.15 0.04 12.99 1.58 0.00 78.23
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
ubuntu--vg-ubuntu--lv 172.30 6220.31 165.16 0.00 1916105 50876 0Combine with -x for extended metrics on named volumes.
Advanced JSON for monitoring scripts (-o JSON)
Export structured data for dashboards or jq parsing.
Run the command:
iostat -o JSON | head -20Sample output:
{"sysstat": {
"hosts": [{
"nodename": "server1",
"sysname": "Linux",
"release": "7.0.0-27-generic",
"machine": "x86_64",
"number-of-cpus": 2,
"date": "07/01/2026",
"statistics": [
{
"avg-cpu": {"user": 7.15, "nice": 0.04, "system": 12.99, "iowait": 1.58, "steal": 0.00, "idle": 78.23},
"disk": [
{"disk_device": "dm-0", "tps": 172.29, "kB_read/s": 6220.11, "kB_wrtn/s": 165.16, "kB_dscd/s": 0.00, "kB_read": 1916105, "kB_wrtn": 50876, "kB_dscd": 0},Pipe to jq to extract one field in automation.
Advanced Timestamped reports (-t)
Correlate disk spikes with wall-clock time in logs.
Run the command:
iostat -t | head -10Sample output:
Linux 7.0.0-27-generic (server1) 07/01/2026 _x86_64_ (2 CPU)
07/01/2026 03:35:38 PM
avg-cpu: %user %nice %system %iowait %steal %idle
7.17 0.04 13.03 1.59 0.00 78.17
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
dm-0 172.89 6241.59 165.73 0.00 1916105 50876 0Use iostat -xt 2 during a deployment window.
iostat — when to use / when not
| Use iostat when | Use something else when |
|---|---|
|
iostat vs iotop
| iostat | iotop | |
|---|---|---|
| View | Block devices | Processes / threads |
| Key metrics | tps, await, %util | DISK READ/WRITE per task |
| Privilege | User | root |
| Best question | "Is the disk saturated?" | "Who is writing?" |
Related commands
Browse the full index in our Linux commands reference.
iostat — interview corner
What is iostat?
iostat is part of sysstat. It prints CPU utilization and disk I/O statistics per device from kernel counters — either since boot or over sampling intervals.
iostat -x 1 3A strong answer is:
"iostat from sysstat shows CPU iowait and per-device throughput and latency. -x adds await and %util for bottleneck analysis."
What are tps and %util?
tps is I/O transfers per second to the device. %util is the percentage of time the device had at least one request in flight — near 100% means the disk is busy most of the sample.
A strong answer is:
"tps counts I/O operations per second; %util is how busy the device was. High %util with high await means a saturated or slow disk."
What does high %iowait mean?
%iowait is CPU time spent idle while waiting for block I/O. It suggests storage or I/O stack delay, not necessarily high CPU user time.
A strong answer is:
"High iowait means CPUs were waiting on disk. I check iostat -x on devices and iotop for the process driving I/O."
How do you read await?
await is average milliseconds for I/O requests (reads and writes combined on the device). Compare across disks and against SLA expectations for your storage type.
A strong answer is:
"await is average I/O completion time in ms. Rising await under load with high %util indicates the device is struggling to keep up."
iostat vs sar?
iostat is for live snapshots on the terminal. sar reads historical sysstat archives when sysstat collection is enabled.
A strong answer is:
"iostat is real-time; sar is historical from /var/log/sysstat. Both come from sysstat."
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
command not found |
sysstat not installed | sudo apt install sysstat |
| sar has no history | Collector disabled | sudo systemctl enable --now sysstat |
| Too many loop devices | Snap/LVM clutter | iostat -z or filter device names |
dm-0 not meaningful |
Device mapper | Add -N for LVM names |
-h prints stats not help |
sysstat uses -h for human sizes on some versions |
Use man iostat for options |
