Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les opérations d’entrée et de sortie de disque sont coûteuses et la plupart des systèmes d’exploitation implémentent des stratégies de mise en cache pour lire et écrire des données dans le système de fichiers. Le noyau Linux utilise généralement des stratégies telles que le cache de pages pour améliorer les performances globales. L’objectif principal du cache de page est de stocker les données lues à partir du système de fichiers dans le cache, le rendant disponible en mémoire pour les futures opérations de lecture.
Cet article vous aide à identifier et à éviter une consommation élevée de mémoire dans les applications nécessitant beaucoup de disques en raison des comportements de noyau Linux sur les pods Kubernetes.
Conditions préalables
Outil permettant de se connecter au cluster Kubernetes, tel que l’outil kubectl . Pour effectuer l’installation kubectl à l’aide d’Azure CLI, exécutez la commande az aks install-cli .
Symptômes
Lorsqu’une application nécessitant beaucoup de disques s’exécutant sur un pod effectue des opérations fréquentes de système de fichiers, une consommation élevée de mémoire peut se produire.
Le tableau suivant présente les symptômes courants de la consommation élevée de mémoire :
| Symptôme | Descriptif |
|---|---|
| La métrique du jeu de travail est trop élevée. | Ce problème se produit lorsqu’il existe une différence significative entre la métrique de jeu de travail signalée par l’API Métriques Kubernetes et la mémoire réelle consommée par une application. |
| Fin de tâche pour cause de mémoire insuffisante (OOM). | Ce problème indique que les problèmes de mémoire existent sur votre pod. |
| Augmentation de l’utilisation de la mémoire après l’activité de disque lourd. | Après les opérations telles que les sauvegardes, les lectures/écritures de fichiers volumineux ou les importations de données, la consommation de mémoire augmente. |
| L’utilisation de la mémoire augmente indéfiniment. | La consommation de mémoire du pod augmente au fil du temps sans réduire, comme une fuite de mémoire, même si l’application elle-même ne fuite pas de mémoire. |
Liste de contrôle pour la résolution des problèmes
Étape 1 : Inspecter l'ensemble de travail du pod
Pour inspecter l’ensemble de pods de travail signalé par l’API Kubernetes Metrics, exécutez la commande kubectl top pods suivante :
$ kubectl top pods -A | grep -i "<DEPLOYMENT_NAME>"
NAME CPU(cores) MEMORY(bytes)
my-deployment-fc94b7f98-m9z2l 1m 344Mi
Pour obtenir des instructions détaillées sur la façon d’identifier le pod qui consomme une mémoire excessive, consultez Résoudre les problèmes de saturation de la mémoire dans les clusters AKS.
Étape 2 : Inspecter les statistiques de mémoire du pod
Pour inspecter les statistiques de mémoire des cgroups sur le pod qui consomme une mémoire excessive, procédez comme suit :
Remarque
Les groupes Cgroup permettent d’appliquer la gestion des ressources pour les pods et les conteneurs, notamment les demandes de processeur/mémoire et les limites des charges de travail conteneurisées.
Connectez-vous au pod :
$ kubectl exec <POD_NAME> -it -- bashAccédez au répertoire des statistiques et répertoriez les fichiers liés à la
cgroupmémoire :$ ls /sys/fs/cgroup | grep -e memory.stat -e memory.current memory.current memory.stat-
memory.current: mémoire totale actuellement utilisée par lecgroupet ses descendants. -
memory.stat: Cela décompose l'empreinte mémoire du cgroup en différents types de mémoire, avec des détails propres à chaque type, ainsi que d'autres informations sur l'état et les événements passés du système de gestion de la mémoire.
Toutes les valeurs répertoriées dans ces fichiers sont en octets.
-
Obtenez une vue d’ensemble de la façon dont la consommation de mémoire est distribuée sur le pod :
$ cat /sys/fs/cgroup/memory.current 10645012480 $ cat /sys/fs/cgroup/memory.stat anon 5197824 inactive_anon 5152768 active_anon 8192 ... file 10256240640 active_file 32768 inactive_file 10256207872 ... slab 354682456 slab_reclaimable 354554400 slab_unreclaimable 128056 ...cAdvisorutilisememory.currentetinactive_filepour calculer la métrique du jeu de travail. Vous pouvez répliquer le calcul à l’aide de la formule suivante :working_set = (memory.current - inactive_file) / 1048576 = (10645012480 - 10256207872) / 1048576 = 370 MB
Étape 3 : Déterminer la consommation de mémoire du noyau et de l’application
Le tableau suivant décrit certains segments de mémoire :
| Segment | Descriptif |
|---|---|
anon |
Quantité de mémoire utilisée dans les mappages anonymes. La plupart des langages utilisent ce segment pour allouer de la mémoire. |
file |
Quantité de mémoire utilisée pour mettre en cache les données du système de fichiers, notamment tmpfs et la mémoire partagée. |
slab |
Quantité de mémoire utilisée pour stocker des structures de données dans le noyau Linux. |
Combiné à l’étape 2, anon représente 5 197 824 octets, ce qui n’est pas proche du montant total signalé par la métrique du jeu de travail. Le slab segment de mémoire utilisé par le noyau Linux représente 354 682 456 octets, ce qui constitue presque toute la mémoire signalée par la métrique de l'ensemble de travail sur le pod.
Étape 4 : Supprimer le cache du noyau sur un pod de débogueur
Remarque
Cette étape peut entraîner des problèmes de disponibilité et de performances. Évitez de l’exécuter dans un environnement de production.
Obtenez le nœud exécutant le pod :
$ kubectl get pod -A -o wide | grep "<POD_NAME>" NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-deployment-fc94b7f98-m9z2l 1/1 Running 0 37m 10.244.1.17 aks-agentpool-26052128-vmss000004 <none> <none>Créez un pod de débogueur à l’aide de la commande kubectl debug et créez une session
kubectl:$ kubectl debug node/<NODE_NAME> -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0 $ chroot /hostSupprimez le cache du noyau :
echo 1 > /proc/sys/vm/drop_cachesVérifiez si la commande de l’étape précédente provoque un effet en répétant l’étape 1 et l’étape 2 :
$ kubectl top pods -A | grep -i "<DEPLOYMENT_NAME>" NAME CPU(cores) MEMORY(bytes) my-deployment-fc94b7f98-m9z2l 1m 4Mi $ kubectl exec <POD_NAME> -it -- cat /sys/fs/cgroup/memory.stat anon 4632576 file 1781760 ... slab_reclaimable 219312 slab_unreclaimable 173456 slab 392768
Si vous observez une diminution significative du jeu de travail et du slab segment de mémoire, cela indique un problème avec le noyau Linux qui utilise une grande quantité de mémoire sur le pod.
Solution de contournement : Configurer les limites et demandes de mémoire appropriées
La seule solution efficace pour une consommation élevée de mémoire sur les pods Kubernetes consiste à définir des limites et des requêtes de ressources réalistes. Par exemple:
resources:
requests:
memory: 30Mi
limits:
memory: 60Mi
En configurant les limites et demandes de mémoire appropriées dans Kubernetes ou la spécification, vous pouvez vous assurer que Kubernetes gère l’allocation de mémoire plus efficacement, ce qui atténue l’impact de la mise en cache excessive au niveau du noyau sur l’utilisation de la mémoire des pods.
Avertissement
Les limites de mémoire des pods mal configurées peuvent entraîner des problèmes tels que des erreurs OOMKilled.
références
- En savoir plus sur les meilleures pratiques d’Azure Kubernetes Service (AKS)
- Superviser les performances de votre cluster Kubernetes avec Container Insights
Exclusion de responsabilité des informations tierces
Les produits tiers abordés par cet article sont fabriqués par des entreprises indépendantes de Microsoft. Microsoft ne donne aucune garantie, implicite ou autre, concernant la performance ou la fiabilité de ces produits.
Exclusion de responsabilité pour contact avec des tiers
Microsoft fournit des informations de contacts externes afin de vous aider à obtenir un support technique sur ce sujet. Ces informations de contact peuvent changer sans préavis. Microsoft ne garantit pas l’exactitude des informations concernant les sociétés externes.
Contactez-nous pour obtenir de l’aide
Si vous avez des questions, vous pouvez demander le support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.