Home / Linux Engineering
Systems Engineering • Performance Analysis

Linux Performance Troubleshooting: The Enterprise USE Methodology 🐧⚡

A disciplined production methodology for diagnosing CPU saturation, memory exhaustion, disk I/O bottlenecks, and network latency across mission-critical Linux systems.

1. The USE Method: Utilization, Saturation, and Errors

Randomly executing diagnostic commands under an outage is a recipe for prolonged downtime. The USE Method (pioneered by Brendan Gregg) provides a systematic framework: for every hardware and software resource (CPU, memory, disk, network interface), evaluate:

  • Utilization: The average time the resource was actively servicing work over a given interval (e.g., CPU percentage, disk bandwidth).
  • Saturation: The degree to which extra work queued up waiting for the resource (e.g., runnable process queue length, TCP backlog).
  • Errors: The count of explicit error events (e.g., dropped packets, filesystem I/O errors).

2. The First 60 Seconds: Production Triage Checklist

When an engineer connects to a degraded server, execute these commands in sequence:

# 1. System uptime and load averages (1, 5, 15 min)
uptime

# 2. Kernel dmesg errors (OOM kills, TCP SYN floods, disk timeouts)
dmesg -T | tail -n 50

# 3. High-level CPU & memory virtual subsystem state (1-sec intervals)
vmstat 1 5

# 4. CPU core utilization and run-queue saturation
mpstat -P ALL 1 3

# 5. Disk storage I/O latency, queue depth, and throughput
iostat -xz 1 3

# 6. Available memory (Buffer/Cache vs. Free vs. Swap usage)
free -m

# 7. Network socket statistics and TCP connection states
ss -s

# 8. Interactive process hierarchy by CPU/Memory consumption
top -b -n 1 | head -n 30

3. Deep Dive: Decoding vmstat & Memory Pressure

Running vmstat 1 provides real-time visibility into the memory and scheduler queue:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 6  1      0  14500    120   4500    0    0     0   120 1200 4500 75 15  5  5  0

Critical Columns Decoded:

  • r (Runnable): Threads waiting for CPU runtime. If r exceeds the number of physical CPU cores for sustained intervals, the system is CPU saturated.
  • b (Blocked): Processes blocked waiting for uninterruptible disk or network I/O.
  • si / so (Swap In / Swap Out): If non-zero, the kernel is actively reading/writing memory pages to disk swap, causing severe latency degradation.
  • wa (I/O Wait): The percentage of CPU cycles spent idling while waiting for disk operations to complete.

4. Diagnosing Disk I/O Bottlenecks with iostat

Slow database queries and hung web servers are frequently caused by disk queue saturation. Run iostat -xz 1:

Device  r/s     w/s     rkB/s    wkB/s   await  r_await w_await  %util
nvme0n1 450.00  120.00  18400.0  4500.0   2.10     1.20    4.50  88.50
  • await: The average time (in milliseconds) that read/write requests took to be serviced, including queue time. Values consistently above 15-20ms indicate disk hardware saturation.
  • %util: Percentage of time during which requests were issued to the device. Sustained values close to 100% signify storage exhaustion.

5. Common Pitfalls & Actionable Remedies

1. The Silent Out-Of-Memory (OOM) Killer

When available memory drops to zero, the Linux kernel invokes oom_killer to terminate memory-heavy processes (typically databases or Java runtimes). Verify with:

grep -i -E 'killed process' /var/log/messages /var/log/syslog

Remedy: Configure memory cgroups, tune vm.overcommit_memory=2, or add dedicated swap to absorb traffic spikes.

2. Ephemeral Port Exhaustion (TIME_WAIT Sockets)

High-throughput reverse proxies (Nginx/HAProxy) can exhaust available local ephemeral ports when communicating with upstream microservices.

Remedy: Enable TCP socket reuse in /etc/sysctl.conf:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535