OOM
Platform Ops OS Linux Troubleshooting
Issue #056 · September 2026

LINUX TROUBLESHOOTING

High Load · Memory & OOM · Disk & I/O · Network · Boot Failures

A runbook, not a tutorial. Box is on fire, load average is climbing, and you have maybe five minutes before someone asks for an update. Start here.

15
Concepts Covered
3
of 4 Linux Resources
🚨
Runbook Format
High Load & CPU3
Load AverageCPU HogZombies
Memory & OOM3
free/vmstatOOM KillerLeaks vs Cache
Disk & I/O3
Disk FullInodesSlow I/O
Network3
DNSRoutingFirewall
Boot Failures3
GRUBsystemd UnitsRescue Mode
Load AverageOOM KillerdmesgDisk FullInode ExhaustionDNS Resolutioniptables/nftablesGRUB Rescuesystemd-analyzeEmergency Mode Load AverageOOM KillerdmesgDisk FullInode ExhaustionDNS Resolutioniptables/nftablesGRUB Rescuesystemd-analyzeEmergency Mode

FIVE WAYS A BOX GOES DOWN

Five failure domains that cover almost every Linux incident — check them in roughly this order.

🔴 CPU / Load
Load Average
Run Queue
CPU Steal
Runaway Process
Zombie States
🟠 Memory
free / vmstat
OOM Killer
dmesg Trace
Page Cache
Memory Leaks
🔵 Disk / I/O
df -h
Inode Usage
iostat Latency
Deleted-but-Open
iowait
🟢 Network
DNS Resolution
Routing Table
Firewall Rules
Port Binding
MTU/Packet Loss
🟣 Boot
GRUB
Initramfs
fstab Errors
Failed Units
Rescue/Emergency
Deep-Dive

TROUBLESHOOTING REFERENCE

Click any failure domain to explore diagnostic commands, root causes, and fixes.

HIGH LOAD & CPU
The load average number everyone misreads under pressure
3 Concepts
📊
Reading Load Average Correctly
"Load 8.0" means nothing without knowing your core count — and on Linux, load includes processes waiting on I/O, not just CPU.
Must Know
Must Know
uptime
uptime
load average: 8.42, 6.10, 4.05
# 1min, 5min, 15min — rising trend = getting worse, not better
nproc # if this says 4, load 8.42 means real trouble
🟠Load average > core count sustained over 5-15 min = the box is genuinely saturated, not a blip
🔵High load with low CPU% usually means processes stuck in D state (uninterruptible I/O wait) — check disk, not CPU
🎯
Finding the CPU Hog
From "load is high" to "this exact process" in under a minute.
Important
Important
triage
top -o %CPU # sort by CPU, sanity check in 2 seconds
ps aux --sort=-%cpu | head -10
pidstat 2 5 # per-process CPU over 5 samples
🧟
Runaway Processes & Zombie States
A zombie process isn't using resources — but a pile of them means something's not reaping its children.
Diagnosis
Recommended
Process States
🔵Z (zombie) — finished but parent hasn't called wait() to reap it
🟠D (uninterruptible sleep) — usually stuck on disk/network I/O, can't even be killed with -9
Fix
1
Zombies can't be killed directly — restart or fix the parent process
2
Many zombies + one parent PID = that parent has a reaping bug — file it as a real bug, not a one-off restart
MEMORY & THE OOM KILLER
"Available" memory almost never means what you think it means
3 Concepts
💾
Reading free/vmstat Correctly
"Used" memory looks alarming until you understand that Linux uses spare RAM for disk cache on purpose — it gives it back instantly when needed.
Must Know
Must Know
free -h
total used free shared buff/cache available
Mem: 15Gi 9.2Gi 512Mi 128Mi 5.3Gi 5.8Gi
# "available" is the real number — buff/cache is reclaimable on demand
🟠Don't panic at low "free" — look at "available." A box with 500MB free and 5.8GB available is fine.
💀
The OOM Killer & dmesg
When memory truly runs out, the kernel picks a process to sacrifice — dmesg tells you exactly which one and why.
Important
Important
dmesg
dmesg -T | grep -i "out of memory"
Out of memory: Killed process 8821 (java) total-vm:4200000kB
journalctl -k | grep -i oom
1
The killed process usually isn't the cause — it's just whatever the kernel's OOM-score heuristic picked
2
Check /var/log/messages or journal around the same timestamp for what was actually consuming memory beforehand
📉
Memory Leaks vs Cache Pressure
Steadily climbing RSS on one process over days is a leak. Overall memory pressure that resolves on its own is usually just cache doing its job.
Diagnosis
Recommended
leak hunt
watch -n 60 'ps -o pid,rss,cmd -p 8821' # RSS trend over an hour
smem -tk # per-process real vs shared memory
DISK & I/O
"No space left on device" when df says there's plenty free — yes, that's real
3 Concepts
💽
Disk Full: Finding What's Eating Space
The classic — and the classic trap of deleted-but-still-open files that don't free space until the process holding them exits.
Must Know
Must Know
find the space
df -h # which mount is full
du -sh /var/* | sort -rh | head # biggest offenders
lsof +L1 # deleted files still held open — the hidden trap
🟠If du and df disagree wildly, a process is holding a deleted file open — lsof +L1 finds it, restarting that process frees the space
🔢
Inode Exhaustion
You can run out of inodes with disk space to spare — millions of tiny files (session files, cache fragments) are the usual culprit.
Important
Important
inodes
df -i # IUse% at 100% = the real problem, even with disk space free
find /var/spool -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head
🐌
Slow I/O Diagnosis
High iowait and climbing disk latency — the difference between "the app is slow" and "the disk is slow" matters for where you look next.
Diagnosis
Recommended
iostat
iostat -xz 2
# %util near 100% + high await = disk is the bottleneck, not the app
iotop -oPa # which process is doing the I/O
NETWORK ISSUES
DNS, routing, and firewalls — in that order, almost every time
3 Concepts
🔤
DNS Resolution Failures
"Can't connect" is very often "can't resolve the name at all" — check this before assuming a routing or firewall problem.
Must Know
Must Know
DNS triage
dig billing-api.internal +short
cat /etc/resolv.conf # is it even pointing at the right resolver?
systemd-resolve --status
🗺️
Connectivity & Routing
DNS resolves, but the packets still can't get there — time to walk the route hop by hop.
Important
Important
routing
ip route get 10.20.4.5
traceroute -T -p 443 billing-api.internal
ss -tulpn | grep 8080 # is anything even listening?
🧱
Port/Firewall Issues
The service is listening, the route is fine — and a firewall rule is still silently dropping the packet.
Diagnosis
Recommended
firewall
nft list ruleset # modern nftables
iptables -L -n -v --line-numbers # legacy iptables
firewall-cmd --list-all # firewalld (RHEL family)
BOOT & SERVICE FAILURES
When the box won't come back up after a reboot — the scariest category, and usually the most methodical to fix
3 Concepts
🥾
GRUB & Boot Failures
Nothing past the GRUB prompt, or it drops straight to a rescue shell — the earliest possible failure point.
Must Know
Must Know
🔴Bad /etc/fstab entry (typo'd UUID, missing device) is the #1 cause of "boots to emergency shell"
🟠Corrupt initramfs after a kernel update that didn't rebuild it properly
From Emergency Shell
1
Mount root read-write: mount -o remount,rw /
2
Fix the offending line in /etc/fstab, or comment it out temporarily
3
systemctl reboot and confirm it comes up clean this time
systemd Unit Failures
The box boots, but a critical service didn't start — systemd tells you exactly why if you ask it correctly.
Important
Important
failed units
systemctl --failed
systemctl status billing-worker -l
journalctl -u billing-worker -b # this boot's logs for that unit
systemd-analyze blame # what's slow at boot
🚑
Emergency/Rescue Mode Recovery
Two similar-sounding modes with different scopes — knowing which one you're in changes what's actually available to you.
Recovery
Recommended
Rescue vs Emergency
🔵rescue.target — most local filesystems mounted, base system running
🔵emergency.target — bare minimum, root filesystem often read-only, use when rescue itself won't boot
Boot Into One
1
At GRUB, press e to edit, append systemd.unit=rescue.target to the kernel line
2
Ctrl+X or F10 to boot with that one-time change
Decision Guide

WHERE DO I LOOK FIRST?

A quick lookup for the first 60 seconds of any "the server is having issues" page.

SymptomCheck FirstCommand
Everything feels slowLoad average vs core countuptime + nproc
App crashed unexpectedlyOOM killerdmesg -T | grep -i oom
Writes failingDisk space and inodesdf -h && df -i
Can't reach another serviceDNS resolution firstdig +short
Box won't come back after rebootfstab and failed unitssystemctl --failed

FIRST-RESPONSE CHEATSHEET

CPU / Load
uptime
top -o %CPU
pidstat 2 5
Memory
free -h
dmesg -T | grep -i oom
smem -tk
Disk / I-O
df -hT && df -i
iostat -xz 2
lsof +L1
Network
dig +short host
ss -tulpn
traceroute -T -p 443 host
Boot / Services
systemctl --failed
journalctl -b -p err
systemd-analyze blame
General
dmesg -T | tail -50
journalctl -xe
last -x | head
VA
Vishal Abhinav
Platform Ops Engineer · Ops Newsletter — Issue #056