FREE RESOURCE LINUX TROUBLESHOOTING

Linux Troubleshooting Cheat Sheet

A production-first field guide for Linux, SRE, DevOps, Cloud, and Platform Engineers.

Troubleshooting is not running commands.

It is reducing uncertainty.

Start with impact, build a hypothesis, gather evidence, make the smallest safe change, and verify the result.

  • PDF
  • 6 pages
  • Free for personal use

Start here: the first 60 seconds

  • Impact

    Question
    What is broken, for whom, and since when?
    Why it matters
    Scope, urgency, and user-facing SLI/SLO risk.
  • Change

    Question
    What changed just before the symptom?
    Why it matters
    Deploys, configuration, packages, traffic, dependencies.
  • Saturation

    Question
    CPU, memory, disk, I/O, or connections?
    Why it matters
    Find resource pressure before chasing details.
  • Errors

    Question
    What do logs and kernel messages say?
    Why it matters
    Turns guesses into evidence.
  • Dependencies

    Question
    DNS, network, storage, upstream, or downstream?
    Why it matters
    The host may be healthy while a dependency is not.
  • Verify

    Question
    Can you reproduce it, mitigate it, and prove recovery?
    Why it matters
    A restart is not proof that the cause is understood.

Fast system snapshot

Capture context before changing anything.

date -Is
hostname
whoami
uptime
cat /etc/os-release | head
systemctl --failed
free -h
df -hT
df -i
ps -eo pid,ppid,user,stat,%cpu,%mem,etime,cmd --sort=-%cpu | head
ip -br addr
ip route
ss -s
journalctl -p warning -n 30 --no-pager

01 CPU, Load & Processes

When the server is slow

High load does not automatically mean high CPU.

Linux load average includes runnable tasks and tasks stuck in uninterruptible sleep, often related to I/O.

  • uptime

    What it tells you
    Load averages for 1, 5, and 15 minutes.
    Watch for
    Trend, not a CPU percentage.
  • top

    What it tells you
    Live CPU, tasks, memory, and process view.
    Watch for
    One hot process vs system-wide pressure.
  • nproc

    What it tells you
    Number of available processing units.
    Watch for
    Context for load and process CPU.
  • ps -eo pid,%cpu,%mem,etime,cmd --sort=-%cpu | head

    What it tells you
    Top CPU-consuming processes.
    Watch for
    Runaway process, new process, long-running offender.
  • vmstat 1

    What it tells you
    Run queue, CPU, paging, blocked tasks.
    Watch for
    High r, b, wa, si/so activity.
  • mpstat -P ALL 1

    What it tells you
    Per-CPU utilization if installed.
    Watch for
    Single-core saturation and steal time.
  • pidstat 1

    What it tells you
    Per-process CPU/I/O/context-switch information if installed.
    Watch for
    Which PID is creating pressure.
  • cat /proc/loadavg

    What it tells you
    Kernel load view.
    Watch for
    Runnable and blocked workload.
  • cat /proc/pressure/cpu

    What it tells you
    CPU pressure stall information when available.
    Watch for
    Sustained workload waiting for CPU.
  • sar -u sar -q

    What it tells you
    Historical CPU/load data when sysstat collection is enabled.
    Watch for
    What happened before you logged in.

Read the signals correctly

High %us
Application/user-space work is consuming CPU.
High %sy
Kernel/system work is elevated. Investigate syscall-heavy work, networking, drivers, or I/O paths.
High %wa
Supports an I/O hypothesis, but does not prove storage saturation. Correlate it with device latency, queues, blocked tasks, and I/O pressure.
High load with low CPU
Check blocked tasks, I/O, NFS, storage, locks, and D-state processes.
High %st in a VM
The hypervisor may not be giving the guest the CPU time it expects.

Process clues

ps -eo pid,ppid,user,stat,wchan:24,%cpu,%mem,etime,cmd --sort=-%cpu | head -20

ps -eo stat,pid,ppid,cmd | awk '$1 ~ /^D/'

pstree -ap <PID>

cat /proc/<PID>/status

cat /proc/<PID>/limits

lsof -p <PID>

Advanced escalation

strace -f -tt -T -p <PID>

02 Memory, Disk & I/O

Resource pressure that looks like "Linux is broken"

Memory

  • free -h

    Focus on
    Available, not just Free.
  • cat /proc/meminfo

    Focus on
    MemAvailable, SwapFree, Dirty, Slab.
  • vmstat 1

    Focus on
    Paging and sustained pressure.
  • swapon --show

    Focus on
    Unexpected swap use or no safety margin.
  • journalctl -k | grep -Ei "oom|out of memory|killed process"

    Focus on
    OOM victim process and timeline.
  • cat /proc/pressure/memory

    Focus on
    Sustained some/full memory pressure.

Host healthy, workload unhealthy?

A process can hit a container or cgroup resource limit even when the host still has plenty of CPU or memory.

Useful cgroup v2 evidence

cat /sys/fs/cgroup/memory.current
cat /sys/fs/cgroup/memory.max
cat /sys/fs/cgroup/memory.events
cat /sys/fs/cgroup/cpu.stat

Exact cgroup paths depend on the workload and service manager.

  • Memory limits
  • OOM events
  • CPU throttling
  • Resource pressure isolated to the workload

Disk and filesystem

  • df -hT

    Investigate
    Filesystem capacity, type, and mount point.
  • df -i

    Investigate
    Inode exhaustion even when blocks remain.
  • du -xhd1 /path | sort -h

    Investigate
    Largest directories on one filesystem.
  • find /path -xdev -type f -size +1G -ls

    Investigate
    Large files without crossing mounts.
  • lsof +L1

    Investigate
    Deleted files still held open by a process.
  • lsblk -f

    Investigate
    Block devices, filesystems, labels, and mount relationships.
  • findmnt

    Investigate
    Actual mount sources, targets, and options.
  • iostat -xz 1

    Investigate
    Device utilization, latency, and queue behavior.
  • cat /proc/pressure/io

    Investigate
    Workload time stalled on I/O.
  • journalctl -k -b

    Investigate
    Filesystem, block-device, and kernel errors.

Filesystem nearly full

Inode exhaustion

Large files

Deleted-but-open files

Wrong, missing, or read-only mount

Device latency and queues

I/O stalls

Filesystem or block-device errors

03 Services, Logs, Boot & Permissions

When a service is down

systemd: work from state to evidence

  • systemctl --failed

    What it tells you
    Failed units across the system.
    Watch for
    Correlated failures or an obvious starting point.
  • systemctl status <unit>

    What it tells you
    Current unit state and recent log lines.
    Watch for
    Exit status, restart loop, or dependency failure.
  • journalctl -u <unit> -b

    What it tells you
    Unit logs from the current boot.
    Watch for
    The first error and the timeline around it.
  • journalctl -u <unit> --since "15 min ago"

    What it tells you
    Recent unit-specific events.
    Watch for
    What changed immediately before failure.
  • systemctl cat <unit>

    What it tells you
    The effective unit definition and drop-ins.
    Watch for
    Overrides, paths, users, and environment files.
  • systemctl show <unit>

    What it tells you
    Detailed runtime properties.
    Watch for
    Limits, result codes, dependencies, and cgroup data.
  • ss -lntup

    What it tells you
    Listening TCP/UDP sockets and owning processes.
    Watch for
    Wrong port, wrong bind address, or no listener.

Build a timeline, not a pile of logs

journalctl -b -p warning --no-pager
journalctl -k -b --no-pager
dmesg -T | tail -100
journalctl --since "10 minutes ago" --until "now"

dmesg may require elevated privileges.

Boot and startup

systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
journalctl -b -1
last -x | head

When "permission denied" is not obvious

id
groups
namei -l /path/to/file
ls -ld /path /path/to/file
stat /path/to/file
getfacl /path/to/file
getenforce
ausearch -m AVC -ts recent
aa-status
journalctl -k --grep=apparmor
cat /proc/<PID>/limits
ls /proc/<PID>/fd | wc -l
  • getfacl may not be installed.
  • getenforce and ausearch apply to SELinux systems.
  • aa-status applies to AppArmor systems and may require root.

04 Network, DNS, Ports & TLS

Trace the path end to end.

A useful network investigation asks where the path breaks:

  1. Interface
  2. Route
  3. Name resolution
  4. Connection
  5. TLS
  6. Application
  7. Dependency
  • ip -br addr

    What it tells you
    Concise interface addresses and state.
  • ip -s link

    What it tells you
    RX/TX packet errors, drops, and interface-level problems.
  • ip route

    What it tells you
    Configured routing table.
  • ip route get <IP>

    What it tells you
    The actual interface, source, and gateway Linux would choose.
  • ip neigh

    What it tells you
    Neighbor/ARP state for local paths.
  • ss -lntup

    What it tells you
    Listening TCP/UDP sockets and their processes.
  • ss -s

    What it tells you
    Connection-state summary and socket pressure.
  • curl -v https://host

    What it tells you
    Connection, TLS, HTTP, redirects, and response details.
  • getent hosts <name>

    What it tells you
    System NSS resolution behavior used by many local applications.
  • dig <name>

    What it tells you
    Direct DNS response details.
  • resolvectl status

    What it tells you
    Resolver configuration and per-link DNS state.
  • nft list ruleset

    What it tells you
    Host firewall rules when nftables is in use.

When IP works but hostname fails

getent hosts app.example.com
cat /etc/resolv.conf
resolvectl status
dig app.example.com
getent ahosts app.example.com

Check the resolver the application actually uses.

Move from simple checks to packet evidence

curl -v --connect-timeout 5 https://host/path

nc -vz host 443

tracepath host

openssl s_client -connect host:443 -servername host </dev/null

openssl s_client -connect host:443 -servername host </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates

tcpdump -nn -i any host <IP> and port 443
  • Netcat may not be installed.
  • tcpdump requires appropriate privilege.

Do not forget time

Clock drift can break TLS, authentication, tokens, and distributed systems.

date -Is
timedatectl status

05 Symptom Map

What should I check first?

  • Server is slow

    First checks
    uptime, top, vmstat 1, free -h, df -hT
    Think about next
    CPU vs I/O vs memory vs dependency latency.
  • Load high, CPU not high

    First checks
    vmstat 1, D-state processes, iostat -xz 1
    Think about next
    Blocked I/O, NFS/storage, locks, kernel wait.
  • Memory disappearing

    First checks
    free -h, /proc/meminfo, ps sorted by memory, OOM logs
    Think about next
    Leak, cache growth, swap pressure, limits/cgroups.
  • Disk full

    First checks
    df -hT, df -i, du, lsof +L1
    Think about next
    Large files, inodes, deleted-open files, hidden mount data.
  • Service down

    First checks
    systemctl status, journalctl -u, ss -lntup
    Think about next
    Exit code, configuration, dependency, permissions, port conflict.
  • Port unreachable

    First checks
    ss -lntup, ip route get, curl/nc, firewall rules
    Think about next
    Bind address, route, ACL/security group, firewall.
  • IP works, name fails

    First checks
    getent hosts, resolv.conf/resolvectl, dig
    Think about next
    NSS, DNS server, search domain, stale or wrong record.
  • TLS failure

    First checks
    date -Is, curl -v, openssl s_client
    Think about next
    Clock, certificate chain, expiry, hostname/SNI.
  • Intermittent latency

    First checks
    time-correlated metrics/logs, ss, iostat, vmstat, dependency checks
    Think about next
    Saturation, retries, packet loss, GC, noisy neighbor.
  • Worked before deploy

    First checks
    timeline plus config/package/deploy diff
    Think about next
    Rollback or feature flag may be safer than deep live surgery.

Senior production habits

Start with user impact and blast radius.

A host metric matters because of what it means for the service.

Compare against a known-good baseline.

  • Another host
  • Previous period
  • Previous version
  • Normal traffic window

Connect infrastructure to service reliability.

If SLOs exist, connect the host symptom to the user-facing SLI and error-budget burn. Infrastructure metrics are evidence, not the final objective.

Build a timeline.

Correlate symptoms with deploys, configuration changes, package updates, traffic changes, and dependency events.

Change one thing at a time when possible.

Preserve enough evidence to learn from the incident.

Prefer reversible mitigation.

Know how you will roll back before making a risky production change.

Verify recovery from the user path and the relevant signals.

"The command succeeded" is not the same as "the service recovered."

When the usual tools are missing

Linux gives you raw evidence under /proc and /sys.

  • /proc/loadavg

    Evidence
    Load information
  • /proc/stat

    Evidence
    CPU counters
  • /proc/meminfo

    Evidence
    Memory counters
  • /proc/<PID>/status

    Evidence
    Process state and memory
  • /proc/<PID>/fd/

    Evidence
    Open file descriptors
  • /proc/pressure/{cpu,memory,io}

    Evidence
    Pressure stall information
  • /sys/fs/cgroup/

    Evidence
    Workload resource limits and cgroup state
  • /sys/class/net/

    Evidence
    Network interface device statistics

Want the printable version?

Download the complete 6-page Linux Troubleshooting Cheat Sheet and keep it beside your terminal or print it for quick reference.

  • 6-page PDF
  • Print-friendly
  • Free for personal use

Free for personal use.

You may download and use the cheat sheet for your own troubleshooting, learning, or interview preparation.

Please do not resell, redistribute, repackage, or publish the resource as your own.

© 2026 CTRL+CHAOS