Runbook: Investigate CPU Saturation
1 · Prerequisites
Confirm every item is in place before any state change.
- Console or SSH access to the firewall
- Knowledge of the appliance CPU count and core layout
- Baseline CPU utilisation from the previous day for comparison
2 · Pre-checks
Read-only diagnostic commands. If any of these don't match expected output, stop and investigate further.
- · Capture the current load from the dashboard and from
top -SHJfor a 30-second window - · Capture per-CPU utilisation from
ps aux | headandvmstat 1 5 - · Identify which cores are hottest and whether the load is user-space, system, or interrupt
- · Confirm the device is not under a DDoS or scan-driven load spike before assuming a misconfiguration
3 · Procedure
Execute each step in order. Verify the expected output of a step before moving to the next.
- 1Run
top -SHJfrom the shell and record the top five processes by CPU time - 2If the top process is
introrswi, the saturation is interrupt-driven and almost always packet processing — capture on the WAN interface to identify the source - 3If the top process is a single user process such as
unbound,suricata, orphp-fpm, focus the next investigation on that service - 4Run
vmstat 1 5and observe theus,sy, andcscolumns. Asycolumn that exceedsusby a wide margin points to softirq or kernel time - 5Run
systat -vmstat 1if available and observe the interrupt and softirq rates per CPU - 6If the saturation is on a single core, check whether the firewall has pinned the packet processing to that core and consider RSS or queue tuning
- 7If the saturation is on Suricata, review the IDS ruleset for expensive rules and the worker thread count
- 8If the saturation is on
unbound, review the cache hit rate and the number of upstream queries - 9If no single process dominates, use
ps -axo pid,ni,pcpu,comm | sort -k3 -nr | headto find the cumulative offenders - 10Apply the smallest fix that addresses the dominant cause and re-measure after a 5-minute observation window
4 · Verification
Confirm the procedure actually fixed the problem.
- ✓
top -SHJshows a CPU distribution that matches the hypothesis - ✓
vmstat 1 5no longer shows the saturation pattern that triggered the investigation - ✓The dashboard load returns to within the baseline range
- ✓No new alerts fire during the observation window
5 · Rollback
If verification fails, undo the procedure in reverse order.
- ↶If a tuning change makes the situation worse, revert the change via System > Configuration > Backups
- ↶If a service was restarted as part of the fix, confirm the service is in the same state as before (running or stopped) once the rollback is complete
- ↶If a queue or interrupt affinity change was applied, remove it before closing the investigation
6 · Escalation
When the runbook isn't enough, contact:
- · Escalate to the network team if the saturation is interrupt-driven and the source is not under the firewall operator control
- · Engage the platform team if multiple unrelated processes are showing high CPU at the same time
- · Engage the security team if the saturation coincides with a Suricata alert surge
Purpose
Identify the dominant cause of CPU saturation on an OPNsense appliance and apply the smallest change that returns the device to a healthy load profile.
When to use this runbook
Use this runbook when the dashboard load is consistently above baseline, when latency through the firewall is rising without a corresponding traffic increase, or when monitoring alerts fire on CPU saturation.
Pre-checks
Before starting the procedure, confirm the prerequisites and pre-checks are met. The structured lists are rendered from the frontmatter by the page layout.
Procedure
Follow the steps from the frontmatter procedure steps. The page layout renders the steps as a checklist with copy-to-clipboard affordances.
Verification
After the procedure, the structured verification items from the frontmatter are rendered as a checklist.
Rollback
If the procedure fails or makes things worse, follow the structured rollback steps from the frontmatter.
Escalation
The structured escalation path is rendered from the frontmatter. Use it if the operator cannot complete the procedure safely.