PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

FEHLER:Speichermangel auf Maschine mit 32 GB RAM und ohne Auslagerungsdatei

Wenn ich die Ausgabe Ihres Top richtig lese, wird sie nicht an einem Punkt aufgenommen, an dem Sie keinen Speicher mehr haben.

Der eigentliche Fehler scheint in Ordnung zu sein - er fordert nicht viel Speicher an, also war vermutlich zu diesem Zeitpunkt nicht genügend Speicher vorhanden.

Werfen wir einen kurzen Blick auf Ihre Einstellungen:

max_connections = 1000                  # (change requires restart)
work_mem = 40MB                         # min 64kB

Sie sind also der Meinung, dass Sie 1000 gleichzeitige Abfragen mit jeweils beispielsweise 10 + 40 MB unterstützen können (einige verwenden möglicherweise ein Vielfaches von 40 MB, aber seien wir vernünftig). Also - das deutet für mich darauf hin, dass Ihr Computer> 500 Kerne hat und sagen wir 100 GB RAM. Das ist nicht der Fall.

Also - nehmen Sie Ihre Anzahl von Kernen und verdoppeln Sie sie - das ist ein vernünftiger Wert für die maximale Anzahl von Verbindungen. Dadurch können Sie jeden Kern abfragen, während ein anderer auf I/O wartet. Platzieren Sie dann bei Bedarf einen Connection Pooler vor der DB (pgbouncer / Javas Connection Pooling).

Dann können Sie ggf. sogar work_mem erhöhen.

Oh - vollkommen vernünftig, ohne aktivierten Swap zu laufen. Sobald Sie mit dem Austauschen beginnen, befinden Sie sich in Bezug auf die Datenbanknutzung sowieso in einer Welt voller Schmerzen.

Bearbeiten:Erweitern Sie work_mem vs shared

Ziehen Sie im Zweifelsfall immer die Dokumentation .

Die shared_buffers Wert wird, wie der Name schon sagt, von Backends gemeinsam genutzt. Das work_mem ist nicht nur pro Backend, es ist tatsächlich pro Sorte. Eine Abfrage kann also drei- oder viermal so viel verbrauchen, wenn sie nach drei Unterabfragen sortiert.