Skip to content

Pourquoi mon système utilise-t-il plus de RAM après une heure d’utilisation ?

Solution:

La RAM inutilisée est de la RAM gaspillée. Le noyau Linux dispose de fonctionnalités avancées de gestion de la mémoire et essaie d’éviter d’alourdir le goulot d’étranglement de votre système, votre disque dur/SSD. Il essaie de mettre en cache les fichiers en mémoire.

Le système de gestion de la mémoire fonctionne de manière complexe, l’objectif est d’améliorer les performances.

Vous pouvez voir ce qu’il fait en inspectant /proc/meminfo.

cat /proc/meminfo

Vous pouvez récupérer cette mémoire mise en cache, en utilisant “drop_caches”. Cependant, notez que la documentation indique que “l’utilisation en dehors d’un environnement de test ou de débogage n’est pas recommandée”, simplement parce que “il peut coûter une quantité importante d’E/S et de processeur pour recréer les objets supprimés” lorsqu’ils sont à nouveau nécessaires :-).

Effacer PageCache uniquement :

# sync; echo 1 > /proc/sys/vm/drop_caches

Effacer les dentries et les inodes :

# sync; echo 2 > /proc/sys/vm/drop_caches

Effacer PageCache, dentries et inodes :

# sync; echo 3 > /proc/sys/vm/drop_caches

Noter que sync videra le tampon du système de fichiers pour s’assurer que toutes les données ont été écrites.

À partir de la documentation du noyau :

Cache de pages

La mémoire physique est volatile et le cas courant pour introduire des données dans la mémoire est de les lire à partir de fichiers. Chaque fois qu’un fichier est lu, les données sont placées dans le cache de la page pour éviter un accès disque coûteux lors des lectures suivantes. De même, lorsque l’on écrit dans un fichier, les données sont placées dans le cache de la page et finissent par pénétrer dans le périphérique de stockage de sauvegarde. Les pages écrites sont marquées comme sales et lorsque Linux décide de les réutiliser à d’autres fins, il s’assure de synchroniser le contenu du fichier sur l’appareil avec les données mises à jour.

Récupérer

Tout au long de la durée de vie du système, une page physique peut être utilisée pour stocker différents types de données. Il peut s’agir de structures de données internes au noyau, de tampons DMA pour l’utilisation de pilotes de périphériques, de données lues à partir d’un système de fichiers, de mémoire allouée par les processus de l’espace utilisateur, etc.

Selon l’utilisation de la page, elle est traitée différemment par la gestion de la mémoire Linux. Les pages qui peuvent être libérées à tout moment, soit parce qu’elles mettent en cache les données disponibles ailleurs, par exemple sur un disque dur, soit parce qu’elles peuvent être échangées, encore une fois, sur le disque dur, sont dites récupérables. Les catégories les plus notables de pages récupérables sont le cache de pages et la mémoire anonyme.

Dans la plupart des cas, les pages contenant les données internes du noyau et utilisées comme tampons DMA ne peuvent pas être réutilisées et elles restent épinglées jusqu’à ce qu’elles soient libérées par leur utilisateur. Ces pages sont dites irrécupérables. Cependant, dans certaines circonstances, même les pages occupées par des structures de données du noyau peuvent être récupérées. Par exemple, les caches en mémoire des métadonnées du système de fichiers peuvent être relus à partir du périphérique de stockage et il est donc possible de les supprimer de la mémoire principale lorsque le système est sous pression mémoire.

Le processus de libération des pages de mémoire physique récupérables et de leur réutilisation s’appelle (surprise !) récupération. Linux peut récupérer des pages de manière asynchrone ou synchrone, selon l’état du système. Lorsque le système n’est pas chargé, la majeure partie de la mémoire est libre et les demandes d’allocation seront satisfaites immédiatement à partir de l’offre de pages libres. Au fur et à mesure que la charge augmente, le nombre de pages libres diminue et lorsqu’il atteint un certain seuil (high watermark), une demande d’allocation va réveiller le démon kswapd. Il analysera de manière asynchrone les pages mémoire et les libérera simplement si les données qu’elles contiennent sont disponibles ailleurs, ou expulsera vers le périphérique de stockage de sauvegarde (vous vous souvenez de ces pages sales ?). Au fur et à mesure que l’utilisation de la mémoire augmente et atteint un autre seuil – le filigrane min – une allocation déclenchera une récupération directe. Dans ce cas, l’allocation est bloquée jusqu’à ce que suffisamment de pages mémoire soient récupérées pour satisfaire la demande.

Fuites de mémoire

Maintenant, certains programmes peuvent avoir des “fuites de mémoire”, c’est-à-dire qu’ils “oublient” de libérer de la mémoire qu’ils n’utilisent plus. Vous pouvez le voir si vous laissez un programme en cours d’exécution pendant un certain temps, son utilisation de la mémoire augmente constamment, lorsque vous le fermez, la mémoire n’est jamais libérée. Maintenant, les programmeurs essaient d’éviter les fuites de mémoire, bien sûr, mais les programmes peuvent en avoir. La façon de récupérer cette mémoire est un redémarrage.

Vous avez consulté une liste de processus et leur utilisation de la mémoire. Mais il y avait un problème. Vous ne regardiez pas la liste complète.

gnome-system-monitor affiche uniquement “Mes processus” par défaut. Pour voir les processus appartenant à tous les utilisateurs du système, y compris le root utilisateur, cliquez sur l’icône de menu en haut à droite (trois points dans une ligne verticale). Modifiez la sélection de “Mes processus” à “Tous les processus”.


  1. RAM système utilisée par rapport à la RAM système disponible, sous forme de nombre unique
  2. Analyser /proc/meminfo
  3. Autres outils que vous pouvez utiliser – installez atop aujourd’hui 😎

1. RAM système utilisée par rapport à la RAM système disponible, sous forme de nombre unique

Je vois que ton code ruby ​​soustrait MemAvailable de MemTotal. C’est exactement le même calcul utilisé par gnome-system-monitor, lorsqu’il indique que le système utilise “1,5 Gio (41,4 %) sur 3,7 Gio”.

Vous avez raison d’utiliser soit gnome-system-monitor ou votre calcul manuel, au moins en première approximation. Les MemAvailable nombre comprend essentiellement tout le “cache” récupérable. C’est à dire MemAvailable inclut un type de “cache” qui est “disponible” pour être récupéré, dès qu’un programme demande plus de mémoire que vous n’en avez de libre.

Note latérale : Il existe un autre type ou sens de « cache », qui est ne pas récupérable. Quand vous regardez le Cache / numéro de “cache”, il est généralement signalé comme incluant Shmem / “partagé”. Les Shmem une partie est ne pas cache récupérable. La confusion se produit parce que Shmem a été intelligemment implémenté à l’aide du “cache de page” du noyau.

Une autre façon de vérifier rapidement “disponible” est free -h.

Les free La commande affiche également “partagé”, l’utilisation de l’échange, etc. La documentation de votre système doit répertorier les champs de sortie et les options disponibles, c’est-à-dire dans man free. Certains des autres champs peuvent être trompeurs :

  • Le champ “utilisé” dans le free La commande (actuellement) n’inclut pas “shared”. Cela peut être très déroutant. Ignorer le champ “utilisé”.
  • La valeur “cachée” affichée par free souffre du problème mentionné ci-dessus.
  • Si free n’affiche pas “disponible”, votre système est ancien. Consultez votre documentation ancienne.

2. Analyser /proc/meminfo

Merci pour la sortie complète de cat /proc/meminfo. Cela aide souvent à trouver des réponses spécifiques (ou n’importe quelle réponse). Si vous vouliez voir comment MemAvailable est calculé vous-même, vous pouvez lire la première section de ma réponse ici : La mémoire « mise en cache » est-elle de facto gratuite ?

AnonPages

Dans ton exemple meminfo, vous avez AnonPages: 924844 kB (0,9 Go). AnonPages est l’un des termes qui réduit MemAvailable.

Lorsque AnonPages augmente, cela devrait indiquer une augmentation du “RES”, ou “RSS” (“Resident” dans ram “Set Size”) d’un certain nombre de programmes en cours d’exécution. Mais RSS peut être trompeur, car une partie de la mémoire est partagée :

Vous ne pouvez pas additionner RSS, car cela doublerait la mémoire partagée. il faut additionner PSS, le RSS proportionnel après prise en compte du partage. Les smem La commande peut afficher PSS et également calculer les totaux. Par exemple:

  • sudo smem -t > p; head -n1 p; echo; tail -n17 p – Regardez l’utilisation de la mémoire par processus. Les tail une partie affichera les 15 meilleurs processus, suivis d’une ligne avec le total PSS, etc.
  • smem -t -U ^sourcejedi$ > U; head -n1 U; echo; tail -n17 U – Regardez l’utilisation de la mémoire des processus appartenant à mon utilisateur, “sourcejedi”.
  • sudo smem -t -u – Regardez la mémoire regroupée par utilisateur. Cela peut être utile pour distinguer vos sessions de connexion de certains démons système qui s’exécutent en tant que leur propre utilisateur. Par exemple, packagekitd s’exécute en tant que root utilisateur, et peut utiliser des centaines de mégaoctets.
  • smem -t -P firefox – Regardez l’utilisation de la mémoire de mon navigateur Web :-).
  • sudo smem -t -m > m; head -n5 m; echo; tail m – Regardez la mémoire regroupée par le nom de mappage – le nom du fichier mis en cache, ou “ ” ou “[heap]”.

    La mémoire “résidente” du processus comprend les deux mémoire “anonyme”, et certains fichiers mis en cache. smem -m ne peut pas afficher tous les fichiers mis en cache, uniquement certains types de fichiers actuellement en cours d’utilisation. Plus précisément, les fichiers qu’un programme a mappés dans la mémoire virtuelle. Cela inclut le code du programme, le code de la bibliothèque et les fichiers mappés à l’aide de mmap().

Shmem

Vous avez aussi Shmem: 374848 kB (0,4 Go). j’ai mentionné Shmem / “partagé” ci-dessus. C’est un autre terme qui réduit la mémoire “disponible”. (Ce n’est pas un cache récupérable). C’est assez normal, mais vous pouvez essayer de voir ce que c’est.

Une partie de la mémoire partagée est visible en tant que mémoire de processus individuels. Si la mémoire partagée est mappée par un processus, alors elle doit être comptée dans le RSS/PSS. Voir au dessus. Le “nom de mappage” peut parfois être utile ici (par ex. smem -t -m).

Shmem inclut des fichiers sur monté tmpfs. Vous pouvez vérifier tout monté tmpfs à l’aide de df -t tmpfs.

Selon votre système, Shmem pourrait inclure des tampons graphiques. J’ai trouvé un moyen de vérifier leur taille actuelle sur mon système (graphique Intel) : puis-je voir la quantité de mémoire allouée en tant que tampons GEM ? J’aimerais savoir si vous trouvez un autre moyen de vérifier votre système !

je lis ça Shmem les fuites de mémoire dans certains autres pilotes graphiques peuvent être associées à une très grande VIRT (alias VSIZE) pour Xorg. Linux utilisant tout l’échange, devenant insensible alors qu’il y a beaucoup de RAM libre

Autre utilisation de la mémoire ?

  • MemTotal - MemAvailable = 1796088 kB (1,8 Go)
  • AnonPages: 924844 kB (0,9 Go)
  • Shmem: 374848 kB (0,4 Go)

Sur les 0,5 Go restants, je peux voir quelques autres petites utilisations sous 0,1 Go au total. Le noyau se réserve également quelques points de pourcentage de marge (voir “low water mark”), mais je suppose que ce serait 0,2 Go ou moins sur votre système. Il y a donc un peu plus d’utilisation dont je ne suis pas sûr.

Mémoire de dalle de noyau

La mémoire « dalle irrécupérable » est un autre terme qui réduit MemAvailable. Vous n’avez pas grand-chose : SUnreclaim: 55044 kB (0,05 Go).

Vous pouvez également exécuter dalle pour voir la liste des dalles. AFAICT, la dalle ne donne pas de statistiques sur les dalles comme récupérables ou non récupérables. Mais je peux généralement deviner, et s’il y a une dalle suspecte, je suppose que vous pouvez la rechercher par son nom.

3. Autres outils que vous pouvez utiliser – installez atop aujourd’hui 😎

smem peut-être exagéré. Parfois, tout ce dont vous avez besoin est top, ou votre alternative préférée, et de savoir comment trier par mémoire résidente. (Même si gnome-system-monitor pourrait ne pas être un bon choix pour cela. Je pense que ça ne se voit pas vraiment assez).

Parfois, lorsque vous rencontrez un problème de performances, vous devez plutôt examiner les lectures et écritures sur disque. Vous pourriez utiliser sudo iotop.

Parfois, vous voudriez avoir un journal de l’utilisation de la mémoire par processus, afin que vous puissiez voir pourquoi vous avez manqué de mémoire et ralenti le système à un crawl…

atop est un petit outil astucieux qui peut faire tout ce qui précède. Si cela vous semble utile, je vous suggère de l’installer immédiatement. Ensuite, vous pouvez en apprendre davantage quand vous en avez besoin :-).

sudo atop -R affiche “PSIZE” (même signification que “PSS”). Les atop Le forfait comprend un service d’arrière-plan qui s’exécute avec un intervalle de dix minutes. Vous pouvez utiliser atop -r ... pour ouvrir les fichiers journaux, qui sont stockés sous /var/log/atop/.



Articles Similaires

Détecter l’Endianness avec CMake

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.