Why Low CPU Usage Coexists with High Load? Linux Load & Scheduling Explained
This article explains why a Linux system can show a high load average while CPU utilization remains low, covering the concepts of load, multi‑tasking operating systems, process states, scheduling, and common scenarios that cause I/O‑bound load spikes.
Summary of Causes
The cause can be summed up in one sentence: too many processes waiting for disk I/O create a long run‑queue while only a few processes actually execute on the CPU, resulting in a high load average but low CPU usage.
The following sections provide a detailed analysis of the underlying principles.
What Is Load?
Load is the total number of processes that are either running on the CPU or waiting for the CPU to run them. It is essentially the length of the CPU run‑queue; the smaller the number, the better. A load exceeding CPU cores × 0.7 is considered abnormal.
Load consists of two parts: CPU load and I/O load.
For example, a scientific‑computing program that performs intensive calculations is CPU‑bound; its performance depends mainly on the processor speed and is called a compute‑intensive program . Conversely, a program that searches large amounts of data on disk is I/O‑bound; its speed depends on disk read/write performance and is called an I/O‑intensive program .
What Is a Multitasking Operating System?
Linux can run several tasks simultaneously, but CPU and disk resources are finite and must be shared among these tasks. Even within very short intervals the kernel switches between tasks, which is the essence of multitasking.
When few tasks are running, the system does not spend time waiting for context switches. As the number of tasks grows, tasks compete for CPU time; a task must wait until the CPU becomes idle before it can run, which appears as execution delay.
The
uptimecommand shows the load average values:
<code>[root@localhost ~]# uptime
11:16:38 up 2:06, 4 users, load average: 0.00, 0.02, 0.05</code>The three numbers represent the average number of tasks waiting for CPU over the past 1, 5, and 15 minutes respectively. A high load average indicates many tasks are waiting, which leads to longer waiting times.
Process Scheduling
Process scheduling (or CPU context switching) means the CPU saves the state of the currently running process and restores the state of the next selected process.
In the Linux kernel each process has a "process descriptor" that the scheduler orders by priority, determining which process runs next.
The scheduler classifies process states such as:
Running : the process can run whenever the CPU is idle.
Interruptible sleep : the process is waiting for an event with an unpredictable wake‑up time, e.g., keyboard input.
Uninterruptible sleep : short‑duration wait, typically for disk I/O; the process is I/O‑blocked.
Runnable (ready) : the process is prepared to run and will be scheduled when the CPU is available.
Zombie : the process has terminated but its parent has not yet collected its exit status.
Example scenario with three processes A, B, and C illustrates how the scheduler switches between running, uninterruptible, and interruptible states as they request CPU time or wait for I/O.
The Meaning of Load
Load represents the average number of processes that are either running or in an uninterruptible (I/O‑waiting) state. Only processes in the running and uninterruptible states contribute to the load value.
Consequently, a system can feel sluggish when many CPU‑bound or I/O‑bound processes are queued, while processes merely waiting for keyboard input do not increase the load.
Why Can CPU Utilization Be Low While Load Is High?
High load with low CPU usage occurs when many processes are blocked waiting for disk I/O. The following common scenarios cause this situation:
Excessive disk read/write requests : When the disk cannot keep up with the number of I/O requests, many processes enter uninterruptible sleep, inflating the load while the CPU remains idle.
MySQL queries without indexes or deadlocks : Large table scans or deadlocked transactions force the database engine to wait for disk I/O, creating many I/O‑blocked processes.
External storage failures (e.g., NFS server down) : If a mounted NFS share becomes unavailable, processes that try to access it remain in I/O wait indefinitely, raising the load.
To diagnose I/O‑bound load, you can run
show full processlistin MySQL to identify slow queries, or use
iostatand
vmstatto monitor disk activity.
Source: 西门飞冰的博客, http://www.fblinux.com/?p=281
Efficient Ops
This public account is maintained by Xiaotianguo and friends, regularly publishing widely-read original technical articles. We focus on operations transformation and accompany you throughout your operations career, growing together happily.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.