Why is my Linux system slow with high I/O wait?

Diagnose high I/O wait on Linux: find the saturated disk and the process causing it, then lower its I/O priority so the system responds again.

LinuxProcessesiotopmonitoringperformancediskiostatMedium risk
Run iostat -x 2 5 first to see which disk is saturated, then use iotop to find the process causing the load.

What this covers

High I/O wait means the CPU is idle while waiting for disk. The fix is to identify the busy disk, find the process, and deprioritize it. This guide walks through diagnosis to verification.

Symptom

?The system feels sluggish, load average is high, but CPU usage is low. top or vmstat shows a high wa value, disk activity lights stay on, and applications freeze for seconds at a time.

Check which disk is saturated with iostat -x

High I/O wait usually means one disk is at 100% utilization. Extended iostat stats show %util and await per device, so you can tell whether the bottleneck is a single disk or an array. Look for %util near 100 and await far above normal; that device is causing the slowdown.

iostat -x prints extended per-device statistics — r/s, w/s, await, and %util — refreshed on an interval so you can watch saturation.

Command
$ iostat -x 2 5

Find the process doing the I/O with iotop

Once you know which disk is busy, you need the process responsible. iotop shows read/write rates per process in real time, so you can identify the backup, indexer, or runaway service that is hammering the disk. Run it with sudo; the -o flag shows only processes actually doing I/O.

Use iotop to see exactly which process is reading and writing your disk in real time.

Command
$ sudo iotop -o -a

Lower the I/O priority with ionice

If the heavy I/O process does not need to finish immediately, push it into the idle I/O class with ionice. That lets interactive work and system services get disk time first, so the machine stops stuttering while the background job continues. Check that the PID is correct before applying; ionice takes -p with the PID.

LinuxSet disk I/O priority with ioniceMedium riskStep 3

Push backups, indexing and file scans into the idle I/O class so interactive work never stutters.

Command
$ sudo ionice -c 3 -p $(pidof updatedb)

Confirm I/O wait has dropped with vmstat

After changing I/O priority, watch the wa column in vmstat. It should fall toward zero while the machine feels responsive again. If wa stays high, the disk itself may be failing or the workload is too heavy for the hardware; check disk health and consider rescheduling jobs.

vmstat gives a compact one-line-per-interval view of CPU usage, swap activity, and I/O waits that top doesn't summarize as clearly.

Command
$ vmstat 2 5
!ionice only changes priority; it does not fix a failing disk or a workload that is too heavy for the hardware. Applying it to the wrong PID (especially a critical system process) can slow essential services. Double-check the PID before running it with sudo.

How to confirm it worked

After lowering the I/O priority, vmstat's wa column drops toward zero and the system responds normally. iostat shows lower %util on the previously saturated device.

Sources

  • vmstat(8) - Linux manual page
    Ubuntu Manpages · technical · 2026-09-17
    Evidence: vmstat reports virtual memory statistics; the interval and count arguments run it repeatedly, and columns include si/so swap activity and wa I/O wait.
  • ionice(1) — Arch Manual Pages
    Arch Linux · community · 2026-09-17
    Evidence: Shows ionice [-c class] [-n level] [-t] -p pid usage and describes the idle class which only gets disk time when nobody else needs it.
  • ionice(1) — Debian bookworm
    Debian Manpages · community · 2026-09-17
    Evidence: SYNOPSIS ionice [-c class] [-n level] [-t] -p PID and options --class, --classdata, --pid are documented, including class 3 = idle.
  • iotop(8) — Arch Linux manual
    Arch Linux · community · 2026-09-17
    Evidence: Arch manual describes iotop's --only (-o) option to show only processes or threads actually doing I/O
  • iostat(1) - Report CPU statistics and I/O statistics for devices
    Ubuntu Manpages · technical · 2026-09-17
    Evidence: -x shows extended statistics; interval and count parameters report repeatedly; %util is the percentage of elapsed time during which the device was busy.
  • iotop(8) — Debian manpage
    Debian · community · 2026-09-17
    Evidence: Debian manpage for iotop documents -o (only show processes actually doing I/O) and -a (accumulated I/O) options

Last verified: 2026-09-22

Related guides