The page said "high memory," the cause was three things stacked. No connection pooler in front of a Puma app meant 498 idle connections each holding memory hostage. Long-running statements created lock contention. And a couple of hot queries were doing 23-second sequential scans on tables missing the right index.
The fix went in as a layered stack: PgBouncer in transaction-pooling mode to collapse the connection count, server-side idle timeouts to reap the stragglers, work_mem dialed back to shrink the per-connection memory footprint, and a targeted index plan to kill the seq-scans (so the heavy sorts disappeared instead of needing more memory). Then I wrote the 5-Whys RCA in Confluence so the root cause — not just the symptom — is on record.