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.
Geändert werden kann sie bequem per ALTER SYSTEM, benötigt danach aber einen Neustart.
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.
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.
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.
Die 145608 K werden durch die Huge Page Size Größe dividiert und das Ergebnis wird auf eine ganze Zahl aufgerundet.
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.
Das Tuning Profil wird per tuned-adm aktiviert und ist dann auch für einen Reboot persistiert.
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:
Mit Huge Pages:
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