46 votes

Pourquoi Linux signale-t-il la mémoire "libre" de manière étrange ?

Il s'agit d'un question canonique sur la façon dont les systèmes d'exploitation Unix rendent compte de l'utilisation de la mémoire.
Questions similaires :

J'ai un serveur de production qui fonctionne 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

Tous les jours 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 la fonction graphique de mémoire montre une augmentation de cache y tampons après la sauvegarde.

Ensuite, je télécharge les fichiers de sauvegarde et je les supprime. Après la suppression, les fichiers de Munin graphique de mémoire retours cache y tampons à l'état qui était le sien avant la sauvegarde.

Voici le graphique de Munin :

L'image hébergée en externe était un lien mort.

61voto

voretaq7 Points 78924

Vous faites l'expérience de la Linux a mangé ma mémoire vive question.

Pas de panique.

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 la mémoire pour d'autres raisons que l'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 (buffers)
  • Mise en cache des données récemment lues ou écrites sur le disque (cache)
  • Absolument rien (gratuit)

Ce qui suit est un bref aperçu (et largement incomplet) de la manière dont les systèmes Unix modernes rapportent l'utilisation de la mémoire vive.

Qu'est-ce que la mémoire libre ? (définition de l'OS) ?

Lorsqu'un système Unix indique que la mémoire vive est Gratuit cela signifie "je n'utilise pas cette mémoire vive pour quoi que ce soit".
Gratuit La mémoire vive ne sert à rien - elle ne rend pas votre système plus rapide, elle reste simplement "libre" au cas où quelque chose en aurait besoin. Cette chose peut être n'importe lequel des trois autres éléments que j'ai mentionnés ci-dessus.

Qu'est-ce que la mémoire cache et la mémoire tampon ?

La mémoire cache et la mémoire tampon sont des éléments de la mémoire vive que le système d'exploitation utilise pour rendre votre système plus rapide.
Cette mémoire est n'est pas nécessaire pour exécuter des programmes pour l'instant Par exemple, la bibliothèque C (nécessaire à presque tous les programmes que vous exécutez) se trouve presque toujours dans le répertoire cache Le système n'a donc pas besoin d'aller chercher sur le disque les instructions dont il a besoin pour imprimer "Hello World" à l'écran.
C'est en fait beaucoup plus compliqué que cela. partagé mémoire, câblée mémoire, etc. -- mais pour notre propos, cette simple explication suffit.

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

La mémoire active fait partie de la mémoire "utilisée", c'est-à-dire de la mémoire vive que les applications utilisent pour leurs activités, qu'il s'agisse de trier des feuilles de calcul, d'afficher des pages web, d'éditer des graphiques, etc.
La mémoire "active" a été "active" récemment : le programme qui la réclame a utilisé son contenu (lecture ou écriture), et elle n'est pas considérée comme un bon candidat à l'échange.

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

Comme la mémoire active, la mémoire inactive est la mémoire vive que les applications utilisent pour ce qu'elles font. La différence réside dans le fait que cette mémoire n'a pas été utilisée depuis un certain temps, de sorte que, le cas échéant, le système d'exploitation pense qu'elle peut être transférée sur le disque et (avec un peu de chance) que le programme qui la réclame ne la sollicitera plus, de sorte qu'il ne s'en apercevra jamais.

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

Ce que vous et moi considérons comme la mémoire "utilisée" est essentiellement la somme de la mémoire active et de la mémoire inactive. Toute la mémoire vive actuellement réclamée par les applications pour leur utilisation.
Tant que vous avez plus de mémoire vive installée que la somme de la mémoire active et de la mémoire inactive (plus une marge de sécurité de 512 à 1024 Mo), vous êtes en bonne position : Votre système d'exploitation probablement n'atteindra pas le swap et ne nuira pas à la performance.

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 un peu plus compliqué que le simple chiffre "libre" indiqué par votre système d'exploitation. Lorsqu'un programme demande de la RAM, le système d'exploitation essaie d'obtenir cette RAM de la manière la moins perturbante possible :

  • S'il y a de la mémoire libre disponible (qui ne fait rien), cette RAM sera allouée.
  • S'il n'y a pas de mémoire libre disponible, le système d'exploitation cannibalisera l'espace de cache et de mémoire tampon : Les éléments de la mémoire tampon auxquels on accède le moins souvent ou le plus rarement sont éliminés et la mémoire vive est attribuée au programme.
  • S'il n'y a pas de RAM tampon/cache à cannibaliser, l'échangeur examinera la mémoire inactive et choisira les régions qu'il pense être les moins susceptibles d'être accédées. Ces données seront paginé vers le swap (disque), et la mémoire vive nouvellement libérée est donnée au programme.
  • Si toute la mémoire vive inactive a été échangée, l'échangeur commence à placer de la mémoire vive active sur le disque.
    (C'est à peu près à ce moment-là que la performance s'effondre : Chaque fois qu'un programme utilise l'unité centrale, ses bits échangés doivent être ramenés dans la mémoire vive, ce qui signifie que la mémoire active d'un autre programme doit être échangée -- le taux de rotation élevé des swaps est appelé battage )
  • Si le système a échangé tout ce qu'il pouvait (et rempli la partition d'échange), ou si vous utilisez un système sans une partition d'échange, Mauvaises choses se produisent. À ce stade, l'une des deux choses suivantes se produira :
    • malloc() échouera. C'est le comportement conforme à POSIX - le système d'exploitation indiquera au programme qui demande de la RAM qu'il ne peut pas satisfaire cette demande.
      Le programme peut soit demander moins de RAM, soit, s'il ne peut pas se contenter d'une plus petite partie de la mémoire, nettoyer et quitter. (Si le programme est mal écrit, il se plantera tout simplement).
    • Si vous êtes sur une machine Linux, l'option OOM-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 l'auriez pas compris à la lecture de ma description ici et de ma réponse à la question liée, je pense que c'est une très mauvaise façon de traiter le problème.

Pourquoi la mémoire vive libre augmente-t-elle lorsque vous supprimez des fichiers ?

Dans l'exemple de la question, vous avez remarqué qu'il est possible de "libérer" de la RAM en supprimant le fichier de sauvegarde - l'explication est assez simple : Puisque rien n'utilise ce fichier (aucun gestionnaire de fichier ouvert) et qu'il n'est plus accessible à partir du système de fichiers (non lié), le système d'exploitation sait que personne n'accèdera plus jamais à ces données, et il purge les données du cache du système de fichiers.
Cela permet au système d'exploitation de signaler plus de mémoire libre, mais n'a pas d'impact sur les performances du système.

28voto

Tom Points 720

Il s'agit du même "problème" que celui de Le serveur refuse d'utiliser la partition d'échange et quelques autres questions similaires sur ce site. ( Utilisation élevée de la mémoire sur un serveur Linux , Utilisation de la mémoire sous LINUX , Le serveur Web manque de mémoire etc.)

Faites attention au fait que la consommation de mémoire est de 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 y conserve les fichiers récemment lus. Si une application a besoin de cette mémoire, elle l'utilisera. En attendant, elle peut vous éviter de devoir lire à nouveau un fichier sur le disque s'il est fréquemment consulté.

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

2voto

frameworkninja Points 628

Autre chose à vérifier en cas d'échec :

Vérifier l'utilisation du cache de la dalle ( Slab: , SReclaimable: et SUnreclaim: en /proc/meminfo ). Il s'agit d'un cache de structures de données dans le noyau. et est distinct du cache de pages indiqué par la fonction free .

Si le cache de la dalle est responsable d'une grande partie de votre "mémoire manquante". mémoire manquante", vérifiez /proc/slabinfo pour voir où il est passé. S'il s'agit de dentries ou d'inodes, vous pouvez utiliser sync ; echo 2 > /proc/sys/vm/drop_caches pour s'en débarrasser.

Vous pouvez également utiliser la fonction slabtop t Slab dans un format convivial. c w taille du cache.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X