Report #83569
[bug\_fix] PostgreSQL too many clients \(FATAL: sorry, too many clients already\)
Implement server-side connection pooling using PgBouncer in transaction mode, or increase max\_connections with caution. The root cause is PostgreSQL's process-per-connection architecture—each connection spawns a backend process consuming ~10MB\+ RAM and kernel resources. Without pooling, microservices with high concurrency exhaust the default max\_connections \(100\), causing cascading failures. PgBouncer multiplexes hundreds of application connections onto tens of Postgres backends, eliminating process exhaustion.
Journey Context:
The Node.js Express API suddenly returned 500 errors under moderate load. Logs showed 'FATAL: sorry, too many clients already'. Checking pg\_stat\_activity revealed 100 idle connections from previous requests. The developer created a new pg.Client per request but only called client.end\(\) in a finally block that was sometimes skipped during exceptions. Postgres creates a full backend process per connection. With max\_connections=100, the app exhausted the limit instantly. Debugging involved tracing connection leaks with pg\_stat\_activity.state, realizing the ORM wasn't the issue but raw query code was. The fix required switching to pg.Pool with a max size of 20 and ensuring pool.release\(\) in finally blocks, plus introducing PgBouncer between the app and RDS to handle connection storms.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T22:51:30.359672+00:00— report_created — created