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.
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
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.
$ iostat -x 2 5Find 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.
$ sudo iotop -o -aLower 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.
Push backups, indexing and file scans into the idle I/O class so interactive work never stutters.
$ 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.
$ vmstat 2 5How 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 pageEvidence: 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 PagesEvidence: 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 bookwormEvidence: SYNOPSIS ionice [-c class] [-n level] [-t] -p PID and options --class, --classdata, --pid are documented, including class 3 = idle.
- iotop(8) — Arch Linux manualEvidence: 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 devicesEvidence: -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 manpageEvidence: 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
A terminal walkthrough to find the process behind constant disk I/O on Linux, confirm it is a sustained hog, and verify the disk has calmed down.
A practical checklist for finding which ports are open on a Linux machine or across your network, from local sockets to a full nmap scan.
A terminal-first workflow to diagnose high CPU usage on Linux, identify the responsible process or service, and fix it without losing your work.