PostgreSQL begrenzt Verbindungen auf weniger als max_connections?

PostgreSQL begrenzt Verbindungen auf weniger als max_connections?

Ich habe einen PostgreSQL 9.4-Server, der die Verbindungen anscheinend auf weniger begrenzt, als ich in max_connections definiert habe.

Ich habe max_connections auf 300 eingestellt.

SHOW max_connections;

max_connections
-----------------
300

Ich habe jedoch festgestellt, dass bei neuen Verbindungen eine Zeitüberschreitung auftritt, sobald die Anzahl der aktiven Verbindungen 100 erreicht, gemessen anSELECT count(*) from pg_stat_activity;

Solange diese Zahl unter 100 liegt, funktionieren neue Verbindungen. Sobald sie 100 erreicht, schlagen neue Verbindungen fehl: PG::ConnectionBad: could not connect to server: Connection timed out(Ruby pg-Bibliothek)

Es scheint eine Ausnahme für Superuser-Verbindungen zu geben (z. B. meine Verbindung über PgAdmin), da ich auf diese Weise den Schwellenwert von 100 überschreiten kann, obwohl bei Apps, die keine Superuser verwenden, weiterhin ein Timeout auftritt.

Ich bin ratlos, was die genaue Grundursache sein könnte.

Einige Konfigurationseinstellungen:

max_connections = 300
superuser_reserved_connections = 2
shared_buffers = 1024MB
effective_cache_size = 2048MB
work_mem = 8MB
maintenance_work_mem = 256MB

Ich habe versucht, ein wenig an diesen Werten herumzubasteln, aber ohne brauchbares Ergebnis.

Andere Details:

  • Ubuntu 14.04 64-Bit
  • 4 GB Linode VPS
  • PostgreSQL 9.4.1
  • Mit im Wesentlichen derselben Konfiguration auf PostgreSQL 9.2 hatte ich dieses Problem nicht.
  • Datenbanken wurden von Postgres 9.2 über pg_dumpall migriert
  • Die Speichernutzung scheint kein Problem zu sein, freesie zeigt 2,1 GB frei, 3,5 GB einschließlich Puffer/Cache.
  • Die Verbindungen bestehen für viele verschiedene Rollen zu vielen verschiedenen Datenbanken, keine einzelne Datenbank hat mehr als 5 oder 6 aktive Verbindungen und auf jede Datenbank wird von ihrer eigenen separaten Rolle zugegriffen. Es scheint keine Verbindungsbeschränkungen für einzelne Datenbanken oder Rollen zu verletzen.

Antwort1

Haben Sie auch die maximale Segmentgröße des Kernels erhöht?

Versuchen:

sysctl -w kernel.shmmax=1258291200

Antwort2

Ist es möglich, dass Sie die maximale Benutzerverbindung begrenzt haben?Rollenberechtigungen

Dies können Sie ändern mit

ALTER ROLE Rollenname VERBINDUNGSLIMIT 300;

verwandte Informationen