Tune Linux Kernel Parameter für die PostgreSQL Optimisation – Part1

HUGE PAGES

Linux verwendet standardmäßig 4K-Speicherseiten, BSD hat Super Pages, während Windows Large Pages hat. Eine Seite ist ein RAM-Block, der einem Prozess zugeordnet ist. Ein Prozess kann je nach Speicherbedarf mehr als eine Seite besitzen. Je mehr Speicher ein Prozess benötigt, desto mehr Seiten sind ihm zugeordnet. Das Betriebssystem führt eine Tabelle mit der Seitenzuordnung zu den Prozessen. Je kleiner die Seitengröße, desto größer die Tabelle, desto mehr Zeit wird benötigt, um eine Seite in dieser Seitentabelle nachzuschlagen. Daher ermöglichen es HUGE PAGES, eine große Menge an Speicher mit reduziertem Overhead zu verwenden. weniger Seitensuche, weniger Seitenfehler, schnellere Lese-/Schreibvorgänge durch größere Puffer. Dies führt zu einer verbesserten Leistung.

PostgreSQL unterstützt nur größere Seiten unter Linux. Standardmäßig verwendet Linux 4K Speicherseiten, sodass in Fällen, in denen zu viele Speicheroperationen ausgeführt werden, größere Seiten festgelegt werden müssen. Leistungssteigerungen wurden durch die Verwendung großer Seiten mit Größen von 2 MB und bis zu 1 GB beobachtet. Die Größe von Huge Page kann für die Startzeit festgelegt werden. Sie können ganz einfach die HUGE Page Einstellungen und die Auslastung ihrer Linux-Box mit dem cat / proc /meminfo | grep -i huge Befehl überprüfen.

Holen Sie sich die HugePage Info – Unter Linux (nur)

1

2

3

4

5

6

7

8

## Hinweis: Dies gilt nur für Linux, für andere Betriebssysteme wird dieser Vorgang ignoriert
$ cat /proc/meminfo | grep -i huge

AnonHugePages:         0 kB

ShmemHugePages:        0 kB

HugePages_Total:       0

HugePages_Free:        0

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

   

Obwohl in diesem Beispiel die Größe einer großen Seite auf 2.048 (2 MB) festgelegt ist, hat die Gesamtzahl der großen Seiten den Wert 0. was bedeutet, dass riesige Seiten disabled sind.

Skript zur Quantifizierung der Huge Pages

Dies ist ein einfaches Skript, das die Anzahl der erforderlichen Huge Pages zurückgibt. Führen Sie das Skript auf Ihrer Linux-Box aus, während Ihr PostgreSQL ausgeführt wird. Stellen Sie sicher, dass $PGDATA Umgebungsvariable auf das PostgreSQL-Datenverzeichnis festgelegt ist.

Abrufen der Anzahl der erforderlichen HugePages

1

2

3

4

5

6

7

8

9

#!/bin/bash

pid=`head -1 $PGDATA/postmaster.pid`

echo "Pid:            $pid"

peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'`

echo "VmPeak:            $peak kB"

hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'`

echo "Hugepagesize:   $hps kB"

hp=$((peak/hps))

echo Set Huge Pages:     $hp

   

Die Ausgabe des Skripts sieht folgendermaßen aus:

Skriptausgabe

1

2

3

4

Pid:            12737

VmPeak:         180932 kB

Hugepagesize:   2048 kB

Set Huge Pages: 88

   

Die empfohlenen großen Seiten sind 88, daher sollten Sie den Wert auf 88 setzen.

Festlegen von HugePages

1

sysctl -w vm.nr_hugepages= 88

Überprüfen Sie jetzt die huge pages, Sie werden sehen, dass keine huge page verwendet wird (HugePages_Free = HugePages_Total).

Wieder HugePage Info – Unter Linux (nur)

1

2

3

4

5

6

7

8

$ cat /proc/meminfo | grep -i huge

AnonHugePages:         0 kB

ShmemHugePages:        0 kB

HugePages_Total:      88

HugePages_Free:       88

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

Setzen Sie nun den Parameter huge_pages "on" in $PGDATA/postgresql.conf und starten Sie den Server neu.

Und wieder HugePage Info – Unter Linux (nur)

1

2

3

4

5

6

7

8

$ cat /proc/meminfo | grep -i huge

AnonHugePages:         0 kB

ShmemHugePages:        0 kB

HugePages_Total:      88

HugePages_Free:       81

HugePages_Rsvd:       64

HugePages_Surp:        0

Hugepagesize:       2048 kB

Jetzt können Sie sehen, dass nur sehr wenige der huge pages verwendet werden. Versuchen wir nun, der Datenbank einige Daten hinzuzufügen.

Einige DB-Operationen zur Verwendung von HugePages

1

2

3

4

postgres=# CREATE TABLE foo(a INTEGER);

CREATE TABLE

postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000));

INSERT 0 10000000

Mal sehen, ob wir jetzt mehr huge pages verwenden als zuvor.

Noch einmal HugePage Info – Unter Linux (nur)

1

2

3

4

5

6

7

8

$ cat /proc/meminfo | grep -i huge

AnonHugePages:         0 kB

ShmemHugePages:        0 kB

HugePages_Total:      88

HugePages_Free:       18

HugePages_Rsvd:        1

HugePages_Surp:        0

Hugepagesize:       2048 kB

Jetzt können Sie sehen, dass die meisten der huge pages verwendet werden.

Hinweis: Der hier verwendete Stichprobenwert für HugePages ist sehr niedrig, was kein Normalwert für eine große Produktionsmaschine ist. Bitte bewerten Sie die erforderliche Anzahl von Seiten für Ihr System und legen Sie diese entsprechend der Auslastung und den Ressourcen Ihres Systems fest.

Dieser Beitrag wurde unter POSTGRES veröffentlicht. Setze ein Lesezeichen auf den Permalink.