Sous Linux, quelle est la différence entre «tampons» et «cache» signalés par la commande free?

74

C’est une vieille question que j’ai vue de temps en temps. Ma compréhension est assez limitée (avoir lu les différences il y a longtemps, mais les factoïdes impliqués ne se sont jamais vraiment collés).

Si je comprends bien,

  • Les 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

    Résultat d’opérations d’E / S terminées, c’est-à-dire des tampons vidés ou des données lues à partir du disque pour répondre à une demande.

Puis-je avoir une explication claire pour la postérité?

Avery Payne
la source
1
stackoverflow.com/questions/6345020/…
Ciro Santilli a annoncé le
Cela ressemble plus à des métadonnées que vous trouvez dans les tampons, cela n’est pas lié aux tampons io. Certains des tampons du noyau sont comptabilisés dans l'allocateur de brames mais ne comptent pas du tout dans les tampons ou la mémoire cache.
eckes

Réponses:

42

Le total "mis en cache" inclura également d'autres allocations de mémoire, telles que les systèmes de fichiers tmpfs. Pour voir cela en pratique, 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é sur le système de fichiers basé sur la RAM (en supposant qu'il y ait assez de RAM disponible, vous pourriez en trouver une partie en swap si la machine est déjà surchargée en termes de ressources d'utilisation de la mémoire). "Sync; echo 3> / proc / sys / vm / drop_caches" avant chaque appel à libérer doit écrire tout ce qui est en attente dans tous les tampons d'écriture (la synchronisation) et effacer de la mémoire tous les blocs de disque mis en cache / mis en mémoire tampon. allocations dans la valeur "en cache".

La RAM utilisée par les machines virtuelles (telles que celles exécutées sous VMWare) peut également être comptée dans la valeur "mise en cache" de free, de même que la RAM utilisée par les fichiers mappés en mémoire actuellement ouverts (cela varie en fonction de l'hyperviseur / version que vous utilisez et éventuellement entre les versions du noyau également).

Donc, ce n'est pas aussi simple que "les tampons comptent les écritures de fichiers / réseau en attente et les caches mis en cache les blocs récemment lus / écrits conservés dans la RAM pour sauvegarder les lectures physiques futures", bien que cette description plus simple suffira dans la plupart des cas.

David Spillett
la source
1
+1 pour les nuances intéressantes. C'est le genre d'information que je cherche. En fait, je soupçonne que les chiffres sont si compliqués, impliqués dans tellement d'activités différentes, qu'ils sont au mieux des indicateurs généraux.
Avery Payne
Je ne pense pas que la RAM utilisée par les machines virtuelles soit considérée comme "mise en cache", du moins pour qemu-kvm. Je remarque que sur mon hôte KVM, la valeur du cache est non seulement trop petite pour être correcte (à 1,9 Go), mais elle ne change pas si je détruis / démarre l'une de mes machines virtuelles. Cela ne change pas non plus si j'effectue l'astuce de montage tmpfs sur l'un des ordinateurs virtuels. J'y ai créé une partition tmpfs 800Meg et "mis en cache" a indiqué les valeurs appropriées sur la VM, mais cela n'a pas changé sur l'hôte de la VM. Mais la valeur "utilisé" a diminué / augmenté lorsque j'ai détruit / démarré ma VM.
Mike S
... j'ai exécuté des tests sur un hôte de machine virtuelle Centos 7.2.1511 exécutant le noyau 3.10.0-327.
Mike S
@MikeS: La manière dont différentes solutions de virtualisation gèrent la mémoire est susceptible de varier. En fait, la mesure dans laquelle le noyau mesure les différentes utilisations de la mémoire peut varier d'une version majeure à l'autre.
David Spillett
@MikeS: En ce qui concerne "effectuez l'astuce de montage tmpfs sur l'un des ordinateurs virtuels" - cela n'affectera pas les lectures de l'hôte si elles ne montrent pas d'autres mémoires utilisées par l'ordinateur virtuel. Je vois l'effet dans une machine virtuelle KVM elle-même: avant dd free = 2020, après dd free = 1899, après la chute de fs free = 2001 (la différence de 19 Mo sera due à d'autres processus sur la machine virtuelle, elle n'était pas inactive lorsque j'ai exécuté le test). L'hôte peut ne pas voir le changement: la mémoire est probablement toujours allouée à la machine virtuelle même si elle est libre d'utilisation par les processus de la machine virtuelle.
David Spillett
8

Question piège. Lorsque vous calculez l'espace libre, vous devez ajouter du tampon et mettre en cache les deux. 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" sur le disque et stocké pour une utilisation ultérieure.

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135

Viky
la source
5

Je cherchais une description plus claire du tampon et je l’ai trouvée dans "Professional Linux® Kernel Architecture 2008"

Chapitre 16: Cache de page et de tampon

Interaction

La mise en place d’un lien entre les pages et les mémoires tampons ne sert à rien si les autres parties du noyau ne présentent aucun avantage. Comme indiqué précédemment, il peut être nécessaire d'effectuer certaines opérations de transfert vers et depuis des périphériques en blocs 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 identique. rend les choses beaucoup plus faciles - en particulier en termes de gestion de la mémoire. Dans ce scénario, les tampons agissent en tant qu'intermédiaires entre les deux mondes.

c4f4t0r
la source
3

Expliqué par RedHat :

Pages de cache:

Un cache est la partie de la mémoire qui stocke les données de manière transparente afin que les demandes futures de ces données puissent être traitées plus rapidement. Le noyau utilise cette mémoire pour mettre en cache les données du disque et améliorer les performances des E / S.

Le noyau Linux est construit 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. À mesure que le temps passe, diverses lectures et écritures sont effectuées sur le système, le noyau tente de conserver les données stockées en mémoire pour les divers processus en cours d'exécution sur le système ou les données de processus pertinents qui seraient utilisés dans un avenir proche. Le cache n'est pas récupéré au moment où le processus est arrêté / arrêté. Cependant, lorsque les autres processus nécessitent plus de mémoire que la mémoire disponible, le noyau exécute une méthode heuristique pour récupérer la mémoire en stockant les données en cache et en l'affectant à un nouveau processus.

Quand tout type de fichier / donnée est demandé, le noyau cherchera 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 avec le contenu approprié lu à partir du disque.

Les données stockées dans un cache peuvent être des valeurs calculées précédemment ou des doublons de valeurs d'origine 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 extraites plus rapidement du cache que de leur origine.

Les segments de mémoire partagée SysV sont également comptabilisés en tant que 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 stockées dans les caches de page. Les tampons contiennent les métadonnées des fichiers / données qui se trouvent dans le cache de page. Exemple: lorsqu'il y a une demande de données présentes dans le cache de page, le noyau vérifie d'abord les données dans les tampons contenant les métadonnées qui pointent vers les fichiers / données réels contenus dans les caches de page. Une fois dans les métadonnées, l'adresse de bloc réelle du fichier est connue et le noyau le récupère pour le traitement.

Ijaz Ahmad Khan
la source
2

Libérer le tampon / cache

Avertissement Ceci explique une méthode puissante non recommandée sur le serveur de production! Donc, vous êtes prévenus, ne me blâmez pas si quelque chose ne va pas.

Pour bien comprendre, vous pouvez forcer votre système à déléguer autant de mémoire que possible au cachecontenu du fichier mis en cache:

Préambule

Avant de faire le test, vous pouvez ouvrir une autre fenêtre et un hit:

$ 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 que 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ôte sur lequel j'ai fait cela est fortement utilisé. Ce sera plus significatif sur une machine très silencieuse.

F. Hauri
la source
1
-1 si je pouvais. Ceci est à la fois (A) sans rapport avec la question posée et (B) un moyen horriblement brutal de déclencher la suppression de mémoire cache. Il existe des moyens directs de procéder de la sorte. Il n'est donc pas défendable d'inciter le système à s'y conformer en l'envoyant par spam à l'aide de données jusqu'à ce qu'il devienne un effet secondaire
underscore_d
Oh mon Dieu! S'il vous plaît, ne faites jamais cela sur de vrais serveurs!
Tamerlaha
@Tamerlaha Je suis d'accord, mais veuillez relire le premier paragraphe: vous êtes prévenu, ne m'en voulez pas ! Le but de ceci est de montrer l'implication du tampon / cache.
F. Hauri