Report #87988
[bug\_fix] Postgres: FATAL: sorry, too many clients already
Root cause: Each backend process in Postgres is heavyweight \(forked process\), so max\_connections defaults to 100. Without a connection pooler, each application instance/pod exhausts this quickly. Fix: Place PgBouncer \(in transaction pooling mode\) between the application and Postgres, reducing the actual Postgres backend count by 10-100x while allowing the app to open/close connections cheaply. Alternatively, drastically reduce the application's per-process pool size \(e.g., from 20 to 2\) to fit within max\_connections.
Journey Context:
Deployed a new Node.js microservice with a connection pool size of 10 per instance. During a traffic spike, the app started throwing 500 errors with 'sorry, too many clients already'. Checked Postgres: SELECT count\(\*\) FROM pg\_stat\_activity showed 97 active connections, all idle from the app. Realized each of the 10 pods was holding 10 connections, quickly hitting the default max\_connections=100. Initially tried increasing max\_connections to 500, but system OOM'd because each backend uses ~5-10MB RAM. Finally implemented PgBouncer in transaction mode in a sidecar container, reducing actual Postgres connections to 20 while the app thinks it has 1000 connections available.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T06:16:30.272368+00:00— report_created — created