Tous les produits
Search
Centre de documentation

Alibaba Cloud Linux:Résoudre une utilisation élevée de la mémoire slab_unreclaimable

Dernière mise à jour :Sep 21, 2026

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

  1. Connectez-vous à l'instance Linux.

    Pour plus d'informations, consultez la rubrique Méthodes de connexion à distance aux instances ECS.

  2. Identifiez le slab non récupérable présentant le plus grand nombre d'objects ou la consommation mémoire la plus élevée :

    1. Recherchez le slab contenant le plus grand nombre d'objects ou affichant la consommation mémoire la plus élevée.

      slabtop -s -a

      Notez le nom du slab (colonne NAME) associé à la valeur OBJ/SLAB la plus élevée.

    2. Vérifiez si la mémoire du slab est non récupérable.

      Remplacez <slab NAME> par le nom du slab ayant la valeur OBJ/SLAB la plus élevée, identifié à l'étape précédente.

      cat /sys/kernel/slab/<slab NAME>/reclaim_account

      Par exemple, vérifiez si kmalloc-192 est récupérable :

      cat /sys/kernel/slab/kmalloc-192/reclaim_account

      Une 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.

  3. 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

    1. Installez l'outil crash.

      sudo yum install crash -y
    2. Installez l'outil kernel-debuginfo.

      • Alibaba Cloud Linux 3

        sudo yum install -y kernel-debuginfo-<kernel version> --enablerepo=alinux3-plus-debug
        Remarque

        Remplacez kernel version par votre version réelle du noyau. Exécutez uname -r pour la vérifier.

      • Alibaba Cloud Linux 2

        sudo yum install kernel-debuginfo -y
    3. Démarrez l'outil crash.

      sudo crash
    4. Affichez les statistiques de mémoire pour kmalloc-192 dans crash :

      kmem -S kmalloc-192

      Pour limiter la sortie, affichez uniquement les dernières lignes. Par exemple, pour afficher les 10 dernières lignes :

      kmem -S kmalloc-192 | tail -n 10

      Exemple 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     0

      La sortie indique que ffff88028398a000 dispose de peu de mémoire FREE et d'une quantité élevée de mémoire ALLOCATED.

    5. Affichez les données mémoire pour ffff88028398a000 :

      rd ffff88028398a000 512 -S

      Si la sortie est volumineuse, affichez-la page par page.

      Si la fonction put_cred_rcu apparaît plusieurs fois dans la sortie, recherchez put_cred_rcu dans le code source du noyau Linux :

      void __put_cred(struct cred *cred)
      {
          call_rcu(&cred->rcu, put_cred_rcu);
      }

      put_cred_rcu libère de manière asynchrone la structure cred. La présence répétée de put_cred_rcu à la fin de la structure cred indique une fuite de mémoire slab dans le noyau.

    Méthode 2 : Utiliser perf pour effectuer une analyse dynamique

    1. Installez l'outil perf.

      sudo yum install perf -y
    2. Utilisez perf pour capturer la mémoire non libérée dans kmalloc-192 pendant 200 secondes :

      sudo perf record -a -e kmem:kmalloc --filter 'bytes_alloc == 192' -e kmem:kfree --filter ' ptr != 0' sleep 200
    3. Enregistrez les données capturées dans un fichier.

      Dans cet exemple, le fichier est nommé testperf.txt :

      sudo perf script > testperf.txt
    4. Consultez le fichier testperf.txt :

      cat testperf.txt

      Identifiez les slabs ne disposant d'aucune mémoire free, puis tracez la fonction responsable dans le code source du noyau.

  4. 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.