C'est une vieille question que j'ai vue de temps en temps. Ma compréhension de celui-ci est plutôt limitée (après avoir lu les différences il y a longtemps, mais les factoïdes impliqués n'ont jamais vraiment collé).
Si je comprends bien,
Tampons
Sont utilisés par des programmes avec des opérations d'E/S actives, c'est-à-dire des données en attente d'écriture sur le disque
Cache
Est le résultat d'opérations d'E/S terminées, c'est-à-dire des tampons qui ont été vidés ou des données lues sur le disque pour satisfaire une demande.
Puis-je obtenir une explication claire de la postérité?
Le total "mis en cache" comprendra également d'autres allocations de mémoire, telles que tout système 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 de "cache" chuter de 100 Mo que vous avez copiés dans le système de fichiers basé sur RAM (en supposant qu'il y avait suffisamment de RAM libre, vous pourriez en trouver une partie en swap si la machine est déjà sur-engagé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/tamponné 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 "mise en cache" de free, de même que RAM utilisée par la machine actuellement ouverte) fichiers mappés en mémoire (cela variera selon l'hyperviseur/la version que vous utilisez et éventuellement 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 les comptes mis en cache les blocs récemment lus/écrits conservés dans RAM pour enregistrer les futures lectures physiques", bien que dans la plupart des cas, cette description plus simple ça ira.
Question piège. Lorsque vous calculez de l'espace libre, vous devez réellement ajouter un tampon et un cache à la fois. Voilà 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" sur le disque et stocké pour une utilisation ultérieure.
http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135
Je cherchais une description plus claire du tampon et j'ai trouvé dans "Professional Linux® Kernel Architecture 2008"
Chapitre 16: Page et cache tampon
Interaction
La mise en place d'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à indiqué, certaines opérations de transfert vers et depuis des périphériques de bloc 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, tandis 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 - en particulier en termes de gestion de la mémoire. Dans ce scénario, les tampons agissent comme des intermédiaires entre les deux mondes.
Expliqué par RedHat:
Pages de 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 construit de telle manière qu'il utilisera autant RAM que possible pour mettre en cache les informations de vos systèmes de fichiers et disques locaux et distants. Au fur et à mesure que le temps passe sur diverses lectures et écritures, effectué sur le système, le noyau essaie de conserver les données stockées dans la mémoire pour les différents processus qui s'exécutent 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 get stop/exit, cependant lorsque les autres processus nécessitent plus de mémoire que la mémoire disponible libre, le noyau exécutera des heuristiques pour récupérer la mémoire en stockant les données de cache et en allouant cette mémoire à un nouveau processus.
Lorsqu'un type de fichier/de données est demandé, le noyau recherchera une copie de la partie du fichier sur laquelle l'utilisateur agit et, si aucune copie de ce type n'existe, il allouera une nouvelle page de mémoire cache et la remplira de le contenu approprié lu sur le 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 dans le cache que dans leur origine source.
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 du bloc de disque des données stockées sous les caches de page. Buffers contient les métadonnées des fichiers/données qui résident sous le cache de page. Exemple: Lorsqu'il y a une demande de données présentes dans le cache de pages, 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 connue des métadonnées, l'adresse de bloc réelle du fichier est connue, elle est récupérée par le noyau pour traitement.
( Avertissement Ceci explique une méthode puissante non recommandée sur le serveur de production! Vous êtes donc prévenu, ne me blâmez pas si quelque chose se passe mal.
Pour comprendre, la chose, vous pouvez forcer votre système à déléguer autant de mémoire que possible à cache
que de supprimer le fichier mis en cache:
Avant de faire le test, vous pouvez ouvrir une autre fenêtre avec succès:
$ 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.
Nota: Vous devez disposer d'autant de disque libre sur le répertoire courant, vous avez mem + swap
$ 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ôte sur lequel j'ai fait cela est fortement utilisé. Ce sera plus important sur une machine vraiment silencieuse.