Empêcher les dépassements de mémoire sur un serveur Linux

20 avr

linux oom killer tux memoire

Par défaut Linux possède un mécanisme complexe nommé OOM-Killer (pour Out-Of-Memory Killer), ce dernier est incorporé au noyau Linux et permettra en cas de dépassement de mémoire de tuer des processus inutiles afin d’éviter un plantage complet du serveur.

OOM-Killer va donc être appelé lorsque le RAM et le SWAP sont entièrement utilisés et que le système n’a plus assez de mémoire à allouer aux processus. Ensuite OOM-Killer déterminera quel processus tuer suivant des heuristiques et ne terminera donc pas des processus système vitaux.

Les appels à OOM-Killer sont enregistrés dans les journaux systèmes (/var/log/messages) :

httpd invoked oom-killer: gfp_mask=[...], order=[...], oomkilladj=[...]

[suivis de quelques ligne de debug "Call Tace"]

Pour trouver tous les processus tués par OOM-Killer nous pourrons utiliser la commande suivante :

grep oom-killer /var/log/messages

Ici nous voyons qu’OOM-Killer a terminé le processus httpd (soit Apache). Dans certains cas, par exemple lors de l’utilisation d’un moteur de base de données contenant beaucoup d’enregistrements, ou si OOM-Killer à tendance à terminer les processus SSH, base de données, serveur web (ou autre), il sera utile de modifier le comportement de Linux avec la mémoire disponible.

Pour cela nous allons modifier le paramètre noyau overcommit_memory, ce paramètre peut prendre trois valeurs différentes :

  • 0 : Il s’agit du comportement par défaut, les réservations de mémoire seront acceptées ou refusées selon un heuristique
  • 1 : Toujours accepter
  • 2 : Accepter les demandes, si elle ne dépasse pas la quantité de ressource déterminée dans le paramètre overcommit_ratio

Le paramètre overcommit_ratio (par défaut 50) détermine le pourcentage de mémoire physique que l’on autorise à allouer en plus du swap. Pour connaitre la quantité de mémoire que l’on autorise à allouer, le calcul est le suivant :  SWAP + ((RAM*overcommit_ratio)/100)

Pour éviter les dépassements de mémoire nous allons donc modifier les deux paramètres noyaux en mettant overcommit_memory à 2 et overcommit_ratio à 95 (Certains préconisent des valeurs plus basses telles que 75 ou 85, voir plus hautes). Les manipulations sont à effectuer en tant que root.

Pour modifier de façon temporaire (annulée au prochain redémarrage) :

echo 2 > /proc/sys/vm/overcommit_memory
echo 95 > /proc/sys/vm/overcommit_ratio

Pour une modification définitive, il faut éditer le fichier /etc/sysctl.conf

vi /etc/sysctl.conf

Et ajouter/modifier les lignes suivantes :

vm.overcommit_memory = 2
vm.overcommit_ratio = 95

Photo et Référence

2 Réponses pour “Empêcher les dépassements de mémoire sur un serveur Linux”

  1. Vilsafur 16 novembre 2015 à 9 h 44 min #

    Bonjour,

    Merci pour ce post qui m’a bien servit aujourd’hui.

    Juste un petit point cependant, il semblerait qu’une erreur de frappe c’est inséré ;-)

    Vers la fin, c’est « vm.overcommit_ratio » au lieu de « vm.overcommit ratio » (« _ » au lieu de  » « ).

  2. analyse adresse ip 11 novembre 2016 à 14 h 40 min #

    Bonjour, j’aimerai poser une question qui sera peut-être hors sujet mais bon comme je ne suis pas un administrateur réseau je me demande ce qu’est une analyse adresse ip? est-ce que ce processus consiste à évaluer la redirection ou les sous domaines dans le cadre du dns? Merci pour vos réponses.