Linux Load Average Explained: uptime, top, CPU Cores, and I/O Wait

Linux & Administration

You run uptime and see three numbers:

load average: 0.42, 0.58, 0.61

Are they percentages? CPU usage? The number of running processes? And at what point is the server overloaded?

Linux load average measures how much work is running or waiting for system resources. The values make sense only when you compare them with the number of CPU cores and investigate what is causing the queue.

Check Load Average with uptime

uptime

Example:

14:26:11 up 18 days,  3:42,  2 users,  load average: 1.24, 0.96, 0.71

The output includes:

  • the current time;
  • how long the server has been running;
  • the number of logged-in users;
  • load average over approximately 1, 5, and 15 minutes.
ValuePeriodWhat it helps show
1.24About 1 minuteVery recent activity
0.96About 5 minutesShort-term trend
0.71About 15 minutesBroader recent baseline

What Linux Load Average Actually Counts

A beginner-friendly mental model is a queue of tasks that are either:

  • running on a CPU;
  • ready to run and waiting for CPU time;
  • waiting in uninterruptible sleep, commonly for I/O.

This last point matters. A high load does not prove that the CPU itself is the bottleneck. Slow storage, a stalled network filesystem, or other I/O waits can raise load while CPUs remain partly idle.

Compare Load with the Number of CPUs

nproc

Suppose the command returns:

4

The operating system can schedule work across four logical CPUs. A simplified interpretation is:

Load on 4 CPUsApproximate interpretation
1.00Plenty of CPU capacity remains
4.00The CPUs are broadly occupied
6.00Some work is running while other work waits
12.00A substantial queue or I/O wait deserves investigation

This is a useful first approximation, not a universal alert rule. Workloads are bursty, logical CPUs are not all equally powerful, and I/O waits can contribute to load.

Normalize load per CPU

You can divide the load by the CPU count to compare servers of different sizes.

normalized load = load average / logical CPU count

For example, load 4 on a 4-CPU VPS gives a normalized value of 1.0. Load 4 on a 16-CPU server gives 0.25.

Read the Direction of the Three Values

The relationship between the 1, 5, and 15 minute values tells you whether pressure is rising or falling.

Load is rising

load average: 6.20, 3.10, 1.40

The recent 1-minute value is much higher than the longer averages. A new spike may be developing.

Load is falling

load average: 1.20, 3.40, 5.80

The immediate load is lower than it was over the previous 5 and 15 minutes. The server may be recovering from a completed backup, deployment, or traffic spike.

Load is steady

load average: 2.10, 2.06, 2.02

The workload has been relatively stable. Whether it is healthy depends on CPU count, response time, and the cause of the load.

Load Average Is Not CPU Usage

CPU usage describes how CPU time is being spent. Load average describes the amount of runnable or uninterruptibly waiting work.

A server can therefore show:

  • high CPU usage and high load because many processes need CPU time;
  • low CPU usage and high load because tasks are stuck waiting for I/O;
  • a brief 100% CPU spike without a serious sustained load problem;
  • moderate CPU usage but poor application latency for a separate reason.

Always compare load with CPU utilization, I/O wait, process state, and user-facing performance.

Inspect CPU and Load with top

top

The first lines show load average, task counts, CPU states, memory, and swap. A CPU line may look like this:

%Cpu(s): 68.4 us, 10.2 sy, 0.0 ni, 18.1 id, 3.0 wa, 0.3 st
FieldMeaningWhat high values may suggest
usUser-space CPU timeApplication, database, compression, or computation work
syKernel CPU timeHeavy system calls, networking, or kernel activity
idIdle CPU timeHigh idle means CPU capacity remains
waTime waiting for I/OStorage or I/O bottlenecks
stTime taken by the hypervisor from this VMHost contention on a virtual server

Press Shift+P in top to sort processes by CPU usage and q to exit.

Find CPU-Hungry Processes

ps -eo pid,user,stat,%cpu,%mem,comm --sort=-%cpu | head

This gives a static list of the current highest CPU consumers.

Common causes include:

  • database queries;
  • PHP, Python, Node.js, or Java workers;
  • compression and backups;
  • software compilation;
  • malfunctioning scheduled jobs;
  • unexpected or compromised processes.

Do not kill a process only because it is first in top

A process using a full CPU core may be doing legitimate work. Confirm what it is, inspect its service and logs, and understand the impact before terminating it.

Check Whether I/O Is Causing the Load

Start with:

vmstat 1

Watch these columns:

  • r — runnable tasks waiting for CPU;
  • b — tasks blocked in uninterruptible sleep;
  • us and sy — user and system CPU time;
  • id — idle CPU;
  • wa — I/O wait.

A consistently large r value relative to CPU count can indicate CPU contention. A growing b value and high wa, especially with idle CPU remaining, point more strongly toward I/O.

If the iostat tool is installed, use:

iostat -xz 1

This can reveal device latency, queueing, and utilization. On Debian or Ubuntu, iostat is provided by the sysstat package.

Inspect Process States

ps -eo state,pid,ppid,comm,wchan:32 --sort=state

Important state codes include:

StateMeaning
RRunning or runnable
SInterruptible sleep, common for waiting processes
DUninterruptible sleep, often associated with I/O
ZZombie process awaiting collection by its parent

Many persistent D state processes can explain high load with modest CPU usage. Investigate the resource named in wchan, storage health, mounts, and kernel logs.

Check for VPS CPU Steal Time

On a VPS, the hypervisor schedules your virtual CPUs on physical hardware shared with other virtual machines. In top, the st field represents steal time: time when your VM wanted to run but the hypervisor scheduled something else.

Brief non-zero values may occur on shared infrastructure. Persistent, material steal time during performance problems can indicate host contention or a restrictive CPU allocation.

Collect measurements across busy and quiet periods before deciding that the provider is the cause.

Why a Short Load Spike May Be Normal

Many server tasks intentionally use available resources for a short time:

  • log rotation and compression;
  • package updates;
  • database maintenance;
  • backups;
  • scheduled reports;
  • traffic bursts;
  • application deployments.

A one-minute spike that falls quickly and causes no meaningful latency may require no action. Sustained queueing, repeated spikes at the same time, timeouts, or slow requests deserve investigation.

A Practical High-Load Troubleshooting Sequence

uptime
nproc
top
ps -eo pid,user,stat,%cpu,%mem,comm --sort=-%cpu | head
vmstat 1
iostat -xz 1
systemctl --failed
journalctl -p err -b
  1. Confirm whether the load is rising, falling, or stable.
  2. Compare it with the number of logical CPUs.
  3. Check CPU idle, I/O wait, and steal time.
  4. Identify the processes using CPU and their states.
  5. Check storage if tasks are blocked or I/O wait is high.
  6. Inspect failed services and recent errors.
  7. Correlate the time with backups, cron jobs, deployments, and traffic.

Common Load Average Mistakes

Treating load as a percentage

A load of 2.0 does not mean 2% or 200% CPU. It is a measure of running and waiting work and must be interpreted against CPU count.

Using one universal threshold

Load 4 has a different meaning on a 1-CPU VPS and a 16-CPU server. Alert thresholds should reflect the machine and workload.

Assuming high load always means insufficient CPU

Uninterruptible I/O waits can raise load. Check wa, blocked tasks, device latency, mounts, and kernel messages.

Reacting to a single sample

The trend and user impact matter. Compare the three averages and observe the system over time.

Linux Load Command Cheat Sheet

CommandPurpose
uptimeShow 1, 5, and 15 minute load averages
nprocShow available logical CPUs
topView live load, CPU states, and processes
ps ... --sort=-%cpuList current high-CPU processes
vmstat 1Watch runnable tasks, blocked tasks, CPU, and I/O wait
iostat -xz 1Inspect storage latency and utilization
journalctl -p err -bShow current-boot error messages

FAQ

What is a good load average?

There is no single good value. Compare sustained load with the number of CPUs, response-time targets, and normal baseline. A 4-CPU server with load near 1 has considerable headroom; a 1-CPU server with sustained load 4 has significant queueing or waiting work.

Can load average be higher than the CPU count?

Yes. It means more tasks are running or waiting than the CPUs can immediately execute, or tasks are contributing through uninterruptible waits. Short periods can be normal; sustained excess deserves investigation.

Why is load high when CPU usage is low?

Processes may be waiting in uninterruptible sleep for storage, a network filesystem, or another kernel-level resource. Check I/O wait, blocked tasks, device latency, mounts, and kernel logs.

Does adding more vCPU always reduce load?

No. More CPU can help a CPU-bound queue, but it will not fix slow storage, locked application resources, network filesystem problems, or poorly configured software.

Final Thoughts

Load average is an early warning signal, not a diagnosis.

Read the 1, 5, and 15 minute values as a trend, compare them with nproc, and then inspect CPU idle time, I/O wait, steal time, process usage, and process states. This turns three mysterious numbers into a practical starting point for Linux performance troubleshooting.

Rate article
Add a comment