Quick take: iostat -x 2 shows extended per-device disk statistics refreshed every 2 seconds. Key metrics are %util (device busy percentage), await (average I/O wait time in ms), rMB/s and wMB/s (read/write throughput).

Introduction

iostat (I/O Statistics) is part of the sysstat package and reports CPU utilization and disk I/O statistics per device. It is the standard tool for diagnosing whether poor application performance is caused by a disk bottleneck — too many requests queuing, high latency, or a device running at capacity.

Without iostat, you might spend hours tuning application code or database queries when the real problem is a spinning disk saturated at 95% utilization. iostat tells you in seconds.

Install iostat

# Ubuntu / Debian
sudo apt install sysstat

# RHEL / CentOS / Rocky
sudo dnf install sysstat

# Verify
iostat -V

Syntax

iostat [OPTIONS] [device] [interval] [count]

interval is the refresh interval in seconds. count is how many reports to print before exiting. Omitting both prints one cumulative report since boot.

Common Options

OptionDescription
-xExtended statistics (includes await, %util, queue depth)
-mShow throughput in MB/s instead of KB/s
-dShow device statistics only (no CPU)
-cShow CPU statistics only (no devices)
-p deviceShow statistics for a specific device and its partitions
-hHuman-readable output (auto-scales units)
-tShow timestamp for each report
-NShow device mapper names (LVM/RAID)

Practical Examples

# Basic report — all devices since boot
iostat

# Extended stats, refresh every 2 seconds
iostat -x 2

# Extended stats in MB/s, every 5 seconds
iostat -xm 5

# Monitor a specific device
iostat -x sda 2

# Monitor with device mapper names (shows LVM volume names)
iostat -xN 2

# Show only disk stats (no CPU) with timestamps
iostat -dtm 5

# 10 reports at 2-second intervals then stop
iostat -x 2 10

# Show partitions
iostat -p sda -x

Reading iostat Output

The basic output section:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.34    0.00    0.87    12.45    0.00   84.34

%iowait is the most important CPU metric: percentage of time the CPU was idle while waiting for I/O. Values consistently above 20–30% indicate a disk bottleneck stalling the CPU.

The extended device section (-x):

Device  r/s  w/s  rMB/s  wMB/s  await  r_await  w_await  %util
sda    45.2  23.1   2.18   1.45   8.23     5.12    14.67  68.4
sdb     2.1   0.8   0.10   0.04   1.05     0.90     1.32   0.8

Key columns explained:

  • r/s, w/s — reads and writes per second (IOPS)
  • rMB/s, wMB/s — throughput in megabytes per second
  • await — average total I/O completion time in milliseconds (queue + service)
  • r_await, w_await — separate read and write await times
  • %util — percentage of time the device was busy; near 100% means saturation

Diagnosing Disk Problems

High %util (>80%) with high await: The disk is saturated. Either the workload exceeds disk capacity or a specific process is monopolizing I/O. Check with iotop to find the process.

# Find which process is doing the most I/O
sudo iotop -o

High %iowait in CPU report: Application threads are stalling waiting for disk. This is a disk bottleneck in the CPU's view — the CPU is available but waiting on storage.

High await but low %util (on SSDs): May indicate I/O queue depth issues or filesystem overhead. Check aqu-sz (average queue size) — consistently high queues on SSDs suggest driver or queue configuration problems.

Final Thoughts

Make iostat -xm 2 your default disk monitoring command. The combination of %util, await, and throughput metrics tells you immediately whether you have a disk bottleneck, and if so, which device and in which direction (read vs write). Pair it with iotop to identify the specific process driving the load.

FAQ: iostat Command in Linux

How do I install iostat on Ubuntu?+

iostat is part of the sysstat package. Install it with sudo apt install sysstat. After install, run iostat to verify it works.

What does the %util column mean in iostat -x output?+

%util shows the percentage of time the device was busy servicing I/O requests. Values near 100% indicate the disk is saturated. For SSDs, %util can be misleading — look at await and r_await/w_await instead.

How do I monitor disk I/O continuously with iostat?+

Run iostat -x 2 to refresh every 2 seconds. The first report is cumulative since boot; subsequent reports show the interval since the last refresh. Use iostat -x 2 10 to run exactly 10 intervals then stop.

What is the difference between iostat and vmstat?+

iostat focuses on per-device disk I/O statistics and CPU time breakdown. vmstat shows system-wide memory, swap, I/O, and CPU in one line per interval. Use iostat to diagnose which disk is saturated; use vmstat for a system-wide overview.

What does await mean in iostat?+

await is the average time (in milliseconds) for I/O requests to complete, including queue time plus service time. High await (above 20ms for spinning disks, above 1ms for NVMe SSDs) indicates the disk is struggling to keep up.

Need help with Linux servers or infrastructure?

Work directly with Muhammad Irfan Aslam for Linux, Ubuntu, Docker, DevOps, cloud, CI/CD, or infrastructure support.

Hire Me for Support