Wie kann man die maximale Anzahl an Verbindungen in Postgres erhöhen?

107

Ich verwende Postgres DB für mein Produkt. Während der Stapeleinfügung mit Slick 3 wird eine Fehlermeldung angezeigt:

org.postgresql.util.PSQLException: FATAL: Entschuldigung, bereits zu viele Clients.

Meine Batch-Einfügeoperation wird mehr als Tausende von Datensätzen umfassen. Die maximale Verbindung für meine Postgres beträgt 100.

Wie kann ich die maximale Anzahl an Verbindungen erhöhen?

Jet
quelle
Verwenden Sie einen Verbindungspool wie pgBouncer oder pgPool
Frank Heikens
2
1. Überprüfen Sie zunächst, ob Ihre Middleware nicht zu viele Verbindungen offen hält oder diese leckt. 2. (vielleicht) als nächstes einen Verbindungspooler verwenden. 3. Erhöhen Sie (fast) niemals die Anzahl der zulässigen Verbindungen für diese Art von Problem. In den meisten Fällen wird dies die Situation verschlimmern. (außer wenn Sie absolut sicher sind)
Joop

Antworten:

217

Nur zu erhöhen max_connectionsist eine schlechte Idee. Sie müssen erhöhen shared_buffersund kernel.shmmaxauch.


Überlegungen

max_connectionsbestimmt die maximale Anzahl gleichzeitiger Verbindungen zum Datenbankserver. Der Standardwert beträgt normalerweise 100 Verbindungen.

Bevor Sie die Anzahl Ihrer Verbindungen erhöhen, müssen Sie möglicherweise Ihre Bereitstellung skalieren. Zuvor sollten Sie jedoch überlegen, ob Sie wirklich ein erhöhtes Verbindungslimit benötigen.

Jede PostgreSQL-Verbindung belegt RAM für die Verwaltung der Verbindung oder des Clients, der sie verwendet. Je mehr Verbindungen Sie haben, desto mehr RAM wird verwendet, um stattdessen die Datenbank auszuführen.

Eine gut geschriebene App benötigt normalerweise keine große Anzahl von Verbindungen. Wenn Sie eine App haben, die eine große Anzahl von Verbindungen benötigt, sollten Sie ein Tool wie pg_bouncer verwenden, mit dem Verbindungen für Sie zusammengefasst werden können. Da jede Verbindung RAM verbraucht, sollten Sie versuchen, deren Verwendung zu minimieren.


So erhöhen Sie die maximale Anzahl an Verbindungen

1. Erhöhen max_connectionundshared_buffers

im /var/lib/pgsql/{version_number}/data/postgresql.conf

Veränderung

max_connections = 100
shared_buffers = 24MB

zu

max_connections = 300
shared_buffers = 80MB

Der shared_buffersKonfigurationsparameter legt fest , wie viel Speicher ist gewidmet zu verwenden , um PostgreSQL Caching von Daten .

  • Wenn Sie ein System mit 1 GB oder mehr RAM haben, beträgt ein angemessener Startwert für shared_buffers 1/4 des Speichers in Ihrem System.
  • Es ist unwahrscheinlich, dass Sie mehr als 40% des Arbeitsspeichers verwenden, um besser zu arbeiten als eine kleinere Menge (wie 25%).
  • Beachten Sie, dass es bei einem 32-Bit-System- oder PostgreSQL-Build möglicherweise nicht sinnvoll ist, shared_buffers auf über 2 bis 2,5 GB zu setzen.
  • Beachten Sie, dass unter Windows große Werte für shared_buffers nicht so effektiv sind und Sie möglicherweise bessere Ergebnisse erzielen, wenn Sie sie relativ niedrig halten und stattdessen den Betriebssystem-Cache häufiger verwenden. Unter Windows beträgt der nützliche Bereich 64 MB bis 512 MB .

2. Ändern Sie kernel.shmmax

Sie müssten die maximale Segmentgröße des Kernels erhöhen, um etwas größer als die zu sein shared_buffers.

Stellen Sie /etc/sysctl.confin der Datei den Parameter wie unten gezeigt ein. Es wird beim postgresqlNeustart wirksam (In der folgenden Zeile wird der Kernel maximal auf 96Mb)

kernel.shmmax=100663296

Verweise

Postgres Max-Verbindungen und gemeinsam genutzte Puffer

Optimieren Ihres PostgreSQL-Servers

Ankit
quelle
gute Antwort. ein paar Fragen .. wie ist 100663296 gleich 96MB? und warum ändern wir shmmax was macht das?
Robbo_UK
3
100663296 Bytes = 96 MB (binär). shmmax ist die maximale Größe eines gemeinsam genutzten Speichersegments . Jetzt, da wir die Größe der gemeinsam genutzten Puffer erhöht haben, müssen wir shmmax ändern, um dem erhöhten Speicher für das Caching Rechnung zu tragen.
Ankit
1
@ Robbo_UK 96 * 1024 * 1024 = 100663296
Skrebbel
6
Sie können PGTune verwenden , um diese Einstellungen für Ihr System zu ermitteln
Yoan Tournade
11
Überprüfen Sie Ihre aktuelle kernel.shmmax-Einstellung ( cat /proc/sys/kernel/shmmax), bevor Sie sie ändern. Auf modernen Systemen ist es bereits lächerlich hoch eingestellt und sollte nicht geändert werden. Meins ist 18446744073692774399unter Ubuntu 18.04 standardmäßig eingestellt.
Carl Zulauf
30

Zu Winnies großartiger Antwort hinzufügen:

Wenn jemand den Speicherort der Datei postgresql.conf in Ihrem Setup nicht finden kann, können Sie jederzeit die Postgres selbst fragen.

SHOW config_file;

Für mich war das Ändern der max_connections allein der Trick.

Jinxer Albatros
quelle
2
Danke dir. In Ubuntu 18.04 ist es/etc/postgresql/11/main/postgresql.conf
gies0r
1

Ändern Sie die Variable max_connections in der Datei postgresql.conf in / var / lib / pgsql / data oder / usr / local / pgsql / data /

Archana
quelle
2
Warum pg_hba.conf? Es gibt keinen Parameter für die Anzahl der Verbindungen, nur für die Verbindung. postgresql.conf auf der anderen Seite .... Aber Hunderte von Verbindungen sind eine schlechte Idee, tun Sie es nicht, verwenden Sie einen Verbindungspool oder leiden Sie unter Leistungsproblemen. PostgreSQL 8.3 ist seit vielen Jahren EOL. Bitte verwenden Sie eine aktuelle Version.
Frank Heikens