Lorsque la récupération de mémoire ne parvient pas à résoudre un manque de mémoire sur un système Linux, le noyau fait appel à l'OOM Killer pour arrêter de force les processus. Cette rubrique présente les causes courantes des événements OOM Killer sur Alibaba Cloud Linux et explique comment les résoudre.
Description du problème
Le journal suivant montre que le processus test a déclenché l'OOM Killer :
565 [Sat Sep 11 12:24:42 2021] test invoked oom-killer: gfp_mask=0x62****(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), nodemask=(null), order=0, oom_score_adj=0
566 [Sat Sep 11 12:24:42 2021] test cpuset=/ mems_allowed=0
567 [Sat Sep 11 12:24:42 2021] CPU: 1 PID: 29748 Comm: test Kdump: loaded Not tainted 4.19.91-24.1.al7.x86_64 #1
568 [Sat Sep 11 12:24:42 2021] Hardware name: Alibaba Cloud Alibaba Cloud ECS, BIOS e62**** 04/01/2014
Causes possibles
Les événements OOM Killer résultent soit d'une insuffisance de mémoire globale, soit d'une insuffisance de mémoire au niveau du cgroup. Le tableau ci-dessous répertorie les scénarios courants :
|
Cause |
Exemple de scénario |
|
Mémoire cgroup insuffisante |
Dans ce journal, l'OOM Killer se déclenche pour le cgroup
Cause : le cgroup |
|
Mémoire du cgroup parent insuffisante |
Ici, le processus
Cause : le cgroup parent |
|
Mémoire globale insuffisante |
Dans ce journal,
Cause : la mémoire libre est passée en dessous du seuil minimum et la récupération de mémoire n'a pas pu libérer suffisamment de pages. |
|
Mémoire insuffisante sur un nœud de mémoire |
Indicateurs clés dans ce journal :
Cause : dans une architecture NUMA, |
|
Mémoire insuffisante du système buddy en raison de la fragmentation de la mémoire |
Indicateurs clés dans ce journal :
Cause : la fragmentation de la mémoire empêche le système buddy d'allouer un bloc contigu de la taille requise, même si la mémoire libre totale est suffisante. Remarque
Le système buddy est un allocateur de mémoire du noyau Linux qui gère des blocs contigus de tailles variées afin de réduire la fragmentation. |
Solutions
Résolvez le problème en fonction de sa cause.
Mémoire insuffisante dans un cgroup ou un cgroup parent
Arrêtez les processus inutiles pour libérer de la mémoire. Si votre charge de travail nécessite plus de mémoire, mettez à niveau l'instance.
-
Mettez à niveau l'instance.
-
Après la mise à niveau, ajustez manuellement la limite de mémoire du cgroup.
sudo bash -c 'echo <value> > /sys/fs/cgroup/memory/<cgroup_name>/memory.limit_in_bytes'Remplacez
<value>par la nouvelle limite de mémoire du cgroup en octets et<cgroup_name>par le nom de votre cgroup.
Mémoire globale insuffisante
Examinez les points suivants :
-
Vérifiez l'utilisation de la mémoire
slab_unreclaimable.cat /proc/meminfo | grep "SUnreclaim"La mémoire
slab_unreclaimablecorrespond à la mémoire que le système ne peut pas récupérer. Si elle dépasse 10 % de la mémoire totale, une fuite de mémoire slab est probable. Pour résoudre ce problème, consultez la rubrique Que faire si une instance présente un pourcentage élevé de mémoire slab_unreclaimable ?. Si le problème persiste, soumettez un ticket. -
Vérifiez l'utilisation de la mémoire par
systemd.cat /proc/1/status | grep "RssAnon"Le noyau ignore le processus 1 (
systemd) lors des arrêts OOM ; l'utilisation de la mémoire parsystemdne doit donc pas dépasser 200 Mo. Si l'utilisation est anormalement élevée, mettez à joursystemdvers une version plus récente. -
Examinez les performances des Transparent Huge Pages (THP).
Les THP peuvent provoquer un gonflement de la mémoire entraînant des événements OOM. Pour atténuer ce risque, ajustez les paramètres THP comme décrit dans la rubrique Comment utiliser les THP pour optimiser les performances dans Alibaba Cloud Linux ?
Mémoire insuffisante sur un nœud de mémoire
Reconfigurez cpuset.mems pour permettre au cgroup d'utiliser la mémoire de nœuds supplémentaires.
-
Identifiez les nœuds de mémoire de votre système.
cat /proc/buddyinfo -
Configurez le paramètre
cpuset.mems.sudo bash -c 'echo <value> > /sys/fs/cgroup/cpuset/<cgroup_name>/cpuset.mems'Remplacez
<value>par les numéros des nœuds de mémoire correspondants et<cgroup_name>par le nom de votre cgroup.Par exemple, si votre système comporte trois nœuds (nœud 0, nœud 1 et nœud 2) et que vous souhaitez que le cgroup utilise la mémoire des nœuds 0 et 2, définissez
<value>sur0,2.
Mémoire insuffisante du système buddy en raison de la fragmentation de la mémoire
Effectuez une compaction de la mémoire pendant les heures creuses :
sudo bash -c 'echo 1 > /proc/sys/vm/compact_memory'