Wie berechnet man max_connections für PostgreSQL und default_pool_size für pgbouncer?

17

Gibt es eine Regel oder etwas kann ich eine gute Anzahl zu berechnen max_connections, default_pool_sizeund max_client_conn?

Die Standardeinstellungen sind ungerade. PostgreSQL verwendet standardmäßig max_connections = 100, während pgbouncer standardmäßig default_pool_size = 20 verwendet. Sollte default_pool_size nicht immer höher sein als max_connections? Ansonsten, worum geht es? Ich dachte, pgbouncer sollte uns mehr Verbindungen ermöglichen, indem wir ihren Overhead senken (indem wir die Verbindungen von PostgreSQL wiederverwenden). Ich bin verwirrt.

Ich suche nach Ratschlägen, die denen im Wiki von PostgreSQL ähneln , wie "dieser Parameter sollte ~ 50% Ihres Speichers betragen".

Ich erinnere mich, dass es eine Tabelle für MySQL gab, mit der Sie diese Art von Parametern berechnen konnten. Es wäre fantastisch, so etwas für PostgreSQL / pgbouncer zu haben.

ChocoDeveloper
quelle

Antworten:

12

Zuerst bitte unsere kanonische Frage auf Kapazitätsplanung lesen .
Der spezifische Rat, um den Sie bitten, ist ein Rat für die Kapazitätsplanung, den Sie für Ihre spezielle Umgebung selbst erarbeiten müssen.

Zweitens sehen Sie das falsch.
Die Größe des Speichers (oder eine andere Ressource) Sie haben nicht die Anzahl der Verbindungen diktieren Sie einstellen, die Anzahl der Verbindungen , die Sie benötigen diktiert , wie bullige einem Server , den Sie kaufen müssen.
Die Ressourcenanforderungen pro Verbindung werden im Handbuch ausführlich beschrieben und in dem Wiki erläutert, mit dem Sie verlinkt haben. Finden Sie heraus, was Ihre Umgebung benötigt (oder machen Sie eine Vermutung), und stellen Sie sicher, dass die Hardware, auf der Sie laufen werden, mit dem umgehen kann, was Sie darauf werfen werden.


Insbesondere bezüglich der Verbindungsbeschränkungen und der Poolgröße sollten Sie "genügend" Verbindungen haben, um die Anforderungen Ihrer Anwendung zu erfüllen - entweder auf einem einzelnen Server oder über einen Pool / Bouncer.

"Genug" ist eine relative Zahl: Eine Anwendung, die eine Verbindung herstellt (und ständig wiederverwendet), benötigt nur eine Verbindung. Eine Anwendung, die eine Verbindung für jeden Endbenutzer herstellt, der sich anmeldet, benötigt so viele DB-Verbindungen wie Benutzer.

Die Standardwerte für beide Postgres und pgbouncersinnvoll sind als Standardwerte :

  • 100 Datenbankverbindungen sind eine Menge für die typische Person, die Postgres in eine Umgebung wirft.
    Entwickler werden wahrscheinlich nicht mehr als 10 brauchen. Jeder andere wird genug wissen, um die Anzahl zu erhöhen.

  • 20 Verbindungen pgbouncerpro DB-Pool bedeuten, dass Sie 4 Pools erhalten können, die auf einen Server zeigen, und das Standard-Postgres-Verbindungslimit nicht überschreiten.
    Es ist möglich, dass mehrere Poolressourcen pgbouncerauf eine Back-End-Datenbank verweisen, und Sie möchten immer einige verfügbare Verbindungen auf Ihren Back-End-Servern.

Wenn die Standardeinstellungen nicht für Ihre Umgebung geeignet sind, müssen Sie sie ändern.

Denken Sie daran, dass gepoolte Verbindungen nicht "immer alle verfügbaren Datenbankverbindungen herstellen" bedeuten.
Der Punkt von, pgbouncerwie Sie bemerkt haben, ist, Verbindungen wiederzuverwenden . Der Effizienzgewinn erfordert hier nicht, dass Sie jede verfügbare Verbindung binden, sondern nur, dass Sie nicht jedes Mal die Verbindung trennen, erneut herstellen, SSL neu aushandeln, sich erneut bei der Datenbank authentifizieren und Ihre Verbindungs-Setup-Abfragen erneut ausführen.

voretaq7
quelle
8
Ich sehe keinen Grund, mehr Hardware zu kaufen, bevor ich die Dinge richtig konfiguriert habe. "Jeder andere wird genug wissen, um die Zahl zu erhöhen" . Wo kann ich genug lernen? Ich finde nicht viel Material über Verbindungen. Ist es nur Versuch und Irrtum? Die Tabelle, die ich für MySQL erwähnte, funktionierte früher wie ein Zauber. Die Verwendung von mehr Verbindungen als angegeben würde dazu führen, dass dem Server der Arbeitsspeicher ausgeht. Im Moment habe ich 4 GB, ich hatte damit gerechnet, die Standardeinstellungen erhöhen zu müssen. Also, 20x4 = 80, wofür sind die anderen 20?
ChocoDeveloper
1
@ChocoDeveloper Bitte lesen Sie meine Antwort noch einmal vollständig durch (Sie fragen einige Dinge, die ich bereits angesprochen habe) und verbringen Sie ein paar Minuten mit der Dokumentation, auf die ich verlinkt habe. Sie betrachten dies immer noch rückwärts (siehe den ersten Absatz meiner Antwort). Denken Sie daran, dass Postgres NICHT MySQL ist: Sie müssen alles vergessen, was Sie aus Ihrem MySQL-Tuning-Erlebnis zu wissen glauben. Postgres ist eher wie Oracle. Lesen Sie das Handbuch und befolgen Sie die darin enthaltenen Anweisungen.
Voretaq7
1

Beachten Sie die Definition der Dokumentation vondefault_pool_size

Wie viele Serververbindungen pro Benutzer / Datenbank-Paar zulässig sind.

Wenn die Standardkonfiguration also eine Poolgröße von 20 von insgesamt 100 Verbindungen ist, bedeutet dies, dass 5 verschiedene Benutzer- / Datenbankpaare ihre Poolgröße jeweils maximieren müssen, bevor sie das Gesamtlimit erreichen. Wenn Sie zum Beispiel pgbouncer verwenden, um über einen einzelnen Benutzer zu einer einzelnen Datenbank zu routen, liegt das effektive Verbindungslimit bei 20 und nicht bei 100. Daher müssen Sie die Poolgröße für diesen Anwendungsfall entsprechend festlegen. YMMV.

Josip Rodin
quelle