Ich habe mich in letzter Zeit mit den Speichereinstellungen von PostgreSQL beschäftigt, um Wege zu finden, sie fein abzustimmen und die Leistung zu steigern. Nach dem Durchforsten zahlreicher Ressourcen und dem Durchführen einiger Tests habe ich ein paar wichtige Einstellungen gefunden, die einen großen Unterschied machen können.

Wenn du PostgreSQL betreibst und optimieren möchtest, wie es Speicher nutzt, sind hier einige wichtige Einstellungen, auf die du achten solltest.

Wichtige Speichereinstellungen zum Abstimmen

Lass uns die wichtigsten PostgreSQL-Speichereinstellungen aufschlüsseln, die du in Betracht ziehen solltest.

  1. shared_buffers

Denke an shared_buffers als den persönlichen Speicher von PostgreSQL, wo es häufig abgerufene Daten aufbewahrt. Die Idee ist, so viele Daten wie möglich im Speicher zu halten, um teure Festplattenzugriffe zu reduzieren.

Empfohlene Einstellung:

Die meisten Experten empfehlen, dies auf etwa 25% des gesamten RAM deines Systems einzustellen.

Wenn du zum Beispiel 16GB RAM hast, ist es ein guter Ausgangspunkt, es auf etwa 4GB einzustellen.

  1. work_mem

Immer wenn PostgreSQL Abfragen verarbeitet, die Sortieren, Verbinden oder Gruppieren von Daten beinhalten, verwendet es work_mem. Diese Einstellung steuert, wie viel Speicher jede Operation erhält, bevor sie beginnt, temporäre Dateien auf die Festplatte zu schreiben.

Beispiel:

  • Wenn work_mem = 50MB und deine Abfrage 5 Sortieraufgaben hat, könnte sie 50MB x 5 = 250MB Speicher verwenden.
  • Stell dir nun 10 Benutzer vor, die ähnliche Abfragen ausführen – das sind 250MB x 10 = 2,5GB Speicher, der verwendet wird.

Tipp:

  • Setze es zu niedrig, und Abfragen könnten langsamer werden aufgrund der Festplattennutzung.
  • Setze es zu hoch, und du könntest schnell ohne Speicher dastehen, besonders bei vielen Benutzern.

Manchmal können größere work_mem-Werte tatsächlich die Dinge verlangsamen, weil PostgreSQL große Speicherblöcke verwalten muss.

  1. effective_cache_size

Diese Einstellung ist ein bisschen anders – sie weist tatsächlich keinen Speicher zu, sondern sagt PostgreSQL, wie viel Speicher es denkt, dass es aus dem OS-Cache verwenden kann. PostgreSQL verwendet diesen Wert, um zu entscheiden, ob es Indizes verwenden oder sequentielle Scans durchführen soll.

Falsche Einstellung:

  • Zu niedrig? PostgreSQL könnte Indizes vermeiden, weil es denkt, dass der Speicher knapp ist.
  • Zu hoch? PostgreSQL könnte zu optimistisch werden und falsche Entscheidungen treffen.

Eine gute Faustregel: Setze dies auf 50-75% deines gesamten RAMs, besonders wenn PostgreSQL die Hauptlast auf der Maschine ist.

  1. maintenance_work_mem

Hierbei geht es darum, wie viel Speicher PostgreSQL für Dinge wie VACUUM, CREATE INDEX und andere Wartungsaufgaben verwenden kann. Eine höhere Einstellung kann diese Operationen beschleunigen, ohne die normale Datenbankaktivität zu verlangsamen.

Vorgeschlagene Einstellung:

Wenn du Platz hast, erhöhe es auf 1GB oder mehr, um Wartungsaufgaben schneller zu erledigen.

Möglichkeiten zur Änderung der Speichereinstellungen

PostgreSQL ermöglicht die Änderung der Speichereinstellungen auf verschiedene Weise, abhängig von deinen Anforderungen und deiner Risikobereitschaft. Hier sind die effektivsten Ansätze:

  1. Globale Änderung der Speichereinstellungen

Für permanente Änderungen über alle Sitzungen und Abfragen hinweg, ändere die PostgreSQL-Konfigurationsdatei (postgresql.conf) oder verwende ALTER SYSTEM:

  1. Ändern der Einstellungen pro Sitzung

Für temporäre Anpassungen, die nur die aktuelle Verbindung betreffen:

Mein echtes Beispiel für die PostgreSQL-Speicherabstimmung

Szenario ##o

Eine PostgreSQL 10-Datenbank, die auf einem 30GB RAM-Server läuft, mit oft 15GB RAM verfügbar, hatte langsame CSV-Exportabfrageleistungen, als sie Finanztransaktionen verarbeitete. Eine komplexe Abfrage, die vier große Tabellen verbindet, benötigte 33 Sekunden, um Ergebnisse zu liefern:

Tabellengrößen:

  • finance_transaction (~1 Million Zeilen)
  • transaction_log (~1 Million Zeilen)
  • transaction_audit_history (~4 Millionen Zeilen)
  • billing_record (~1 Million Zeilen)

Standard-Speichereinstellungen:

EinstellungenStandardwert
shared_buffers128MB
work_mem4MB
maintenance_work_mem64MB
effective_cache_size4GB

Abfrageausführungsplan (EXPLAIN ANALYZE)

Analysiere den Abfrageausführungsplan:

ProblemBeobachtung aus EXPLAIN ANALYZEMögliche UrsacheLösung
Festplattenspeicher in Hash JoinsBuckets: 4096 → Batches: 512 Speicherverbrauch: 708kBwork_mem ist zu niedrig (Standard 4MB)Erhöhe work_mem auf 300MB ALTER SYSTEM SET work_mem = '300MB';
Hohe I/O durch sequentielle ScansParallel Seq Scans auf billing_record, finance_transaction und transaction_logshared_buffers zu niedrig (Standard 128MB)Erhöhe shared_buffers auf 8GB ALTER SYSTEM SET shared_buffers = '8GB';
Abfrageplaner unterschätzt verfügbaren RAMVerwendet mehr sequentielle Scans anstelle von Index-Scanseffective_cache_size zu niedrig (Standard 4GB)Erhöhe effective_cache_size auf 20GB ALTER SYSTEM SET effective_cache_size = '20GB';

Nach der Erhöhung der Speichereinstellungen ist dies das Ergebnis von EXPLAIN ANALYZE:

Leistungsvergleich: Vor und Nach der Erhöhung der Speichereinstellungen

MetrikVorher (Standard-Einstellungen)Nachher (Optimierte Speichereinstellungen)Verbesserung
Gesamte Ausführungszeit33.58s24.01s⬇ ~28.5% schneller (~9.5s eingespart)
Hash Join (ft.id = tah.finance_transaction)29.03s20.07s⬇ ~9s schneller
Hash Join (br.id = ft.billing_record)19.08s15.56s⬇ ~3.5s schneller
Hash-Batches (ft.transaction_log)128 Batches2 Batches✅ Riesige Reduzierung der Festplattenspeicher
Hash-Batches (transaction_audit_history)512 Batches4 Batches✅ Reduzierte Festplattennutzung

Die richtigen Speichereinstellungen wählen: Ein Fall-zu-Fall-Ansatz

Die Abstimmung der PostgreSQL-Speichereinstellungen ist keine Lösung, die für alle passt. Es hängt von der Größe deiner Datenbank, den gleichzeitigen Benutzern und den Abfragemustern ab. Finde das richtige work_mem, shared_buffers und effective_cache_size.

  • Wenn dein Server viel freien RAM hat, kannst du PostgreSQL mehr Speicher zuweisen.
  • Wenn du viele gleichzeitige Benutzer hast, kann es Systeminstabilität verursachen, wenn du zu viel Speicher pro Abfrage zuweist.
  • Führe EXPLAIN ANALYZE bei langsamen Abfragen aus, um Festplattenspeicher und Ineffizienzen bei Hash Joins zu identifizieren.

Wenn du Änderungen sicher testen möchtest, ohne das gesamte System zu beeinflussen, wendest du die Einstellungen pro Abfrage an, anstatt global:

✅ Einstellungen für eine einzelne schwere Abfrage ändern:

Fazit

Die Abstimmung der PostgreSQL-Speichereinstellungen kann einen großen Unterschied in der Leistung ausmachen, indem sie deine Abfragen schneller ausführt und unnötige Festplatten-I/O reduziert. Der Schlüssel ist, das richtige Gleichgewicht basierend auf deiner Datenbanklast, dem verfügbaren RAM und dem Verhalten deiner Abfragen zu finden.

Wichtige Erkenntnisse:

  • Kenne deine Arbeitslast – Erhöhe die Speichereinstellungen nicht blindlings; analysiere zuerst, wie deine Abfragen laufen.
  • Verwende EXPLAIN ANALYZE – Das hilft dir, Probleme wie Festplattenspeicher und ineffiziente Joins zu erkennen.
  • Passe work_mem vorsichtig an – Ein höherer Wert kann Joins und Sortierungen schneller machen, aber zu hoch kann dir den gesamten RAM wegnehmen.
  • Ändere die Einstellungen auf der richtigen Ebene – Verwende globale Einstellungen für allgemeine Verbesserungen, Sitzungseinstellungen für temporäre Anpassungen und pro-Abfrage-Einstellungen für wirklich schwere Operationen.
  • Überwache die Auswirkungen – Überprüfe Protokolle, verfolge die Leistung und passe nach Bedarf an.

Am Ende des Tages ist die PostgreSQL-Abstimmung teil Wissenschaft, teil Experimentieren. Fang klein an, verfolge die Ergebnisse und passe an, während du vorankommst. Mit den richtigen Einstellungen wird deine Datenbank reibungslos, schneller und viel effizienter laufen. 🚀