Je me rappelle, il y a quelques années, je recevais environ 600 spams par jour. Et puis soudain…plus rien pendant 1 jour, 2 jours, 3 jours… Là, je me dis « c’est pas normal ! je devrais bien recevoir quelques messages tout de même ! ».
Une investigation rapide dans les logs du serveur de messagerie montrent que l’antivirus (clamd) consommant de plus en plus de mémoire a déclenché la colère de l’OOM-Killer et a provoqué l’arrêt de « postfix » !
La même mésaventure est arrivée à un de mes clients, il y a quelques jours : « Dites : vous pouvez jeter un coup d’oeil à nos batchs (crontabs) car ils ne sont pas déclenchés ?« . La syntaxe semble pourtant bonne, les jobs, lancés manuellement, fonctionnent. Oui, mais voilà, le démon crond n’existe pas, pourtant il est bien lancé au démarrage… Que s’est-il passé ? La faute à l’OOM-Killer encore une fois !
Petit rappel de la gestion de la mémoire par le noyau Linux…
Un noyau Linux peut allouer plus de mémoire qu’il n’en possède vraiment (RAM + swap) :
par exemple, lors d’un fork, il y a copie virtuelle des pages de données. Tant que les processus ne les modifient pas, elles ne sont pas dupliquées (copy on write). On peut aussi expliquer le choix du noyau Linux par l’argument suivant « je peux accepter d’allouer de la mémoire pour le processus P car je sais qu’il ne va pas l’utiliser tout de suite. Et quand il voudra l’utiliser, avec de la chance, un autre processus en aura libérée« . C’est ce qu’on nomme un algorithme « optimiste » !
Mais même en étant optimiste, il arrive que la mémoire soit saturée : le noyau doit bien tenir ses promesses !
Un algorithme appelé OOM-Killer est alors invoqué pour tuer des processus (presque pris au hasard !) et ainsi récupérer de la mémoire.
Dans les cas cités plus haut, ce choix du « processus à dézinguer » est tombé sur smtpd (postfix) et crond… Oups ! Et heureusement que ce n’est pas tombé sur sshd !