PostgreSQL 15 et OOM Killer malgré l'usage de HugePages

Posté par bodin-hugues le 12/05/2026
RÉSOLU

bodin-hugues

Membre depuis le 20/02/2025

Salut à tous. Je commence à saturer sur un problème d'OOM Killer qui strike nos instances PostgreSQL 15 en prod. On a des serveurs avec 512GB de RAM, et on a réservé 256GB en HugePages fixes.

Le `shared_buffers` est bien calé sur 256GB également. Pourtant, dès qu'on monte à 4000 connexions actives, le kernel décide de kill le process postmaster alors qu'il reste théoriquement de la RAM libre hors HugePages.

J'ai vérifié `vm.overcommit_memory` et il est à 2. Quelqu'un a une idée ?

Commentaires

lleclercq

Membre depuis le 11/03/2025

Salut. C'est classique avec l'overcommit à 2. Si tu as 512GB de RAM et que tu en bloques déjà 256GB pour les HugePages, ton calcul d'overcommit devient très risqué.

Tu peux nous donner le résultat de `cat /proc/meminfo` et ton `vm.overcommit_ratio` ?

ines26

Membre depuis le 28/12/2024

Il faut aussi regarder du côté de la segmentation. Si tes 4000 connexions consomment chacune un peu de RAM pour le `work_mem`, tu satures peut-être la zone hors HugePages.

Poste aussi ton `postgresql.conf` pour qu'on voit les paramètres de mémoire de travail.

bodin-hugues

Membre depuis le 20/02/2025

Voici le retour de meminfo :

MemTotal: 528394240 kB
MemFree: 21456784 kB
HugePages_Total: 131072
HugePages_Free: 124

Et pour le sysctl :

vm.overcommit_memory = 2
vm.overcommit_ratio = 50

Mon `work_mem` est à 64MB.

lleclercq

Membre depuis le 11/03/2025

Ton ratio est trop bas. Avec `vm.overcommit_memory` à 2, le kernel limite l'allocation à (Swap + RAM * ratio / 100).

Mais attention, le kernel retire la taille des HugePages de ce calcul sur les versions récentes. Tu te retrouves avec une limite virtuelle minuscule pour tes 4000 process.

ines26

Membre depuis le 28/12/2024

Exactement. Fais le calcul : 512GB * 0.5 = 256GB. Si tes HugePages occupent déjà 256GB, ta CommitLimit est probablement déjà atteinte avant même de lancer un query.

Regarde la ligne CommitLimit dans `/proc/meminfo`.

bodin-hugues

Membre depuis le 20/02/2025

Effectivement, je viens de voir ça :

CommitLimit: 264197120 kB
Committed_AS: 261845120 kB

On est à la limite de la rupture. Mais pourquoi ça ne swap pas ? On a 32GB de swap pourtant.

lleclercq

Membre depuis le 11/03/2025

Le mode 2 de overcommit empêche justement l'allocation si elle dépasse la limite, il ne cherche même pas à swapper, il refuse le malloc ou déclenche l'OOM si la pression est trop forte sur les structures kernel.

Essaie de monter `vm.overcommit_ratio` à 80 ou 90 pour voir.

ines26

Membre depuis le 28/12/2024

Avant de toucher au ratio, vérifie aussi les Transparent HugePages (THP). Si c'est à always, ça peut causer une fragmentation de la mémoire restante.

cat /sys/kernel/mm/transparent_hugepage/enabled

bodin-hugues

Membre depuis le 20/02/2025

Le sysfs me dit `[always] madvise never`. C'est donc activé. Tu penses que ça interfère avec mes HugePages statiques ?

lleclercq

Membre depuis le 11/03/2025

Carrément. Le kernel essaie de compacter la mémoire restante pour faire des pages de 2MB en arrière-plan, ça crée des stalls et ça bouffe du CPU. Sur une DB, on met toujours ça à never ou madvise.

Fais un `echo never > /sys/kernel/mm/transparent_hugepage/enabled` pour tester immédiatement.

ines26

Membre depuis le 28/12/2024

Et n'oublie pas de vérifier `vm.admin_reserve_kbytes`. Si c'est trop bas, le root ne pourra même pas se logguer pour débugger quand l'OOM va trigger.

bodin-hugues

Membre depuis le 20/02/2025

J'ai passé le ratio à 85 et désactivé les THP. Le `Committed_AS` semble s'être stabilisé et j'ai plus de marge sur la CommitLimit.

Par contre, j'ai remarqué des pics de `Dirty` memory dans meminfo juste avant les ralentissements. C'est lié au checkpoint ?

lleclercq

Membre depuis le 11/03/2025

Oui, PostgreSQL flush ses buffers. Si ton storage ne suit pas, la Dirty memory monte et le kernel bloque les écritures (dirty_thresh).

Vérifie `vm.dirty_ratio` et `vm.dirty_background_ratio`. On les baisse souvent sur des grosses machines pour lisser les I/O.

ines26

Membre depuis le 28/12/2024

Si tu as du NVMe, mets `vm.dirty_background_ratio` à 5 et `vm.dirty_ratio` à 10. Ça forcera le kernel à écrire plus souvent par petits paquets.

bodin-hugues

Membre depuis le 20/02/2025

Ok, j'ai appliqué les réglages sur l'overcommit et les dirty ratios. On vient de passer le pic de trafic de 14h sans aucun kill et la latence est bien plus stable.

C'était bien ce calcul d'overcommit qui ignorait la place prise par les HugePages qui nous tuait. Merci pour le coup de main !

Laisser une réponse

Vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire