Une consommation élevée de la mémoire slab_unreclaimable sur une instance ECS Linux peut indiquer une fuite de mémoire dans le cache slab du noyau. Ce guide vous aide à identifier la cause racine et à résoudre le problème.
Symptômes
Exécutez la commande cat /proc/meminfo | grep "SUnreclaim" sur une instance Linux. Si la valeur SUnreclaim est importante (par exemple, SUnreclaim: 6069340 kB), l'instance présente une utilisation élevée de la mémoire slab_unreclaimable. Si la mémoire slab_unreclaimable dépasse 10 % de la mémoire totale, une fuite de mémoire slab est probable.
Cause
L'allocateur slab du noyau met en cache des objets mémoire de même taille afin de réduire la fragmentation. La partie slab_unreclaimable contient de la mémoire que le noyau ne peut pas libérer, car elle renferme des objets actifs tels que les caches dentry et inode. Si ces caches augmentent de manière excessive, une utilisation élevée de la mémoire slab_unreclaimable peut déclencher le tueur OOM (OOM Killer).
Solution
-
Connectez-vous à l'instance Linux.
Pour plus d'informations, consultez la rubrique Méthodes de connexion à distance aux instances ECS.
-
Identifiez le slab non récupérable présentant le plus grand nombre d'
objectsou la consommation mémoire la plus élevée :-
Recherchez le slab contenant le plus grand nombre d'
objectsou affichant la consommation mémoire la plus élevée.slabtop -s -aNotez le nom du slab (colonne
NAME) associé à la valeurOBJ/SLABla plus élevée. -
Vérifiez si la mémoire du slab est non récupérable.
Remplacez
<slab NAME>par le nom du slab ayant la valeurOBJ/SLABla plus élevée, identifié à l'étape précédente.cat /sys/kernel/slab/<slab NAME>/reclaim_accountPar exemple, vérifiez si
kmalloc-192est récupérable :cat /sys/kernel/slab/kmalloc-192/reclaim_accountUne sortie égale à 0 signifie que la mémoire n'est pas récupérable ; une sortie égale à 1 signifie qu'elle est récupérable.
-
-
Identifiez la cause racine de la fuite de mémoire slab.
Utilisez l'outil crash pour une analyse statique ou l'outil perf pour une analyse dynamique. Les exemples suivants utilisent le slab
kmalloc-192.Méthode 1 : Utiliser crash pour effectuer une analyse statique
-
Installez l'outil crash.
sudo yum install crash -y -
Installez l'outil kernel-debuginfo.
-
Alibaba Cloud Linux 3
sudo yum install -y kernel-debuginfo-<kernel version> --enablerepo=alinux3-plus-debugRemarqueRemplacez
kernel versionpar votre version réelle du noyau. Exécutezuname -rpour la vérifier. -
Alibaba Cloud Linux 2
sudo yum install kernel-debuginfo -y
-
-
Démarrez l'outil crash.
sudo crash -
Affichez les statistiques de mémoire pour
kmalloc-192dans crash :kmem -S kmalloc-192Pour limiter la sortie, affichez uniquement les dernières lignes. Par exemple, pour afficher les 10 dernières lignes :
kmem -S kmalloc-192 | tail -n 10Exemple de sortie de commande :
SLAB MEMORY NODE TOTAL ALLOCATED FREE ffffea004c94e780 ffff88132539e000 0 42 29 13 ffffea004cbef900 ffff88132fbe4000 0 42 40 2 ffffea000a0e6280 ffff88028398a000 0 42 40 2 ffffea004bfa8000 ffff8812fea00000 0 42 41 1 ffffea006842b380 ffff881a10ace000 0 42 41 1 ffffea0009e7dc80 ffff880279f72000 0 42 34 8 ffffea004e67ae80 ffff881399eba000 0 42 40 2 ffffea00b18d6f80 ffff882c635be000 0 42 42 0La sortie indique que
ffff88028398a000dispose de peu de mémoireFREEet d'une quantité élevée de mémoireALLOCATED. -
Affichez les données mémoire pour
ffff88028398a000:rd ffff88028398a000 512 -SSi la sortie est volumineuse, affichez-la page par page.
Si la fonction
put_cred_rcuapparaît plusieurs fois dans la sortie, recherchezput_cred_rcudans le code source du noyau Linux :void __put_cred(struct cred *cred) { call_rcu(&cred->rcu, put_cred_rcu); }put_cred_rculibère de manière asynchrone la structurecred. La présence répétée deput_cred_rcuà la fin de la structurecredindique une fuite de mémoire slab dans le noyau.
Méthode 2 : Utiliser perf pour effectuer une analyse dynamique
-
Installez l'outil perf.
sudo yum install perf -y -
Utilisez perf pour capturer la mémoire non libérée dans
kmalloc-192pendant 200 secondes :sudo perf record -a -e kmem:kmalloc --filter 'bytes_alloc == 192' -e kmem:kfree --filter ' ptr != 0' sleep 200 -
Enregistrez les données capturées dans un fichier.
Dans cet exemple, le fichier est nommé testperf.txt :
sudo perf script > testperf.txt -
Consultez le fichier testperf.txt :
cat testperf.txtIdentifiez les slabs ne disposant d'aucune mémoire
free, puis tracez la fonction responsable dans le code source du noyau.
-
-
Après avoir identifié le chemin d'appel de fonction ou la structure de données du noyau à l'origine de la fuite, collaborez avec les développeurs du noyau ou le personnel professionnel d'exploitation et de maintenance pour cibler la source et résoudre le problème.
Solutions possibles :
Mettez à niveau le noyau ou appliquez un correctif.
Ajustez les paramètres du noyau.
Redémarrez les services ou modules concernés.
Optimisez les applications ou les pilotes.
Redémarrez le système.
Références
Les fuites de mémoire slab réduisent la mémoire disponible, provoquent une fragmentation et peuvent déclencher le tueur OOM ou entraîner une dégradation des performances.