PostgreSQL, Linux, HugePage

De Linux France
Aller à : navigation, rechercher

Objectif: paramétrer/configurer PostgreSQL (ici version 13) sous Linux de sorte qu'il emploie des HugePages.

Doc de référence, y chercher "linux"

Approche

Au préalable déterminer si un autre logiciel emploie des HugePages. Pour cela invoquer:

grep -i HugePages_Total: /proc/meminfo

Qui doit retourner "HugePages_Total: 0".

Nous allons paramétrer PostgreSQL ("PG"), puis déterminer et établir des valeurs adéquates pour les paramètres du noyau (kernel) pertinents.

Ces paramètres du noyau sont communiqués au noyau actif (qui les établit immédiatement) par l'utilitaire sysctl. Nous les consignons dans un fichier de configuration de sorte qu'ils soient restaurés durant chaque amorçage de la machine. Sous Debian les placer par exemple dans un nouveau fichier nommé "/etc/sysctl.d/postgres.conf". Le contenu de ce fichier est textuel, en voici un exemple (inutilisable!) établissant la valeur du paramètre "toto" à 7 et celle de "titi" à 42:

toto = 7
titi = 42

Attention: ne PAS bricoler au hasard un paramètre noyau!

Pour modifier immédiatement les valeurs de ces paramètres du noyau actif invoquer en tant que root "sysctl -p FiChIeR", où FiChIeR est le nom d'un fichier. Exemple:

sysctl -p /etc/sysctl.d/postgres.conf

Paramètres kernel.shmmax et kernel.shmall

Le premier paramètre ici pertinent est kernel.shmmax.

J'opte pour un paramétrage permissif, révélé par ce script (à lancer sur la machine où PG fonctionnera):

#!/bin/bash
page_size=$(getconf PAGE_SIZE)
phys_pages=$(getconf _PHYS_PAGES)
shmall=$(( phys_pages / 2 ))
echo kernel.shmmax = $(( shmall * page_size ))
echo kernel.shmall = $shmall

Dans le fichier destiné à sysctl on trouvera par exemple:

kernel.shmmax=120903024640
kernel.shmall=29513538

Il faut aussi déclarer ainsi, via le paramètre vm.hugetlb_shm_group l'identificateur numérique du groupe (GID) autorisé à employer des HugePages.

J'ai pour cela créé un groupe (GID 1001) dont j'ai rendu le compte "postgres" membre, puis établit le paramètre "vm.hugetlb_shm_group=1001".

Paramétrer PostgreSQL

Paramétrer votre instance de PG.

"huge_pages = on" est ici nécessaire.

"shared_buffers" est nécessaire, ce tampon sera alloué dans des HugePages.

"work_mem", "maintenance_work_mem" et "max_connections" ont un impact non négligeable sur le volume total de mémoire centrale nécessaire.

Déterminer les valeurs des paramètres

Démarrer votre instance de PostgreSQL. Si elle a pu démarrer vous n'avez probablement pas besoin de ce document.

Lire son fichier de traces (sous Debian il se trouve dans "/var/log/postgresql/"). Il recèle un message révélant la quantité de mémoire centrale dont PG réclama en vain l'allocation. Exemple:

HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 120903024640 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

C'est ici "120903024640 bytes" et c'est la quantité minimale d'octets dans des HugePages disponibles dont nous avons besoin.

Obtenir la taille de chaque HugePage:

grep -i Hugepagesize /proc/meminfo

Le plus souvent elle vaut 2048 kB, donc deux mégaoctets.

Diviser la quantité de mémoire requise par PG (en octets) par cette taille (en octets). Attention: 1 kB contient 1024 octets, donc 2048 kB contiennent (2024*1024) octets.

Avec bc:

echo -e "scale=1\n120903024640/(1024*2048)"|bc

Ajouter 1 pour les rompus et des métadonnées).

Placer la valeur dans le paramètre vm.nr_hugepages. L'établir en invoquant "sysctl".

Tenter de démarrer PG. Si cela échoue encore augmenter progressivement (au pis par dichotomie) cette valeur.