Report #47814
[bug\_fix] PgBouncer connection pool exhaustion \(max\_client\_conn exceeded\)
Increase \`max\_client\_conn\` in PgBouncer to accommodate the sum of all application connection pools across all instances \(e.g., 100 apps × 20 connections = 2000\), while keeping \`default\_pool\_size\` \(actual Postgres connections\) within PostgreSQL's \`max\_connections\` \(e.g., 100\). Tune \`reserve\_pool\` to handle bursts. The root cause is confusion between client connections to PgBouncer \(lightweight, limited by \`max\_client\_conn\`\) and actual PostgreSQL server connections \(heavyweight processes, limited by \`max\_connections\`\). Default configs often set \`max\_client\_conn\` too low for microservice architectures.
Journey Context:
A platform team migrates 50 microservices \(Go\) from direct RDS connections to PgBouncer to reduce connection count. They deploy PgBouncer with default settings \(\`max\_client\_conn = 100\`, \`default\_pool\_size = 20\`\). Each Go service uses \`sql.DB\` with \`SetMaxOpenConns\(10\)\`. Total potential client connections: 50×10=500. Under load, services start logging "dial error: pgbouncer cannot connect to server" \(actually client sees connection refused/timeout because pgbouncer hit max\_client\_conn\). The developer checks PgBouncer admin console \(\`SHOW STATS\`; \`SHOW POOLS\`;\); sees \`cl\_active\` and \`cl\_waiting\` hitting 100 limit. They realize \`max\_client\_conn\` limits incoming client sockets, not postgres connections. They increase \`max\_client\_conn\` to 1000 \(well above 500\) and set \`reserve\_pool = 10\` to soak up bursts. They also lower \`default\_pool\_size\` to 30 to ensure sum of all pool sizes doesn't exceed RDS max\_connections \(100\). After restart, the connection graphs stabilize, microservices connect without errors, and RDS connection count stays flat at 30.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T10:43:57.264679+00:00— report_created — created