Skip to main content
Effective troubleshooting is not about knowing every command. It is about having a methodology that stops you from thrashing and helps you move from observation to root cause as efficiently as possible. After two-plus decades of on-call work — from bare-metal RHEL servers to containerised microservices — the discipline of observe first, hypothesize second, test third saves more time than any individual tool. This page captures the workflows I actually follow during incidents, not an exhaustive reference.

General Troubleshooting Methodology

1

Observe — establish ground truth before touching anything

Resist the urge to restart services immediately. Gather data first.
2

Hypothesize — form a specific, testable statement

A hypothesis is not “something is wrong with the database.” It is: “PostgreSQL is not accepting new connections because the connection pool is exhausted.” Write it down. If you cannot state it precisely, you need more observation.
3

Test — one change at a time

Change exactly one variable per test. Document what you changed, when, and what the result was. In a production incident this log is your audit trail.
4

Fix — targeted and reversible when possible

Apply the minimal fix. If you must restart a service, know why you’re doing it and what you expect to change. Document the fix and the outcome.
5

Validate and monitor


High CPU Investigation

A load average of 1.0 on a single-core machine means the CPU is fully loaded. On a 16-core machine, 1.0 means virtually idle. Always divide load average by CPU core count to get a meaningful utilisation ratio. Check nproc or lscpu for core count.

Memory Investigation


Disk Space Issues


Service Debugging with systemd

When a service fails to start, always check journalctl -u service-name -n 50 --no-pager before anything else. The error is almost always in the last few lines. systemctl status truncates long messages — journalctl gives the full output.

Log Analysis Patterns


OOM Killer Investigation

oom_score_adj = -1000 on a service means the OOM killer will never touch it. Use this only for truly critical processes (database, monitoring agent). Protecting the wrong process means something else gets killed instead — possibly the kernel itself triggering a panic.

Network Connectivity Debugging

1

Verify local interface and address

2

Test default gateway reachability

3

Test external IP connectivity (bypassing DNS)

4

Test DNS resolution

5

Test application port specifically

6

Capture traffic if still unclear


Quick-Reference Incident Checklist


Linux Essentials

Core commands used throughout these troubleshooting workflows.

Bash Scripting

Automate repetitive diagnostic and remediation steps.

Networking

Deep-dive on network diagnostics, firewall, and DNS.

DevOps Overview

Monitoring with Prometheus/Grafana and the ELK stack.
Last modified on June 9, 2026