
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,
free
sie 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;