Tools

PgBouncer auf 4x Durchsatz skalieren

postgresql performance database

ClickHouse hat eine detaillierte Analyse veröffentlicht, 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, während der Pooler zum Flaschenhals wird.

Die Lösung: SO_REUSEPORT und Peering

Die Lösung ist elegant:

  1. Fleet von Prozessen - Multiple PgBouncer-Prozesse proportional zu den verfügbaren Cores
  2. SO_REUSEPORT - Alle Prozesse binden denselben Port, der Kernel verteilt die Connections
  3. Peering - Prozesse sind sich ihrer Nachbarn bewusst und können 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 nötig). Aber unter echter Concurrency zeigt die Fleet ihre Stärke: 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 überschritten, selbst bei mehreren Prozessen.

ClickHouse Managed Postgres nutzt diese Konfiguration standardmäßig. Für eigene Deployments: Die Doku zeigt, wie man PgBouncer mit SO_REUSEPORT und Peering aufsetzt.

Link: Original Artikel