Solution 1 :
Le total "caché" inclura également d'autres allocations de mémoire, telles que tous les systèmes de fichiers tmpfs. Pour voir cela en effet, essayez :
mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
et vous verrez la valeur "cache" chuter de 100 Mo que vous avez copiés sur le système de fichiers basé sur la mémoire vive (en supposant qu'il y avait suffisamment de RAM libre, vous pourriez en trouver une partie dans l'échange si la machine est déjà surchargée en termes d'utilisation de la mémoire). Le "sync; echo 3> /proc/sys/vm/drop_caches" avant chaque appel à free doit écrire tout ce qui est en attente dans tous les tampons d'écriture (la synchronisation) et effacer tous les blocs de disque mis en cache/tampon de la mémoire afin que free ne lise que les autres allocations dans la valeur "en cache".
La RAM utilisée par les machines virtuelles (telles que celles fonctionnant sous VMWare) peut également être comptée dans la valeur "cachée" de free, tout comme la RAM utilisée par les fichiers mappés en mémoire actuellement ouverts (cela variera en fonction de l'hyperviseur/version que vous utilisez et peut-être aussi entre les versions du noyau).
Ce n'est donc pas aussi simple que "les tampons comptent les écritures de fichiers/réseaux en attente et le cache compte les blocs récemment lus/écrits conservés dans la RAM pour enregistrer les lectures physiques futures", bien que dans la plupart des cas, cette description plus simple convienne.
Solution 2 :
Question piège. Lorsque vous calculez l'espace libre, vous devez en fait ajouter le tampon et le cache à la fois. C'est ce que j'ai pu trouver
Un tampon est quelque chose qui n'a pas encore été "écrit" sur le disque. Un cache est quelque chose qui a été "lu" à partir du disque et stocké pour une utilisation ultérieure.
http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135
Solution 3 :
Je cherchais une description plus claire du tampon et j'ai trouvé dans "Professional Linux® Kernel Architecture 2008"
Chapitre 16 :Cache de pages et de tampons
Interaction
Établir un lien entre les pages et les tampons ne sert à rien s'il n'y a aucun avantage pour les autres parties du noyau. Comme déjà noté, certaines opérations de transfert vers et depuis des périphériques blocs peuvent devoir être effectuées dans des unités dont la taille dépend de la taille de bloc des périphériques sous-jacents, alors que de nombreuses parties du noyau préfèrent effectuer des opérations d'E/S avec une granularité de page car cela rend les choses beaucoup plus faciles. — notamment en termes de gestion de la mémoire. Dans ce scénario, les tampons agissent comme des intermédiaires entre les deux mondes.
Solution 4 :
Expliqué par RedHat :
Pages cache :
Un cache est la partie de la mémoire qui stocke de manière transparente les données afin que les demandes futures pour ces données puissent être traitées plus rapidement. Cette mémoire est utilisée par le noyau pour mettre en cache les données du disque et améliorer les performances d'E/S.
Le noyau Linux est conçu de manière à utiliser autant de RAM que possible pour mettre en cache les informations de vos systèmes de fichiers et disques locaux et distants. Au fil du temps, diverses lectures et écritures sont effectuées sur le système, le noyau essaie de conserver les données stockées dans la mémoire pour les différents processus en cours d'exécution sur le système ou les données des processus pertinents qui seraient utilisés dans un avenir proche. Le cache n'est pas récupéré au moment où le processus s'arrête/quitte, mais lorsque les autres processus nécessitent plus de mémoire que la mémoire libre disponible, le noyau exécutera une heuristique pour récupérer la mémoire en stockant les données du cache et en allouant cette mémoire au nouveau processus.
Lorsqu'un type de fichier/données est demandé, le noyau recherche une copie de la partie du fichier sur laquelle l'utilisateur agit et, si aucune copie n'existe, il alloue une nouvelle page de mémoire cache et la remplit avec le contenu approprié lu à partir du disque.
Les données stockées dans un cache peuvent être des valeurs qui ont été calculées précédemment ou des doublons de valeurs d'origine qui sont stockées ailleurs sur le disque. Lorsque certaines données sont demandées, le cache est d'abord vérifié pour voir s'il contient ces données. Les données peuvent être récupérées plus rapidement du cache que de leur source d'origine.
Les segments de mémoire partagée SysV sont également considérés comme un cache, bien qu'ils ne représentent aucune donnée sur les disques. On peut vérifier la taille des segments de mémoire partagée en utilisant la commande ipcs -m et en vérifiant la colonne d'octets.
Tampons :
Les tampons sont la représentation de bloc de disque des données qui sont stockées sous les caches de page. Les tampons contiennent les métadonnées des fichiers/données qui résident sous le cache de la page. Exemple :lorsqu'il y a une demande de données présentes dans le cache de la page, le noyau vérifie d'abord les données dans les tampons qui contiennent les métadonnées qui pointent vers les fichiers/données réels contenus dans les caches de pages. Une fois que l'adresse de bloc réelle du fichier est connue à partir des métadonnées, elle est récupérée par le noyau pour traitement.
Solution 5 :
Libérer le tampon/cache
Avertissement Ceci explique une méthode forte non recommandée sur un serveur de production ! Vous êtes donc prévenu, ne me blâmez pas si quelque chose ne va pas.
Pour comprendre, la chose, vous pourriez forcer votre système pour déléguer autant de mémoire que possible à cache
que de supprimer le fichier en cache :
Avant de faire le test, vous pourriez ouvrir une autre fenêtre un coup :
$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 1 39132 59740 39892 1038820 0 0 1 0 3 3 5 13 81 1
1 0 39132 59140 40076 1038812 0 0 184 0 10566 2157 27 15 48 11
...
pour suivre l'évolution du swap en temps réel.
Remarque : Vous devez disposer d'autant de disque libre sur le répertoire courant, vous avez mem+swap
La démo$ free
total used free shared buffers cached
Mem: 2064396 2004320 60076 0 90740 945964
-/+ buffers/cache: 967616 1096780
Swap: 3145720 38812 3106908
$ tot=0
$ while read -a line;do
[[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
done </proc/meminfo
$ echo $tot
10420232
$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s
$ cat >/dev/null veryBigFile
$ free
total used free shared buffers cached
Mem: 2064396 2010160 54236 0 41568 1039636
-/+ buffers/cache: 928956 1135440
Swap: 3145720 39132 3106588
$ rm veryBigFile
$ free
total used free shared buffers cached
Mem: 2064396 1005104 1059292 0 41840 48124
-/+ buffers/cache: 915140 1149256
Swap: 3145720 39132 3106588
Nota, l'hébergeur sur lequel j'ai fait cela est fortement utilisé. Ce sera plus significatif sur une machine vraiment silencieuse.