Verstehen des gemeinsam genutzten Arbeitsspeichers von PostgreSQL

Abgeschlossen

PostgreSQL nutzt Arbeitsspeicher, der wie folgt klassifiziert werden kann:

  • Lokaler Arbeitsspeicher, der den einzelnen Prozesses zugeordnet ist
  • Gemeinsam genutzter Arbeitsspeicher, der allen Prozessen zugeordnet ist

Lokaler Arbeitsspeicher

Jeder Prozess in PostgreSQL erfordert Arbeitsspeicher für die Abfrageverarbeitung. Mit den folgenden Serverparametern können Sie die Nutzung von Arbeitsspeicher festlegen:

work_mem bestimmt den Arbeitsspeicher, der zum Sortieren von Tupeln für die Vorgänge ORDER BY und DISTINCT erforderlich ist. Dieser Parameter legt die Größe des Arbeitsspeichers fest, der für interne Sortiervorgänge und Hashtabellen verfügbar ist. Wenn viel Arbeitsspeicher zur Verfügung steht und Ihre Workload Abfragen mit komplexer Sortierung aufweist, kann eine Erhöhung dieses Parameterwerts die Leistung verbessern, da größere Überprüfungsvorgänge im Arbeitsspeicher möglich sind, bevor sie auf den Datenträger ausgelagert werden.

Bei einer komplexen Abfrage können jedoch viele Sortier- und Hashvorgänge gleichzeitig ablaufen. Jeder Vorgang belegt so viel Arbeitsspeicher, wie dieser Wert zulässt, ehe er beginnt, in temporäre Dateien auf dem Datenträger zu schreiben. Auf einem stark ausgelasteten System ist daher die gesamte Arbeitsspeicherauslastung ein Vielfaches der eines einzelnen work_mem-Parameters.

Um diesen Wert zu optimieren, nutzen Sie die Formel „Gesamter RAM x 0,25 : max_connections“ als Ausgangswert.

maintenance_work_mem ist Arbeitsspeicher, der von vacuum und reindex benötigt wird. Dieser Parameter legt die Größe des Arbeitsspeichers fest, der für interne Sortiervorgänge und Hashtabellen verfügbar ist. Der Standardwert ist 64 KB, aber durch Erhöhen dieses Werts wird die Leistung für die regelmäßige Wartung (Vacuuming) verbessert.

autovacuum_work_mem legt den maximalen Arbeitsspeicher fest, der von den einzelnen automatischen Wartungsprozessen genutzt werden kann.

temp_buffers legt Arbeitsspeicher für die Speicherung temporärer Tabellen fest. Dieser Parameter legt die maximale Anzahl temporärer Puffer fest, die von den einzelnen Datenbanksitzungen verwendet werden.

effective_cache_size bestimmt die Menge des verfügbaren Arbeitsspeichers für das Zwischenspeichern auf Datenträgern durch das Betriebssystem und innerhalb der Datenbank. Der PostgreSQL-Abfrageplaner ermittelt, ob dieser Speicher im RAM festgeschrieben ist. Indexscans werden höchstwahrscheinlich für höhere Werte verwendet. Andernfalls werden bei einem niedrigen Wert sequenzielle Scans ausgeführt.

Legen Sie effective_cache_size auf 50 % des gesamten RAM des Computers fest.

Shared Memory

Gemeinsam genutzter Speicher wird beim Start zugewiesen. Gemeinsam genutzter Speicher wird für Folgendes verwendet :

shared_buffers bestimmt die vom Server gemeinsam genutzten Arbeitsspeicherpuffer. PostgreSQL lädt Seiten von Tabellen und Indizes aus dem beständigen Speicher in einen gemeinsam genutzten Pufferpool und bearbeitet sie dann im Arbeitsspeicher. Der freigegebene Pufferpool ist die Hauptkomponente des vom Server gemeinsam genutzten Arbeitsspeichers. Der Standardwert ist (je nach Computetarif) 128 MB. Wenn Sie mehr Arbeitsspeicher zuweisen möchten, müssen Sie den Server neu starten.

wal_buffers legt die Anzahl der Seitenpuffer des Datenträgers im gemeinsam genutzten Arbeitsspeicher für die Write-Ahead-Protokollierung (WAL) fest, ehe diese in beständigen Speicher geschrieben wird.

Zusammenfassend sind die wichtigsten Serverparameter in Bezug auf den Arbeitsspeicher, die Sie möglicherweise optimieren möchten, die folgenden:

  • shared_buffers
  • work_mem
  • effective_cache_size