
Lorsque le serveur de base de donnĂ©es Linux se ferme de maniĂšre inattendue, il est important de comprendre la cause. Il peut y avoir plusieurs raisons. Par exemple, SIGSEGV â une dĂ©faillance due Ă un bug dans le serveur backend. Mais c'est rare. Le plus souvent, c'est simplement l'espace disque ou la mĂ©moire qui s'Ă©puise. Si l'espace disque est plein, la seule solution est de libĂ©rer de l'espace et de redĂ©marrer la base de donnĂ©es.
Out-Of-Memory Killer
Lorsque la mĂ©moire de de serveurs ou d'un processus est Ă©puisĂ©e, Linux propose deux solutions : faire tomber tout le systĂšme ou terminer le processus (application) qui consomme la mĂ©moire. Il est prĂ©fĂ©rable de terminer le processus et de sauver l'OS d'un arrĂȘt brutal. En rĂ©sumĂ©, l'Out-Of-Memory Killer est un processus qui termine une application pour prĂ©server le noyau d'un Ă©chec. Il sacrifie une application pour maintenir le fonctionnement de l'OS. Discutons d'abord du fonctionnement de l'OOM et de son contrĂŽle, puis voyons comment l'OOM Killer dĂ©cide quelle application terminer.
L'une des principales tùches de Linux est d'allouer de la mémoire aux processus lorsqu'ils en font la demande. En général, un processus ou une application demande de la mémoire à l'OS, mais l'utilise rarement entiÚrement. Si l'OS attribue de la mémoire à tous ceux qui en font la demande sans intention de l'utiliser, la mémoire sera rapidement épuisée, et le systÚme échouera. Pour éviter cela, l'OS réserve de la mémoire pour le processus sans réellement la distribuer. La mémoire n'est allouée que lorsque le processus a besoin de l'utiliser. Il arrive que l'OS n'ait pas de mémoire libre, mais qu'il réserve de la mémoire pour un processus, et lorsque le processus en a besoin, l'OS l'alloue s'il le peut. Le problÚme est que parfois l'OS réserve de la mémoire, mais à ce moment-là , il n'y a pas de mémoire libre, entraßnant un échec du systÚme. L'OOM joue un rÎle crucial dans ce scénario et termine les processus pour protéger le noyau de la panique. Lorsque le processus PostgreSQL est terminé de force, un message apparaßt dans le journal :
Out of Memory: Killed process 12345 (postgres).Si le systĂšme manque de mĂ©moire et qu'il est impossible de la libĂ©rer, la fonction est appelĂ©e out_of_memory. Ă ce stade, il ne reste qu'une chose Ă faire : terminer un ou plusieurs processus. L'OOM-killer doit-il terminer le processus immĂ©diatement ou peut-il attendre ? Ăvidemment, lorsque l'out_of_memory est appelĂ©, cela est liĂ© Ă l'attente d'une opĂ©ration d'entrĂ©e-sortie ou Ă l'Ă©criture d'une page sur le disque. Par consĂ©quent, l'OOM-killer doit d'abord effectuer des vĂ©rifications et, sur cette base, dĂ©cider quel processus doit ĂȘtre terminĂ©. Si tous les contrĂŽles ci-dessous sont positifs, OOM terminera le processus.
Sélection du processus
Lorsque la mémoire est épuisée, la fonction est appelée out_of_memory(). Elle contient une fonction select_bad_process(), qui reçoit une évaluation de la fonction badness(). Le processus le 'pire' sera sélectionné. La fonction badness() choisit un processus selon certaines rÚgles.
- Le noyau a besoin d'un minimum de mĂ©moire pour lui-mĂȘme.
- Il faut libérer beaucoup de mémoire.
- Il n'est pas nécessaire de terminer les processus qui utilisent peu de mémoire.
- Il faut terminer un minimum de processus.
- Des algorithmes complexes augmentent les chances de terminaison pour les processus que l'utilisateur souhaite lui-mĂȘme terminer.
AprĂšs avoir effectuĂ© toutes ces vĂ©rifications, OOM examine l'Ă©valuation (oom_score). OOM attribue oom_score Ă chaque processus, puis multiplie cette valeur par la quantitĂ© de mĂ©moire. Les processus avec des valeurs Ă©levĂ©es ont plus de chances de devenir des victimes de l'OOM Killer. Les processus associĂ©s Ă un utilisateur privilĂ©giĂ© ont une Ă©valuation plus basse et moins de chances d'ĂȘtre terminĂ©s de force.
postgres=# SELECT pg_backend_pid();
pg_backend_pidÂ
----------------
    3813
(1 row)L'identifiant du processus Postgres est 3813, donc dans un autre shell, vous pouvez obtenir l'évaluation en utilisant ce paramÚtre du noyau oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Si vous ne souhaitez absolument pas que l'OOM-Killer termine le processus, il existe un autre paramÚtre du noyau : oom_score_adj. Ajoutez une grande valeur négative pour réduire les chances de terminaison de votre processus important.
sudo echo -100 > /proc/3813/oom_score_adjPour définir une valeur oom_score_adj, définissez OOMScoreAdjust dans le bloc du service :
[Service]
OOMScoreAdjust=-1000Ou utilisez oomprotect dans la commande rcctl.
rcctl set servicename oomprotect -1000Terminaison forcée du processus
Lorsque un ou plusieurs processus ont déjà été sélectionnés, l'OOM-Killer appelle la fonction oom_kill_task(). Cette fonction envoie un signal de terminaison au processus. En cas de manque de mémoire, oom_kill() appelle cette fonction pour envoyer le signal SIGKILL au processus. Un message est enregistré dans le journal du noyau.
Mémoire insuffisante : processus tué [pid] [nom].Comment contrÎler l'OOM-Killer
Sous Linux, il est possible d'activer et de désactiver l'OOM-Killer (bien que cela ne soit pas recommandé). Pour l'activer ou le désactiver, utilisez le paramÚtre vm.oom-kill. Pour activer l'OOM-Killer en mode d'exécution, exécutez la commande sysctl.
sudo -s sysctl -w vm.oom-kill = 1Pour dĂ©sactiver l'OOM-Killer, spĂ©cifiez la valeur 0 dans cette mĂȘme commande :
sudo -s sysctl -w vm.oom-kill = 0Le résultat de cette commande ne sera pas permanent, il durera seulement jusqu'au prochain redémarrage. Si vous avez besoin de plus de permanence, ajoutez cette ligne au fichier /etc/sysctl.conf:
echo vm.oom-kill = 1 >> /etc/sysctl.confUne autre façon d'activer et de dĂ©sactiver est d'Ă©crire la variable panic_on_oom. La valeur peut toujours ĂȘtre vĂ©rifiĂ©e dans /proc.
$ cat /proc/sys/vm/panic_on_oom
0Si vous définissez la valeur 0, lorsqu'il n'y a plus de mémoire, il n'y aura pas de panique du noyau.
$ echo 0 > /proc/sys/vm/panic_on_oomSi vous définissez la valeur 1, lorsqu'il n'y a plus de mémoire, une panique du noyau se produira.
echo 1 > /proc/sys/vm/panic_on_oomL'OOM-Killer peut ĂȘtre activĂ© et dĂ©sactivĂ©. Nous avons dĂ©jĂ mentionnĂ© que Linux peut rĂ©server plus de mĂ©moire pour les processus qu'il n'en dispose, sans l'allouer rĂ©ellement, et ce comportement est contrĂŽlĂ© par un paramĂštre du noyau Linux. Cela est gĂ©rĂ© par la variable vm.overcommit_memory.
Pour cela, vous pouvez spécifier les valeurs suivantes :
0: le noyau dĂ©cide lui-mĂȘme s'il faut rĂ©server trop de mĂ©moire. C'est la valeur par dĂ©faut dans la plupart des versions de Linux.
1: le noyau réservera toujours de la mémoire supplémentaire. Cela est risqué, car la mémoire peut s'épuiser, car il est probable qu'un jour les processus en demanderont beaucoup.
2: le noyau ne réserve pas plus de mémoire que ce qui est spécifié dans le paramÚtre overcommit_ratio.
Dans ce paramÚtre, vous spécifiez le pourcentage de mémoire pour lequel un sur-réservement est acceptable. S'il n'y a pas de place pour cela, la mémoire ne sera pas allouée et la demande sera refusée. C'est l'option la plus sécurisée, recommandée pour PostgreSQL. Un autre élément qui influence l'OOM-Killer est la possibilité de swap, qui est contrÎlée par la variable cat /proc/sys/vm/swappiness. Ces valeurs indiquent au noyau comment gérer la pagination des pages. Plus la valeur est élevée, moins il est probable que l'OOM termine le processus, mais en raison des opérations d'E/S, cela nuit à la base de données. Inversement, plus la valeur est basse, plus il y a de chances que l'OOM-Killer intervienne, mais la performance de la base de données est également meilleure. La valeur par défaut est de 60, mais si l'intégralité de la base de données tient en mémoire, il est préférable de définir la valeur à 1.
Résultats
Ne laissez pas le mot « tueur » dans OOM-Killer vous effrayer. Dans ce cas, le tueur sera le sauveur de votre systĂšme. Il « tue » les processus les plus indĂ©sirables et prĂ©serve le systĂšme d'un arrĂȘt brutal. Pour Ă©viter d'avoir Ă utiliser l'OOM-Killer pour terminer PostgreSQL, dĂ©finissez vm.overcommit_memory la valeur Ă 2. Cela ne garantit pas que l'OOM-Killer n'aura pas Ă intervenir, mais cela rĂ©duit la probabilitĂ© de termination forcĂ©e du processus PostgreSQL.
Source : habr.com
