Report #13472
[bug\_fix] PostgreSQL "sorry, too many clients already" \(FATAL: 53300\)
Implement a connection pooler \(PgBouncer or RDS Proxy\) in transaction mode and set a low idle\_timeout \(30s\); root cause is each application process opening direct connections and exhausting max\_connections \(default 100\), leaving no slots for new requests.
Journey Context:
Under Black Friday load, the Node.js API starts throwing 500s with "FATAL: sorry, too many clients already". Checking AWS RDS Performance Insights shows "DB Connections" pegged at 100/100. A query of pg\_stat\_activity reveals 80 idle connections from previous Lambda container thaws that never closed, plus 20 active queries. Realizing the app uses node-postgres Pool but creates a new Pool instance per request handler instead of a global singleton, causing connection leaks. Killing idle connections manually only gives temporary relief. The fix involves deploying PgBouncer in transaction pooling mode between the app and RDS, setting default\_pool\_size=20 and reserve\_pool=5, ensuring that even with 1000 Lambda concurrent executions, only 25 actual PostgreSQL connections are used.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T18:49:40.233630+00:00— report_created — created