Using iostat

iostat reports CPU utilization and disk I/O statistics. It is the primary tool for diagnosing disk-related performance problems. When your application is slow, CPU is mostly idle, and processes are in D state (uninterruptible sleep), iostat will show which disk is saturated. The extended output (-x) provides the metrics that matter: await (I/O latency), %util (disk saturation), and throughput.

iostat basics

sudo apt install -y sysstat

iostat             # One-shot summary since last reboot
iostat 1 5         # 1-second intervals, 5 samples (skip first line — averages since boot)

iostat basic output

avg-cpu:  %user  %system  %iowait  %steal   %idle
           34.5     8.2      2.1     0.0    55.2

Device    tps    kB_read/s  kB_wrtn/s  kB_read  kB_wrtn
sda      45.2      892.1      445.2   123456    67890
sdb       1.2        4.5     8924.1     5678  9876543

Extended statistics

# Extended stats with -x flag (the useful columns):
iostat -xz 1 3    # -x = extended, -z = skip idle devices

iostat -xz output with column meanings

Device  r/s   w/s  rkB/s   wkB/s  r_await  w_await  svctm  %util
sda    45.2  23.1  892.1   445.2     1.23     0.89   0.45   8.5%
sdb     1.2 892.4    4.5  8924.1   245.30    12.45  18.72  99.8%

Column meanings:
  r/s, w/s    = read/write operations per second (IOPS)
  rkB/s,wkB/s = read/write throughput in KB/s
  r_await     = average read latency in milliseconds
  w_await     = average write latency in milliseconds
  svctm       = service time (actual I/O time, no queue wait)
  %util       = percentage of time the device was busy

Identifying disk bottlenecks

# Interpreting iostat values:
# %util > 80%  = disk is likely a bottleneck
# %util 100%   = disk is saturated, all I/O is queuing

# Normal await times:
# SSD: <1ms for reads, <5ms for writes
# HDD: <20ms for sequential, <50ms acceptable

# await 245ms (like sdb above) = extremely overloaded HDD

# Find which processes are causing the I/O:
sudo iotop    # Interactive view of per-process I/O (requires installation)
sudo apt install -y iotop
sudo iotop -o    # Show only processes with active I/O

# Or use pidstat:
pidstat -d 1 5    # Per-process disk I/O every second

iotop output

TID    PRIO    USER    DISK READ    DISK WRITE    SWAPIN  IO>
1234   be/4  mysql    0.00 B/s   98.45 MB/s     0.00%  87.32%
5678   be/4  www-data  0.00 B/s    2.34 MB/s     0.00%   2.45%
→ mysql is responsible for 98MB/s of writes — check slow query log

Conclusion

The two numbers to watch in iostat -xz: %util above 80% indicates a disk bottleneck, and await above 20ms (HDD) or 5ms (SSD) indicates I/O latency that will slow applications. When you identify a saturated disk, use iotop to find which process is driving the I/O, then correlate with application logs to understand why. Common causes: database not using indexes (causes full table scans), log files growing unbounded, or a backup running during peak hours.

FAQ

Is Using iostat important for Ubuntu administrators?+

Yes. It supports practical Ubuntu administration because it connects directly to server reliability, security, troubleshooting, or daily operations.

Should I practice this on a live server?+

Use a lab VM first. After you understand the command output and rollback path, apply the workflow carefully on real systems.

What should I do after reading this article?+

Run the practice commands, write down what each one shows, and continue to the next article in the Ubuntu roadmap.

Need help with Ubuntu administration?

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

Hire Me for Support