Check CPU usage on Linux with top (the default), htop (better UI), or mpstat -P ALL 1 (per-CPU). The header line shows system-wide CPU breakdown: user, system, idle, iowait, steal. The process list shows per-process usage. The team that knows which field answers which question finds the answer fast.
Table of contents
- top: the default
- Per-CPU view
- htop: better interactive view
- mpstat: detailed per-CPU over time
- vmstat: CPU + memory + IO together
- FAQ
top: the default
top
The first thing to look at is the header line:
%Cpu(s): 12.5 us, 2.1 sy, 0.0 ni, 79.8 id, 5.3 wa, 0.0 hi, 0.3 si, 0.0 st
us(user): Programs running in user space. Normal applications.sy(system): Kernel code. High values mean kernel work (syscalls, IO, drivers).ni(nice): Niced processes (lower priority).id(idle): Doing nothing.wa(iowait): Waiting for IO. High values = disk bottleneck.hi(hardware interrupt): Hardware IRQ handlers.si(software interrupt): Softirq handlers (network stack, etc.).st(steal): Time the hypervisor gave to other VMs (cloud).
The team that sees high wa has an IO bottleneck. The team that sees high us has a CPU-bound application. The team that sees high st has hypervisor contention.
Per-CPU view
Press 1 in top to toggle per-CPU breakdown. Useful for finding single-threaded bottlenecks:
%Cpu0 : 8.0 us, 1.5 sy, 0.0 ni, 85.0 id, 5.5 wa
%Cpu1 : 95.0 us, 1.0 sy, 0.0 ni, 4.0 id, 0.0 wa
CPU1 at 95% user = single-threaded hot loop. The team that finds this knows the workload doesn’t parallelize well.
htop: better interactive view
htop
Same data as top, with:
- Color (user/system/idle colors).
- Per-CPU bars by default (no need to press
1). - Mouse support (click column headers to sort).
- Visual process tree (F5).
- Easier kill (F9 or click).
The team that uses htop on regular Linux machines doesn’t go back to top.
mpstat: detailed per-CPU over time
mpstat -P ALL 1
Refreshes every second. Shows the same fields as top’s CPU header but per-CPU and over time. The team that wants to see how CPU usage changes over time uses mpstat instead of top.
vmstat: CPU + memory + IO together
vmstat 1
Output:
procs ---memory--- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 102400 20480 204800 0 0 0 5 50 100 12 2 80 5 0
The right side shows the same CPU breakdown as top. The team that wants CPU + memory + IO in one view uses vmstat.
FAQ
What is a normal CPU usage?
Depends. Idle servers often sit at 1-10% (waiting for requests). Active servers: 30-70% is normal, with bursts to 90%+. Sustained >80% means the system is CPU-bound and may need scaling.
Why is iowait high?
The CPU is waiting for IO (disk, network). High iowait with low user/system = disk is the bottleneck. The team that sees this checks iostat -x 1 for per-disk latency and queue depth.
What is a good CPU steal time?
Under 5% is normal. Over 10% means the hypervisor is oversubscribed. The team that sees this on a cloud VM considers a different instance type or a different cloud region.
How do I check CPU usage from a remote server?
SSH in and run top or htop. Or use monitoring (Prometheus node_exporter + Grafana, Datadog, etc.) for historical views. The team that has monitoring set up doesn’t need to SSH for routine checks.
Why does my CPU show 200%?
Multi-threaded process using 2 cores fully. Each core is 100%, the process gets 200%. The team that has 32 cores sees 3200% on a fully parallel workload.
If you are sizing the infrastructure for the kind of project this post covers, the RunxBuild hosting calculator is the right place to model the line items. The compute, the memory, the storage, the bandwidth, the database - each one is a separate number, and the team’s mental model for the platform is the sum of those numbers. The RunxBuild dashboard is where the team sees the actual usage in one place.
Useful related references: