web-dev-qa-db-fra.com

Sous Linux, quelle est la différence entre "tampons" et "cache" rapportée par la commande gratuite?

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é?

73
Avery Payne

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.

41
David Spillett

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

8
Viky

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.

5
c4f4t0r

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.

3
Ijaz Ahmad Khan

Libération du tampon/cache

( 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.

2
F. Hauri