Tools

PgBouncer auf 4x Durchsatz skalieren

postgresql performance database

ClickHouse hat eine detaillierte Analyse veroeffentlicht, wie PgBouncer von einem single-threaded Prozess zu einem verteilten Fleet skaliert werden kann - mit beeindruckenden Ergebnissen: 336.000 Transaktionen pro Sekunde statt 77.000 bei 256 Clients.

Das Problem

PgBouncer ist single-threaded - ein Prozess nutzt nur einen CPU-Core. Auf einer 16-vCPU-Machine sitzen 15 Cores im Leerlauf, waehrend der Pooler zum Flaschenhals wird.

Die Loesung: SO_REUSEPORT und Peering

Die Loesung ist elegant:

  1. Fleet von Prozessen - Multiple PgBouncer-Prozesse proportional zu den verfuegbaren Cores
  2. SO_REUSEPORT - Alle Prozesse binden denselben Port, der Kernel verteilt die Connections
  3. Peering - Prozesse sind sich ihrer Nachbarn bewusst und koennen Query-Cancellations weiterleiten

Das Problem mit Query-Cancellations: Eine Cancel-Anfrage kommt auf einer neuen Connection mit einem Cancel-Key. Ohne Peering landet sie beim falschen Prozess. Mit Peering wird die Cancel-Anfrage an den Prozess weitergeleitet, der die Session besitzt.

Benchmarks

ClientsSingle TPSSingle CPUFleet TPSFleet CPU
88,9100.8%6,4502.9%
3254,2035.2%64,24412.3%
6486,5708.3%219,43931.9%
12883,4638.1%320,54745.9%
25676,8937.7%336,46948.9%

Bei geringer Last ist der Single-Prozess sogar etwas schneller (keine Parallelisierung noetig). Aber unter echter Concurrency zeigt die Fleet ihre Staerke: 4x Durchsatz bei voller CPU-Auslastung.

Connection Budget

max_client_conn und max_db_connections werden auf die Prozesse aufgeteilt. So wird das Connection-Budget nie ueberschritten, selbst bei mehreren Prozessen.

ClickHouse Managed Postgres nutzt diese Konfiguration standardmaessig. Fuer eigene Deployments: Die Doku zeigt, wie man PgBouncer mit SO_REUSEPORT und Peering aufsetzt.

Link: Original Artikel