Wie löse ich das Problem „out of shared memory“ in PostgreSQL?
- Ursache des Problems
- Analyse der Situation
- Konfiguration anpassen
- Vermeidung zukünftiger Probleme
- Zusammenfassung
Ursache des Problems
Die Fehlermeldung out of shared memory in PostgreSQL tritt auf, wenn der Server auf die Grenzen des verfügbaren gemeinsamen Speichers für interne Verwaltungsstrukturen stößt. Gemeinsamer Speicher bedeutet in diesem Zusammenhang Speicherbereiche, die von mehreren Backend-Prozessen gleichzeitig genutzt werden, beispielsweise für das Sperrmanagement (Lock-Management) oder die Verwaltung von Katalogdaten. Wenn PostgreSQL zu viele gleichzeitige Sperren oder zu viele Operationen durchführt, die diese gemeinsamen Ressourcen beanspruchen, kann der zugewiesene Shared Memory überschritten werden. Das Resultat ist, dass neue Sperren nicht mehr angelegt werden können und der Server mit dieser Fehlermeldung antwortet.
Analyse der Situation
Zunächst ist es empfehlenswert herauszufinden, was genau zu der erhöhten Shared-Memory-Auslastung führt. Meistens hängt dieses Problem mit einer großen Anzahl gleichzeitig geöffneter Transaktionen oder Tabellen zusammen, die viele Sperren anfordern. Insbesondere Anwendungen, die viele parallele Verbindungen verwenden, sehr viele Indizes oder viele temporäre Objekte anlegen, können dieses Problem hervorrufen. Auch fehlende oder lange laufende Transaktionen spielen häufig eine Rolle, da diese Sperren lange halten.
Konfiguration anpassen
Das grundlegende Mittel zur Lösung ist, den Shared Memory-Bereich in der PostgreSQL-Konfiguration zu erhöhen. Dies geschieht durch Anpassung des Parameters max_locks_per_transaction. Standardmäßig ist dieser Wert oft auf 64 gesetzt, was bedeutet, dass pro Transaktion 64 Sperren reserviert werden. Wenn Ihre Anwendung oder Datenbank mehr Sperren benötigt, muss dieser Wert nach oben gesetzt werden.
Um den neuen Wert zu wählen, sollten Sie zunächst ungefähr abschätzen, wie viele Sperren pro Transaktion gebraucht werden. Die Gesamtanzahl der Sperren im System entspricht dann in etwa max_connections * max_locks_per_transaction. Ein Größenordnungstest kann zum Beispiel sein, max_locks_per_transaction auf 128 oder 256 zu erhöhen.
Die Änderung können Sie in der Datei postgresql.conf vornehmen, indem Sie den Parameter so setzen:
max_locks_per_transaction = 128Nach der Änderung ist ein Neustart des PostgreSQL-Servers erforderlich, da dieser Parameter nicht zur Laufzeit geändert werden kann.
Zusätzlich ist es sinnvoll, generelle Shared Memory Einstellungen des Servers zu prüfen und falls nötig anzupassen. Unter Linux sind zum Beispiel die Kernel-Parameter kernel.shmmax und kernel.shmall relevant, da PostgreSQL Shared Memory für seinen Betrieb vom Betriebssystem reservieren muss. Diese Systemeinstellungen können Sie mit sysctl abfragen bzw. anpassen. Bei sehr großen Speicheranforderungen muss hier ggf. eine Erhöhung vorgenommen werden.
Vermeidung zukünftiger Probleme
Neben der Erhöhung der Konfigurationsparameter sollten Sie auch die Anwendung und Datenbank-Design überprüfen. Vermeiden Sie möglichst lange offene Transaktionen, da diese Sperren lange belegen. Ebenso kann es sinnvoll sein, die Anzahl paralleler Verbindungen mit z.B. max_connections und Connection-Pooling zu steuern, um gleichzeitige Belastung zu reduzieren.
Prüfen Sie auch, ob Indizes oder andere Objekte, die viele Sperren erfordern, optimiert oder reduziert werden können. Temporäre Tabellen und komplexe Transaktionen mit vielen Zugriffen auf diverse Objekte sollten hinterfragt werden, um die Sperrenlast zu minimieren.
Zusammenfassung
Das Problem out of shared memory hängt in PostgreSQL im Wesentlichen mit einer Knappheit an gemeinsamem Speicher für Sperrstrukturen zusammen. Die Lösung besteht hauptsächlich darin, den Parameter max_locks_per_transaction zu erhöhen und gegebenenfalls Systemlimits anzupassen. Gleichzeitig ist es wichtig, die Arbeitsweise der Anwendung so zu gestalten, dass möglichst wenig gleichzeitige Sperren beansprucht werden, um dieses Problem nachhaltig zu vermeiden. Ein Überblick über laufende Transaktionen, Sperren und Verbindungen hilft dabei, die Ursache gezielt zu erkennen und zu beheben.
