Server Load Is High — Find What's Actually Causing It

High load means runnable tasks are waiting. It can be CPU, I/O, or both — and treating the wrong one makes it worse. A five-command triage tells you which resource is the real bottleneck.

What you'll see

Root causes

Genuine CPU saturation

load / cores > 1 sustained with high %us/%sy. Find the consumer: top (P to sort by CPU), pidstat -u 1, then drill into threads (top -H -p <pid>).

I/O wait — load without CPU

High %wa in top means processes sleep on disk/NFS. iostat -x 1 shows util and await per device; pidstat -d 1 shows who does the I/O. Slow disks masquerade as 'app slowness'.

Uninterruptible (D-state) pileups

ps -eo state,pid,cmd | grep '^D' — processes stuck in disk/network I/O inflate load while consuming no CPU. NFS hangs and dying disks are the classics.

Fix it

  1. Load vs cores, and CPU vs wait split
    nproc && uptime && top -bn1 | head -5   # read the %Cpu(s) line: us vs wa vs sy vs st
  2. If %wa is high: identify the disk and the process
    iostat -x 1 3 2>/dev/null | tail -20; pidstat -d 1 3 2>/dev/null | tail -10   # apt install sysstat if missing
  3. If %us is high: name the process and its threads
    ps -eo pid,pcpu,pmem,comm --sort=-pcpu | head -8; top -H -p <pid>   # strace -c -p <tid> for syscall-level digging
  4. If %st is non-zero: you're a noisy VM neighbor
    # %st = steal time. That's the hypervisor servicing other tenants — nothing to fix in-guest; resize or migrate the VM
  5. Check D-state processes for stuck I/O
    ps -eo state,pid,wchan:20,cmd | awk '$1=="D"' | head

Field note

Load average counts running + uninterruptible tasks — that's why it can be huge with idle CPUs during disk hangs. vmstat 1 is the fastest single overview: r (runnable), b (blocked), wa (iowait), si/so (swap).

Common questions

What load average is actually 'high'?

Compare to core count: load 4 on 8 cores is fine; load 8 sustained is saturated (CPU or I/O). The number alone doesn't say which — the %Cpu wa/us split and D-state check do.

Load is high but CPU is nearly idle — is the number lying?

It's I/O: tasks blocked on disk or NFS (D-state) count toward load. Run iostat -x 1 and look for high util/await on a device, then find the writing process with pidstat -d.

Ship it right the first time

Our most-documented failures, packaged as ready-to-ship starter kits: Docker, Kubernetes, and Terraform.

Browse the template store →

One-time. Yours to modify. Instant download from the NinjaOps template store.