Skip to main content
To check disk I/O on Linux, install sysstat and run iostat -xyz 5 to see each disk’s reads and writes per second, wait time (r_await, w_await) and busy time (%util). Then find the process doing the I/O with sudo iotop-c -o (Ubuntu/Debian) or pidstat -d 5, which works on every distribution. High %iowait in top is the usual first sign of a disk bottleneck.

Before you start

  • Connect with SSH. Root users can leave out sudo.
  • These tools only read statistics. They don’t add load or change data.
  • Know your disk name: run lsblk -d. VPS disks are usually vda or sda; NVMe disks on dedicated servers are nvme0n1.

How to install iostat and iotop

sysstat provides iostat and pidstat. iotop-c is the maintained C version of iotop.

How to check disk I/O with iostat

-x shows extended statistics, -y skips the first report (an average since boot), -z hides idle disks, and 5 prints a new report every 5 seconds. Press Ctrl+C to stop.
The real output has more columns; these are the ones that matter most.
The iostat manual warns that %util near 100% means saturation only for devices that handle one request at a time. SSDs, NVMe drives, RAID arrays and virtual disks handle many requests in parallel, so for them look at await and aqu-sz too.

How to find which process is using the disk

-o shows only processes doing I/O and -P shows processes instead of threads. Press q to quit. For a log-friendly snapshot:

Why iotop shows “unavailable” in the SWAPIN and IO columns

Since Linux 5.14 the kernel’s task delay accounting is off by default, and iotop needs it for those two columns. Turn it on while you investigate:
Turn it off again afterwards with sudo sysctl kernel.task_delayacct=0. The iotop manual advises keeping it off when not in use because it costs some performance. In interactive iotop, Ctrl+T toggles it.

What causes high disk I/O and how to fix it

To make a job yield to everything else, run it in the idle I/O class:
-c3 (idle) only gets disk time when no other program has asked for disk I/O for a short grace period. Ordinary users can use the idle class; the realtime class (-c1) needs root and can starve other programs, so avoid it.

How to check it worked

Run iostat -xyz 5 again after your change. await and aqu-sz should fall, and %iowait in top should drop close to 0 when the server is quiet.

Frequently asked questions

What is a normal await value?

There is no single number. It depends on the disk type and request size. Measure when the server is healthy and compare with that baseline; a sudden jump is what matters.

How do I measure maximum disk speed?

Use fio with a test file. It creates heavy load, so read benchmark your VPS first.

Why does iostat show different numbers the first time?

The first report is the average since boot. -y skips it, so you only see live values.

Is high iowait always a disk problem?

Usually, but network storage and a full swap can also cause it. Check vmstat 1 5 for swap activity (si/so) and the disk health with smartctl on dedicated servers.

VPS and dedicated server guides

Every server guide in one place.

Benchmark your VPS

fio, YABS and Geekbench.

What is load average?

Why disk waits raise the load.

Find what is using disk space

du and ncdu.

Check disk health

SMART tests on physical disks.

VPS Panel resource graphs

Disk activity over time.

Checked against the iostat(1), pidstat(1), iotop and ionice(1) manuals on 4 November 2026; commands tested on Ubuntu 24.04 LTS (sysstat 12.6.1, iotop-c 1.26). Commands can differ on other distributions or releases.

Need Extra Help?

If you encounter any issues, our support team is ready to assist:

Save on Your Hosting

Ready to upgrade your hosting? Use code KB20 at checkout for 20% off your first order!

Last Updated: November 2026