Die Standard Page Größe ist 4 K bei Linux. Der Einsatz von Huge Pages, also Pages mit z.B. einer Größe von 2 MB, reduziert die CPU Kosten beim Laden von großen zusammenhängenden Bereichen in den Hauptspeicher (Memory Management). PostgreSQL ist hier ein schönes Beispiel, wenn Shared Buffers in Gigabyte Größe verwendet werden.

Wie können aber nun Huge Pages für PostgreSQL genutzt werden? – In der PostgreSQL Konfiguration ist das mit dem Einstellen des postgresql.conf Parameters huge_pages möglich. Er kann folgende Ausprägungen haben:

  • try – der Standardwert, bei dem PostgreSQL versucht, vorhandene Huge Pages zu nutzen, ansonsten aber ohne arbeitet
  • on – PostgreSQL startet ausschließlich, wenn genügend Huge Pages verfügbar sind
  • off – es werden keine Huge Pages genutzt

Die aktuelle Einstellung ist schnell ermittelt.

Copy to Clipboard

Geändert werden kann sie bequem per ALTER SYSTEM, benötigt danach aber einen Neustart.

Copy to Clipboard

Zuerst ist aber zu prüfen, ob der Kernel überhaupt für Huge Pages konfiguriert wurde. In vielen Distributionen ist das der Fall. Dies kann unter CentOS/7 so geprüft werden.

Copy to Clipboard

Die Größe einer Huge Page ist 2 MB, es geht aber bei Bedarf auch größer. Der Wert ist in den Hauptspeicher Informationen ersichtlich.

Copy to Clipboard

Als Nächstes lässt sich die minimal notwendige Anzahl an Huge Pages für PostgreSQL berechnen. Dazu wird mit der PID des PostgreSQL postmaster Prozesses der Prozessspeicherwert mit pmap ermittelt.

Copy to Clipboard

Die 145608 K werden durch die Huge Page Size Größe dividiert und das Ergebnis wird auf eine ganze Zahl aufgerundet.

Copy to Clipboard

Es werden also in diesem Fall mindestens 71 Huge Pages für den Betrieb von PostgreSQL mit der aktuellen Shared Buffers Größe benötigt.

Den Wert können wir jetzt per sysctl oder aber, und das ist besser, per eigenem tuned-adm Profil dauerhaft setzen. Die minimale tuned.conf beinhaltet nur das Performance Profil, das Deaktivieren der Transparent Huge Pages (THP) und der Anzahl der Huge Pages. THP zu deaktivieren ist sinnvoll, da diese zu einem Performance-Verlust führen können.

Copy to Clipboard

Das Tuning Profil wird per tuned-adm aktiviert und ist dann auch für einen Reboot persistiert.

Copy to Clipboard

Ein kleiner Test mit pgBench auf einer PostgreSQL 12 Standardkonfiguration, aber huge_pages = on, zeigt ebenfalls, dass die TPS durch das Aktivieren der Huge Pages steigen. Gängige Zugewinne liegen zwischen 5 – 25 %, wobei der zu erwartende Wert je nach bereits erfolgtem Tuning geringer ausfallen wird.

Ohne Huge Pages:

Copy to Clipboard

Mit Huge Pages:

Copy to Clipboard

Zum Schluss ist zu erwähnen, dass per tuned-adm noch mehr Parameter auf Betriebssystemebene angepasst werden können, damit PostgreSQL mehr Leistung erbringt.

Wer sich über Postgresql- und Datenbankthemen austauschen oder beraten möchte, kann gerne direkt Kontakt mit mir aufnehmen. >>Zum Kontaktformular

Blog Dirk Aumüller

Dirk Aumüller

Dirk Aumueller arbeitet als Associate Partner für die Proventa AG. Sein technologischer Schwerpunkt liegt bei Datenbankarchitekturen mit PostgreSQL sowie Data Management Lösungen mit Pentaho. Zusätzlich zu seinen Datenbanktransformations-Projekteinsätzen ist er regelmäßig als PostgreSQL Trainer unterwegs und betreut Studenten bei ihren Abschlussarbeiten. Seine fachlichen Erfahrungen erstrecken sich über die Branchen Telco und Financial Services.