Pourquoi Linux rapporte-t-il la mémoire «libre» étrangement?

44

C'est une question canonique sur la façon dont les systèmes d'exploitation Unix signalent l'utilisation de la mémoire.
Questions similaires:

J'ai un serveur de production qui exécute Debian 6.0.6 Squeeze

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Chaque jour, cron exécute le script de sauvegarde en tant que root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Tout fonctionne parfaitement, mais je remarque que le graphique de la mémoire de Munin montre une augmentation de la mémoire cache et des mémoires tampons après la sauvegarde.

Ensuite, je télécharge des fichiers de sauvegarde et les supprime. Après la suppression, le graphique de la mémoire de Munin ramène le cache et les tampons à l'état antérieur à la sauvegarde.

Voici le graphique de Munin:

L'image hébergée à l'extérieur était un lien mort.

Communauté
la source
3
Félicitations, cette question a été canonisée (c'est comme la 6ème aujourd'hui à ce sujet, et elle présente l'exemple le plus intéressant et le plus joli :-)
voretaq7
6
Voir LinuxAteMyRam.com
Christoffer Hammarström

Réponses:

27

C’est le même "problème" puisque de la part du serveur refuse d’utiliser la partition de swap et quelques questions similaires sur ce site. ( Utilisation élevée de la mémoire sur un serveur Linux , utilisation de la mémoire dans LINUX , serveur Web à faible mémoire , etc.)

Faites attention au fait que la consommation de mémoire provient du cache . Cela signifie qu'il garde un fichier en mémoire. La mémoire cache est une mémoire "libre". Au lieu de laisser le bloc de mémoire vide, votre système d’exploitation conserve les fichiers récemment lus dans cet espace. Si une application a besoin de cette mémoire, celle-ci l'utilisera. Jusque-là, vous aurez une chance de ne pas avoir à lire un fichier à partir du disque s'il est fréquemment référencé.

Selon ce graphique, votre consommation de mémoire effective n'a pas changé du tout pendant toute la durée du graphique.

Jeff Ferland
la source
Est-il possible de demander au serveur de ne pas mettre en cache ces fichiers? Je suppose que je devrais courir sync; echo 3 > /proc/sys/vm/drop_cachesaprès la sauvegarde?
13
@ stan31337 Oui, c'est possible, non, vous ne devriez pas faire cela. Avoir ce fichier en mémoire ne vous coûte rien. Si vous effacez tous vos caches, chaque fichier mis en cache et devant être relu à partir du disque ralentira simplement votre système. Laissez-le faire ce pour quoi il a été conçu.
Jeff Ferland
2
@ stan31337 Lorsque vous supprimez votre fichier de sauvegarde, le système d'exploitation le supprime automatiquement du cache (c'est pourquoi votre mémoire libre augmente à nouveau après l'avoir supprimé) - Linux est suffisamment intelligent pour savoir qu'un fichier non ouvert ne peut pas être atteint depuis l’arborescence du système de fichiers ne sera plus jamais utilisé. Comme Jeff a dit, vous ne voudriez certainement pas vider tout votre cache FS (le système devra simplement relire et mettre en cache ces données du disque, ce qui
ralentira
61

Vous rencontrez le problème Linux Ate My Ram .

Ne paniquez pas.

Ce n'est pas un problème.

Votre système fonctionne comme prévu.

Le problème ne vient pas de votre système d'exploitation, mais de votre compréhension de ce qu'est la mémoire "libre".


Les systèmes Unix utilisent davantage de mémoire que la simple exécution de programmes. La mémoire peut être utilisée pour:

  • Programmes en cours d'exécution (actifs / utilisés)
  • Mise en mémoire tampon des données en transit (mémoires tampons)
  • Mise en cache des données récemment lues / écrites sur le disque (cache)
  • Absolument rien (gratuit)

Ce qui suit est un bref aperçu (et en grande partie incomplet) de la façon dont les systèmes Unix modernes signalent l’utilisation de la RAM.

Qu'est-ce que la mémoire libre (la définition du système d'exploitation) ?

Quand un système Unix rapporte la RAM en tant que Free, cela signifie "Je n'utilise cette RAM pour rien".
La RAM libre ne sert à rien, elle ne rend pas votre système plus rapide, elle reste simplement "libre" au cas où quelque chose en aurait besoin. Ce quelque chose pourrait être l'un des trois autres articles que j'ai mentionnés ci-dessus.

Que sont la mémoire cache et la mémoire tampon?

La mémoire cache et la mémoire tampon sont des ressources RAM utilisées par le système d'exploitation pour rendre votre système plus rapide.
Cette mémoire n'est pas nécessaire pour exécuter des programmes pour le moment . Votre système d'exploitation l'utilise donc pour stocker les données dont il a fréquemment besoin. Par exemple, la bibliothèque C (nécessaire à peu près à tous les programmes exécutés) est presque toujours conservée en cachemémoire. Le système n'a pas besoin d'aller sur le disque pour trouver les instructions nécessaires pour imprimer "Hello World" à l'écran.
C'est en réalité beaucoup plus compliqué que cela - mémoire partagée, mémoire câblée , etc. - mais pour notre propos, cette explication simple convient.

Qu'est-ce que la mémoire active?

La mémoire active fait partie de la mémoire «utilisée» - la mémoire RAM que les applications utilisent, peu importe leur travail - tri des feuilles de calcul, édition de pages Web, édition de graphiques, etc.
La mémoire "active" a été "active" récemment - - le programme affirmant qu'il a utilisé son contenu (en lecture ou en écriture) et qu'il n'est pas considéré comme un bon candidat pour l'échange.

Qu'est-ce que la mémoire inactive?

Comme la mémoire active, la mémoire inactive est la RAM utilisée par les applications, quelle que soit leur activité. La différence, c’est que cette mémoire n’a pas été utilisée depuis un moment. Si le système le permet, le système d’exploitation pense qu’il peut être échangé sur un disque et (avec un peu de chance) le programme affirmant qu’il ne le demanderait plus. ne remarquerez jamais.

Qu'est-ce que la mémoire "utilisée" (définition HUMAN)?

Ce que vous et moi considérons comme mémoire "usagée" est essentiellement la somme des mémoires active et inactive. Toute la RAM actuellement réclamée par les applications pour leur utilisation.
Tant que vous avez plus de RAM installée que la somme de mémoire active et inactive (plus une marge de sécurité appréciable de 512-1024 Mo au-dessus), vous êtes dans un lieu sûr: votre système d'exploitation ne réussira probablement pas. .

Qu'est-ce que la mémoire "libre" (la définition humaine) ?

Ce que vous et moi considérons comme de la mémoire "libre" est la mémoire disponible pour exécuter des programmes.
C’est légèrement plus compliqué que la simple mention "gratuite" de vos rapports de système d’exploitation. Lorsqu'un programme demande de la mémoire RAM, le système d'exploitation essaie de l'obtenir de la manière la moins perturbante possible:

  • S'il y a de la mémoire libre disponible (ne rien faire), la RAM sera allouée.
  • S'il n'y a pas de mémoire libre disponible, le système d'exploitation cannibalisera l'espace du cache et de la mémoire tampon: les éléments les moins récemment / les moins fréquemment utilisés dans le pool de mémoire tampon seront rejetés et la mémoire RAM attribuée au programme.
  • S'il n'y a pas de RAM tampon / cache à cannibaliser, le swapper examinera la mémoire inactive et choisira les régions qu'il pense le moins susceptibles d'être utilisées. Ces données seront échangées (disque) et la RAM libérée par le programme.
  • Si toute la RAM inactive a été permutée, le swapper commencera à mettre Active RAM sur le disque.
    (C’est à peu près là où les performances vont le plus souvent aux chiens: chaque fois qu’un programme obtient son exécution sur le CPU, ses bits permutés doivent être ramenés dans la RAM, ce qui signifie que la mémoire active d’un autre programme doit être remplacée - la le chiffre d'affaires élevé dans l'échange s'appelle raclée )
  • Si le système a échangé tout ce qu'il peut (et rempli la partition de swap), ou si vous exécutez un système sans partition de swap, il se passera de mauvaises choses . À ce stade, l'une des deux choses suivantes se produira:
    • malloc()va échouer. Il s’agit du comportement conforme à POSIX: le système d’exploitation indique au programme qui demande la mémoire vive qu’il ne peut pas satisfaire la demande.
      Le programme peut soit demander moins de RAM, soit s’il ne peut pas se contenter d’une plus petite quantité de mémoire, il peut le nettoyer et le quitter. (Si le programme est mal écrit, il va tout simplement planter.)
    • Si vous êtes sur une machine Linux, le MOO-Killer peut se lancer dans une folie meurtrière de type gang, mettant fin à d’autres processus pour tenter de libérer suffisamment de mémoire vive pour répondre à la demande.
      Au cas où vous ne pouvez pas comprendre par ma description ici et ma réponse à la question liée, je pense que c'est une façon terrible de traiter le problème.

Pourquoi Free RAM augmente-t-il lorsque vous supprimez des fichiers?

Dans l'exemple de la question ci-dessous, vous avez remarqué qu'il est possible de "libérer" de la RAM en supprimant le fichier de sauvegarde. L'explication est assez simple: vu que rien n'utilise ce fichier (aucun descripteur de fichier ouvert) et qu'il n'est plus accessible depuis. le système de fichiers (non lié), le système d'exploitation sait que personne ne pourra plus accéder à ces données, et il purge les données du cache du système de fichiers.
Le système d'exploitation signale ainsi plus de mémoire disponible, mais n'a aucune incidence sur les performances du système.

voretaq7
la source
Maintenant, c’est tout à fait clair pour moi… Mon expérience sous Linux est d’environ 2 mois, tout a commencé avec ce serveur Debian. Il y a un mois, j'ai installé Gentoo sur mon ordinateur portable à la maison et je suis tellement impressionné par ses performances. Cela a complètement changé d'utilisateur Windows en utilisateur Linux, même sur mon ordinateur de travail. C'est formidable d'apprendre Linux avec Gentoo, mais il y a encore beaucoup à apprendre.
@ stan31337 Vous n'êtes pas le seul à en avoir pour qui le sens n'est pas clair - il est particulièrement difficile pour les personnes issues de l'arrière-plan de Windows, à moins que Windows ne rende compte de l'utilisation de la mémoire avec ce niveau de détail - il est simplement "Utilisé" (par les programmes ) et "Free" (pour les programmes à prendre). Les utilisateurs de Mac ont un peu plus de facilité, car Activity Monitor est essentiellement une version graphique de la topRAM libre / câblée / active / inactive.
voretaq7
J'avais l'habitude de travailler avec Process Explorer sous Windows, il y avait beaucoup d'éléments de mémoire à afficher, mais la plupart d'entre eux étaient si peu clairs pour moi que je ne les ai pas
2
En outre, il convient de noter que, bien que Windows ne l'indique généralement pas de manière aussi détaillée, sa configuration est très similaire.
Joachim Sauer
Vous savez, même sous Windows, la lecture de la mémoire est source de confusion. C’est quelque chose que les fabricants de systèmes d’exploitation voudront peut-être accorder plus d’importance, ou plutôt à quelque chose qui préoccupe moins les utilisateurs que ce n’est le cas actuellement.
gparent
2

Autre chose à vérifier si l’échec ci-dessus échoue:

Vérifiez l’utilisation du cache Slab ( Slab:, SReclaimable:et SUnreclaim:dans /proc/meminfo). Il s’agit d’un cache de structures de données dans le noyau, distinct du cache de pages signalé par free.

Si le cache de dalle est responsable d'une grande partie de votre "mémoire manquante", vérifiez /proc/slabinfooù il est parti. Si ce sont des dentries ou des inodes, vous pouvez sync ; echo 2 > /proc/sys/vm/drop_cachesvous en débarrasser.

Vous pouvez également utiliser l' slabtopoutil pour afficher l'utilisation actuelle du cache Slab dans un format convivial. cva trier la liste en fonction de la taille actuelle du cache.

De: https://stackoverflow.com/a/5467207

Chris S
la source