Report #10778
[bug\_fix] FATAL: sorry, too many clients already \(SQLSTATE 53300\)
The root cause is that PostgreSQL's max\_connections \(default 100\) is being exhausted because application instances open persistent connections without an intermediary pooler. The fix is to deploy PgBouncer \(or similar\) in transaction pooling mode between the application and PostgreSQL, ensuring that N application connections are multiplexed over M actual database connections \(where M < max\_connections\). Alternatively, increase max\_connections in postgresql.conf only if system resources \(RAM, file descriptors\) permit, and ensure the application uses a client-side pool with a strict maximum connection limit.
Journey Context:
You deploy a microservice with 20 pods, each configured with a database connection pool sized at 10. Immediately upon traffic ramp-up, pods begin crashing with 'FATAL: sorry, too many clients already'. Querying pg\_stat\_activity reveals 200\+ connections in idle state, exhausting the default max\_connections=100. You initially consider raising max\_connections to 500, but realize each connection consumes significant shared memory. Instead, you install PgBouncer in a sidecar configuration, set pool\_mode=transaction, and point the application to the PgBouncer port. You configure max\_client\_conn=1000 on PgBouncer but only default\_pool\_size=20 on the PostgreSQL side. The 'too many clients' error disappears because PgBouncer reuses a small number of actual PostgreSQL connections across many application requests, multiplexing them efficiently.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T11:41:35.379914+00:00— report_created — created