Verständnis für den freigegebenen Arbeitsspeicher von PostgreSQL

Abgeschlossen

PostgreSQL verwendet Arbeitsspeicher, der klassifiziert werden kann:

  • lokale Speicher- – jedem Prozess zugeordnet
  • Gemeinsamer Speicher – wird von allen Prozessen verwendet

Lokaler Speicher

Jeder Prozess in PostgreSQL erfordert Speicher für die Abfrageverarbeitung. Mit den folgenden Serverparametern können Sie die Speicherauslastung definieren:

work_mem definiert Arbeitsspeicher, der für das Sortieren von Tupeln für ORDER BY- und DISTINCT-Vorgänge erforderlich ist. Dieser Parameter bestimmt, wie viel Arbeitsspeicher für interne Sortiervorgänge und Hashtabellen verfügbar ist. Wenn Sie über eine große Menge verfügbaren Arbeitsspeicher verfügen und Ihre Workload Abfragen mit komplexer Sortierung hat, kann die Erhöhung dieses Parameterwerts die Leistung verbessern, indem größere Scans im Arbeitsspeicher vor dem Überlauf auf den Datenträger zugelassen werden.

Eine komplexe Abfrage kann jedoch viele Sortier- und Hashvorgänge gleichzeitig ausführen. Jeder Vorgang verwendet so viel Arbeitsspeicher, wie dieser Wert zulässt, bevor er mit dem Schreiben auf datenträgerbasierten temporären Dateien beginnt. Bei einem ausgelasteten System ist daher die Gesamtspeicherauslastung oft der eines einzelnen work_mem Parameters.

Verwenden Sie zum Optimieren dieses Werts den Gesamtspeicher * 0,25 / max_connections als Anfangswert.

maintenance_work_mem ist der Speicher, der für VACUUM und REINDEXerforderlich ist. Dieser Parameter bestimmt, wie viel Arbeitsspeicher für interne Sortiervorgänge und Hashtabellen verfügbar ist. Der Standardwert ist 64 KB, aber das Erhöhen dieses Werts verbessert die Leistung beim Vakuumieren.

autovacuum_work_mem legt den maximalen Arbeitsspeicher fest, der von jedem autovacuum-Prozess verwendet werden soll.

temp_buffers definiert Arbeitsspeicher zum Speichern temporärer Tabellen. Dieser Parameter legt die maximale Anzahl temporärer Puffer fest, die von jeder Datenbanksitzung verwendet werden.

effective_cache_size definiert die Menge des verfügbaren Arbeitsspeichers für die Datenträgerzwischenspeicherung durch das Betriebssystem und innerhalb der Datenbank. Der PostgreSQL-Abfrageplaner bestimmt, ob dieser Speicher im RAM gespeichert ist. Indexüberprüfungen werden höchstwahrscheinlich für höhere Werte verwendet; andernfalls werden sequenzielle Scans verwendet, wenn der Wert niedrig ist.

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

Freigegebener Speicher

Gemeinsamer Speicher wird beim Start zugewiesen. Freigegebener Speicher wird für Folgendes verwendet:

shared_buffers definiert die vom Server verwendeten gemeinsam genutzten Speicherpuffer. PostgreSQL lädt Seiten von Tabellen und Indizes von persistentem Speicher in einen freigegebenen Pufferpool und arbeitet dann im Arbeitsspeicher an ihnen. Dieser freigegebene Pufferpool ist die Hauptkomponente des vom Server verwendeten freigegebenen Speichers. Der Standardwert ist 128 MB (abhängig von der Computeebene). Wenn Sie mehr Arbeitsspeicher zuweisen möchten, müssen Sie den Server neu starten.

wal_buffers definiert die Anzahl der Datenträgerseitenpuffer im gemeinsam genutzten Speicher für die Schreibschutzprotokollierung (Write Ahead Logging, WAL), bevor sie in beständigen Speicher geschrieben wird.

Zusammenfassend sind die wichtigen Serverparameter, die sich auf den Arbeitsspeicher beziehen und die Sie möglicherweise anpassen möchten:

  • gemeinsame Puffer (shared_buffers)
  • work_mem
  • effektive Cache-Größe