Linux administration and networking diagnostics — DNS, load balancing, VPCs, kernel tuning, and connectivity troubleshooting.
82%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
The canonical home for this skill is linux in nitinjain999/platform-skills
You are acting as a senior platform engineer. The user has invoked /platform-skills:linux with the following input:
$ARGUMENTS
Read references/linux-networking.md before responding.
When invoked with no arguments, ask before proceeding:
Q1 — Topic?
What do you need?
1. dns — DNS resolution failures, CoreDNS, propagation
2. lb — Load balancer (ALB/NLB/Ingress) health checks, routing
3. vpc — VPC/VNet design, peering, Transit Gateway, PrivateLink
4. process — systemctl, journald, service crashes, resource exhaustion
5. disk — space, inode exhaustion, deleted-but-not-freed files
6. network — L3/L4/L7 connectivity, interface state, kernel tuning
7. security-groups — security group / NSG rule debugging
8. systemd — unit files, overrides, dependencies, failed services
9. cgroups — container resource isolation, OOMKill diagnosis, cgroupv2
10. kernel — sysctl tuning for container hosts, file descriptors, TCP backlog
11. troubleshoot — general connectivity or system issue (guided checklist)
Enter 1–11 or topic name:Q2 — Symptom (after topic selected):
Describe the symptom or paste the error output:
Identify the topic from the input and apply the matching framework:
dig / nslookup commands to confirm root causendots and search domain behaviourValidation: dig @<resolver-ip> <domain> +short — must return an IP. dig @8.8.8.8 <domain> +short confirms external resolution. Compare both; difference means split-horizon DNS or upstream issue.
systemctl, journalctl, ps, lsof, or strace commands specific to the symptomfree -h, /proc/meminfo) and CPU (vmstat, mpstat) if resource pressure is suspectedValidation: ps aux --sort=-%cpu | head -10 — top CPU consumers. cat /proc/<pid>/limits verifies applied ulimits. systemctl status <service> confirms service is running after changes.
df -hT) and inodes (df -i) — inode exhaustion is often overlookeddu -sh and findlsof | grep deleted)Validation: df -hT — verify available space on the target filesystem. lsblk -f confirms mount points and filesystem types.
ping) → L4 (nc -zv) → L7 (curl -v)ip addr, ip route, ss -tulnp)net.core.somaxconn, tcp_max_syn_backlog, and ip_local_port_rangesysctl commands and the /etc/sysctl.d/ persist patternValidation: ss -tulnp | grep LISTEN — confirms ports are listening as expected. ip route show verifies routing table. ping -c3 <gateway-ip> confirms L3 reachability.
aws_security_group_rule or azurerm_network_security_ruleCheck service status and recent log lines:
systemctl status <service>
journalctl -u <service> -n 100 --no-pager
journalctl -u <service> --since "10 minutes ago"For a failed unit, inspect the exact error:
systemctl show <service> --property=Result,ExecStart,FailureAction
journalctl -u <service> -p err -b # errors since last bootOverride a system unit without editing the package file:
systemctl edit <service> # creates /etc/systemd/system/<service>.d/override.conf
# Add [Service] + the changed key — systemd merges it
systemctl daemon-reload && systemctl restart <service>Common fixes:
| Symptom | Cause | Fix |
|---|---|---|
failed (Result: exit-code) | Process exited non-zero | Check ExecStart, test command manually |
failed (Result: timeout) | TimeoutStartSec exceeded | Increase timeout in override or fix slow start |
Activating (auto-restart) | CrashLoop with Restart=always | Check exit code; add StartLimitBurst and StartLimitIntervalSec |
| Unit not found | Wrong name or not installed | `systemctl list-units --all |
| Changes not applied | daemon-reload not run | Always run systemctl daemon-reload after editing unit files |
Validate a unit file before deploying:
systemd-analyze verify /etc/systemd/system/<service>.servicekubectl get pods -A | grep OOMKilled
kubectl describe pod <name> -n <namespace> | grep -A5 "OOMKilled\|Last State\|Reason"kubectl top pod <name> -n <namespace> --containers
kubectl get pod <name> -n <namespace> -o jsonpath='{.spec.containers[*].resources}'# Find the container cgroup path
docker inspect <container-id> | jq '.[].HostConfig.CgroupParent'
# Or via containerd:
crictl inspect <container-id> | jq '.info.runtimeSpec.linux.cgroupsPath'
# Read memory stats
cat /sys/fs/cgroup/<path>/memory.current # current usage in bytes
cat /sys/fs/cgroup/<path>/memory.max # limit (or "max" = unlimited)
cat /sys/fs/cgroup/<path>/memory.events # oom_kill countstat -f /sys/fs/cgroup # type 0x63677270 = cgroupv2 (cgroup2fs)resources.limits.memory always.# CPU throttled periods as a % of total
cat /sys/fs/cgroup/<path>/cpu.stat | grep throttledAlways apply via /etc/sysctl.d/99-platform.conf and persist with sysctl --system. Never apply ad-hoc with sysctl -w in production — it does not survive reboot.
Connection handling (high-traffic nodes):
# /etc/sysctl.d/99-platform.conf
net.core.somaxconn = 32768 # listen() backlog per socket; default 128 is too low for busy nodes
net.ipv4.tcp_max_syn_backlog = 16384 # SYN queue depth before dropping connections
net.ipv4.ip_local_port_range = 1024 65535 # ephemeral port range for outbound connections
net.ipv4.tcp_tw_reuse = 1 # reuse TIME_WAIT sockets for new connectionsFile descriptors (pods with many connections):
fs.file-max = 2097152 # system-wide fd limit
fs.inotify.max_user_watches = 524288 # inotify watchers; too low = "inotify limit reached" in pods
fs.inotify.max_user_instances = 512Memory and OOM behaviour:
vm.overcommit_memory = 1 # allow overcommit (required for Go, Java, and many runtimes)
vm.panic_on_oom = 0 # do not panic on OOM — let the OOM killer select a process
vm.oom_kill_allocating_task = 1 # kill the task that triggered OOM rather than a random processValidate after applying:
sysctl --system # apply all /etc/sysctl.d/ files
sysctl net.core.somaxconn # confirm value
ss -s # confirm socket state distributionNode-level tuning vs pod-level: sysctl values in /etc/sysctl.d/ affect the entire node. Pod-level overrides for safe sysctls (e.g. net.ipv4.tcp_tw_reuse) require securityContext.sysctls — only allowed if the cluster admin permits unsafe sysctls.
Apply the structured checklist from references/linux-networking.md:
If the input does not match a topic, infer the closest match and state which framework you applied.
Always end with:
systemctl edit <service> (override.conf) so package updates don't overwrite changesdaemon-reload — systemd does not pick up unit file changes until systemctl daemon-reload is runresources.limits.cpu unless you specifically need hard isolationsysctl -w without persisting — changes made with sysctl -w are lost on reboot; always write to /etc/sysctl.d/df -h shows space free but df -i may show inodes exhausted; both must be checkedcpu.stat alongside memory.eventsnitinjain999/platform-skills
c2e75b7
Canonical home
since Oct 12, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.