79 votes

Sous Linux, quelle est la différence entre les "tampons" et le "cache" signalés par la commande free ?

Il s'agit d'une vieille question que j'ai vue de temps en temps. Ma compréhension de la question est plutôt limitée (j'ai lu des articles sur les différences il y a longtemps, mais le ou les faits en question n'ont jamais vraiment été retenus).

Comme je le comprends,

  • Tampons

    sont utilisés par les programmes ayant des opérations d'E/S actives, c'est-à-dire des données en attente d'être écrites sur le disque.

  • Cache

    C'est le résultat des opérations d'E/S terminées, c'est-à-dire les tampons qui ont été vidés ou les données lues sur le disque pour satisfaire une demande.

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

43voto

David Spillett Points 22424

Le total "en cache" comprendra également d'autres allocations de mémoire, comme les systèmes de fichiers tmpfs. Pour voir cela, 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" diminuer des 100 Mo que vous avez copiés dans le système de fichiers basé sur la RAM (en supposant qu'il y ait suffisamment de RAM libre, vous pourriez en trouver une partie dans le swap si la machine est déjà surengagée en termes d'utilisation de la mémoire). Le "sync ; echo 3 > /proc/sys/vm/drop_caches" avant chaque appel à free devrait écrire tout ce qui est en attente dans tous les tampons d'écriture (le sync) et effacer de la mémoire tous les blocs de disque mis en cache/tampon afin que free ne lise que les autres allocations dans la valeur "cached".

La RAM utilisée par les machines virtuelles (telles que celles fonctionnant sous VMWare) peut également être comptabilisée dans la valeur "en cache" de free, tout comme 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 peut-être aussi en fonction des versions du noyau).

Ce n'est donc pas aussi simple que "les tampons comptent les écritures en attente dans le fichier/réseau et le cache compte les blocs récemment lus/écrits conservés en RAM pour éviter les futures lectures physiques", bien que pour la plupart des cas, cette description plus simple suffise.

9voto

Viky Points 638

Question délicate. Lorsque vous calculez l'espace libre, vous devez en fait additionner la mémoire tampon et la mémoire cache. Voici ce que j'ai pu trouver

Une mémoire tampon est un élément qui n'a pas encore été "écrit" sur le disque. Un cache est un élément 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

7voto

c4f4t0r Points 5014

J'étais à la recherche d'une description plus claire de buffer et j'ai trouvé en "Professional Linux® Kernel Architecture 2008"

Chapitre 16 : Cache de page et cache tampon

Interaction

La mise en place d'un lien entre les pages et les tampons ne sert pas à grand chose si s'il n'y a pas d'avantages pour les autres parties du noyau. Comme nous l'avons déjà noté, certaines opérations de transfert vers et depuis les périphériques de bloc peuvent être être effectuées dans des unités dont la taille dépend de la taille des blocs des 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 faciliter les choses, notamment en termes de gestion de la mémoire. Dans ce Dans ce scénario, les tampons servent d'intermédiaires entre les deux mondes.

6voto

Ijaz Ahmad Points 252

Expliqué par RedHat :

Cache Pages :

Un cache est la partie de la mémoire qui stocke de manière transparente les données afin que les futures demandes de ces données puissent être servies 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'entrée/sortie.

Le noyau Linux est construit de telle manière qu'il utilise autant de 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, des lectures et des é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 seront utilisés dans un avenir proche. Le cache n'est pas récupéré au moment de l'arrêt ou de la sortie d'un processus, mais lorsque d'autres processus nécessitent plus de mémoire que la mémoire disponible, le noyau exécute 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 fichier ou des données sont demandés, le noyau recherche une copie de la partie du fichier sur laquelle l'utilisateur agit et, si cette copie n'existe pas, il alloue une nouvelle page de mémoire cache et la remplit avec 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 originales stockées ailleurs sur le disque. Lorsque des 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 source d'origine.

Les segments de mémoire partagée SysV sont également comptabilisé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 des octets.

Tampons :

Les tampons sont la représentation par bloc de disque des données qui sont stockées dans les caches de page. Les tampons contiennent les métadonnées des fichiers/données qui résident 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 qui contiennent les métadonnées qui pointent vers les fichiers/données réels contenus dans les caches de page. Une fois que l'adresse de bloc réelle du fichier est connue à partir des métadonnées, le noyau la récupère pour la traiter.

2voto

F. Hauri Points 969

Libération de la mémoire tampon/cache

Avertissement Ceci explique une méthode forte non recommandée sur un serveur de production ! Vous êtes donc prévenus, ne m'en voulez pas si quelque chose se passe mal.

Pour comprendre, la chose, vous pourriez force votre système afin de délég délég délég délég déléguer autant de mémoire que possible à cache que de laisser tomber le fichier en cache :

Préambule

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

$ 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 actuel, 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é. Cela sera plus significatif sur une machine vraiment silencieuse.

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