Frage Worin besteht in Linux der Unterschied zwischen "buffers" und "cache", die vom Befehl free gemeldet werden?


Das ist eine alte Frage, die ich von Zeit zu Zeit gesehen habe. Mein Verständnis davon ist ziemlich begrenzt (nachdem ich über die Unterschiede vor langer Zeit gelesen habe, aber die involvierten Factoiden sind nie wirklich stecken geblieben).

So wie ich es verstehe,

  • Puffer

    Werden von Programmen mit aktiven E / A-Operationen verwendet, d. H. Daten, die darauf warten, auf die Festplatte geschrieben zu werden

  • Zwischenspeicher

    Ist das Ergebnis abgeschlossener E / A-Operationen, d. H. Puffer, die geleert wurden oder Daten von der Platte gelesen wurden, um eine Anforderung zu erfüllen.

Kann ich eine klare Erklärung für die Nachwelt bekommen?


68
2018-06-10 15:46


Ursprung


stackoverflow.com/questions/6345020/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Es ist mehr wie Metadaten, die Sie in Puffern finden, es ist nicht mit IO-Puffer verwandt. Einige der Kernel-Puffer werden in dem Brammen-Zuordner berücksichtigt, zählen jedoch nicht zu den Puffern oder dem Cache-Speicher. - eckes


Antworten:


Die "zwischengespeicherte" Summe enthält auch einige andere Speicherzuweisungen, wie z. B. alle tmpfs filesytems. Um dies zu sehen, versuchen Sie Folgendes:

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

und Sie werden sehen, dass der "Cache" -Wert um die 100 MB fällt, die Sie in das ram-basierte Dateisystem kopiert haben (vorausgesetzt, es gab genug freien RAM, könnte ein Teil davon im Swap gelandet sein, wenn der Rechner bereits überlastet ist) der Speicherverbrauch). Die "sync; echo 3> / proc / sys / vm / drop_caches" vor jedem Aufruf zum Freigeben sollte alles in allen Schreibpuffern (die Synchronisation) ausstehende schreiben und alle zwischengespeicherten / gepufferten Plattenblöcke aus dem Speicher löschen, so dass nur andere gelesen werden Zuweisungen im "Cache" -Wert.

Der von virtuellen Maschinen genutzte RAM (wie er unter VMWare läuft) kann auch im "zwischengespeicherten" Wert von free gezählt werden, ebenso wie der Arbeitsspeicher, der von derzeit geöffneten Speicherkarten verwendet wird (dies hängt vom verwendeten Hypervisor / Version ab) möglicherweise auch zwischen Kernel-Versionen).

Es ist also nicht so einfach wie "Puffers zählt ausstehende Datei- / Netzwerkschreibvorgänge und zwischengespeicherte Zählungen kürzlich gelesener / geschriebener Blöcke im RAM, um zukünftige physikalische Lesevorgänge zu speichern", obwohl für die meisten Zwecke diese einfachere Beschreibung ausreicht.


41
2018-06-10 16:26



+1 für interessante Nuancen. Das ist die Art von Informationen, die ich suche. Ich vermute sogar, dass die Zahlen so verworren sind, dass sie an so vielen verschiedenen Aktivitäten beteiligt sind, dass sie bestenfalls allgemeine Indikatoren sind. - Avery Payne
Ich glaube nicht, dass der von virtuellen Maschinen genutzte Arbeitsspeicher zumindest für qemu-kvm als "zwischengespeichert" gilt. Ich bemerke, dass auf meinem KVM-Host der Cache-Wert nicht nur zu klein ist, um korrekt zu sein (bei 1,9 Gig), aber er ändert sich nicht, wenn ich eine meiner VMs zerstöre / starte. Das ändert sich auch nicht, wenn ich den tmpfs mount trick auf einer der VMs ausführe. Ich habe dort eine 800MM-Tmpfs-Partition erstellt und "Cached" zeigte die richtigen Werte auf der VM, aber sie hat sich auf dem VM-Host nicht geändert. Aber der "benutzte" Wert hat sich verkleinert, als ich meine VM zerstört habe. - Mike S
... Ich habe Tests auf einem Centos 7.2.1511 VM-Host mit Kernel 3.10.0-327 durchgeführt. - Mike S
@MikeS: Wie unterschiedliche Virtualisierungslösungen mit Speicher umgehen, ist wahrscheinlich unterschiedlich. Tatsächlich kann sich der Kern, der unterschiedliche Speicherverwendungen misst, zwischen Hauptversionen ändern. - David Spillett
@MikeS: Im Hinblick auf "führe den tmpfs-Mount-Trick auf einer der VMs aus" - I, der die Host-Lesungen nicht beeinflusst, wenn sie nicht andere von der VM verwendete Mems zeigen. Ich sehe den Effekt in einer KVM-VM selbst: vor dd free = 2020, nach dd free = 1899, nach drop fs free = 2001 (die 19Mb-Differenz wird durch andere Prozesse auf der VM verursacht, war nicht leer, als ich lief der Test). Der Host sieht die Änderung möglicherweise nicht: Der Speicher ist wahrscheinlich immer noch der VM zugewiesen, obwohl er für Prozesse in der VM frei ist. - David Spillett


Knifflige Frage. Wenn Sie freien Speicherplatz berechnen, müssen Sie tatsächlich Puffer aufaddieren und beides zwischenspeichern. Das könnte ich finden

Ein Puffer ist etwas, das noch auf die Festplatte "geschrieben" werden muss. Ein Cache ist etwas, das von der Platte "gelesen" und für die spätere Verwendung gespeichert wurde.

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


8
2018-06-11 12:01





Ich suchte nach einer klareren Beschreibung über Puffer und ich fand in "Professional Linux Kernel Architecture 2008"

Kapitel 16: Seiten- und Puffer-Cache

Interaktion

Das Einrichten einer Verbindung zwischen Seiten und Puffern hat wenig Sinn, wenn   Für andere Teile des Kernels gibt es keine Vorteile. Wie bereits erwähnt,   einige Übertragungsvorgänge zu und von Block-Geräten müssen möglicherweise sein   durchgeführt in Einheiten, deren Größe von der Blockgröße der   darunterliegende Geräte, während viele Teile des Kerns bevorzugen zu tragen   out E / A-Operationen mit Seitengranularität, da dies die Dinge viel macht   einfacher - vor allem in Bezug auf die Speicherverwaltung. In diesem   Szenario, Puffer fungieren als Vermittler zwischen den beiden Welten.


5
2018-01-23 08:07





Puffer / Cache freigeben

Warnung Dies erklärt eine starke Methode, die auf dem Produktionsserver nicht empfohlen wird! Du bist also gewarnt, beschuldige mich nicht, wenn etwas schief geht.

Zum Verständnis, das Ding könnte man Macht Ihr System, um so viel Speicher wie möglich zu delegieren cache als die zwischengespeicherte Datei löschen:

Präambel

Bevor du den Test machst, könntest du ein weiteres Fenster öffnen:

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

für die nachfolgende Entwicklung von Swap in Echtzeit.

Kein: Sie müssen so viele freie Festplatten im aktuellen Verzeichnis haben, Sie haben mem + swap

Die Demo
$ 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, der Gastgeber, auf dem ich das gemacht habe, wird stark genutzt. Dies wird auf einer wirklich leisen Maschine bedeutender sein.


2
2018-02-25 13:41



-1 wenn ich könnte. Dies ist sowohl (A) irrelevant für die gestellte Frage als auch (B) eine entsetzlich stumpfe Art, die Cache-Clearance auszulösen. Es gibt direkte Wege, um Letzteres zu tun, so dass es nicht vertretbar ist, das System dazu zu bringen, zuzustimmen, indem man es mit Daten spammt, bis es als Nebeneffekt verschwindet - underscore_d
Oh mein Gott! Bitte mach das nie auf echten Servern! - tamerlaha
@Tamerlaha Ich stimme zu, aber bitte lesen Sie den ersten Absatz: Du bist gewarnt, gib mir keine Vorwürfe! Ziel ist es, die Puffer- / Cache-Implikation darzustellen. - F. Hauri


Erklärt von Roter Hut:

Cache-Seiten:

Ein Cache ist der Teil des Speichers, der Daten transparent speichert, so dass zukünftige Anforderungen für diese Daten schneller bedient werden können. Dieser Speicher wird vom Kernel zum Zwischenspeichern von Datenträgerdaten und zur Verbesserung der E / A-Leistung verwendet.

Der Linux-Kernel ist so aufgebaut, dass er so viel RAM wie möglich nutzt, um Informationen von Ihren lokalen und entfernten Dateisystemen und Festplatten zwischenzuspeichern. Wenn die Zeit verstreicht, werden verschiedene Lese- und Schreibvorgänge auf dem System ausgeführt, der Kernel versucht, die im Speicher für die verschiedenen Prozesse, die auf dem System laufen, gespeicherten Daten oder die Daten jener relevanten Prozesse, die in naher Zukunft verwendet werden würden, zu behalten. Der Cache wird nicht zu dem Zeitpunkt zurückgewonnen, zu dem der Prozeß stop / exit erreicht wird. Wenn jedoch die anderen Prozesse mehr Speicher benötigen als der verfügbare freie Speicher, führt der Kernel Heuristiken durch, um den Speicher wieder freizugeben, indem er die Cache-Daten speichert und diesen neuen Prozessen zuweist.

Wenn irgendeine Art von Datei / Daten angefordert wird, dann sucht der Kernel nach einer Kopie des Teils der Datei, auf den der Benutzer einwirkt, und wenn keine solche Kopie existiert, wird er eine neue Seite des Cache-Speichers zuweisen und sie mit füllen der entsprechende Inhalt wird von der Festplatte ausgelesen.

Die Daten, die in einem Cache gespeichert werden, können Werte sein, die früher berechnet wurden, oder Duplikate von ursprünglichen Werten, die an anderer Stelle auf der Festplatte gespeichert sind. Wenn einige Daten angefordert werden, wird der Cache zuerst überprüft, um zu sehen, ob er diese Daten enthält. Die Daten können schneller aus dem Cache als von seinem Ursprungsursprung abgerufen werden.

SysV Shared Memory-Segmente werden auch als Cache behandelt, obwohl sie keine Daten auf den Festplatten darstellen. Man kann die Größe der Shared-Memory-Segmente mit dem Befehl ipcs-m überprüfen und die Byte-Spalte überprüfen.

Puffer:

Puffer sind die Festplattenblockdarstellung der Daten, die unter den Seitencaches gespeichert sind. Puffer enthält die Metadaten der Dateien / Daten, die sich im Seitencache befinden. Beispiel: Wenn eine Anforderung von Daten vorliegt, die im Seitencache vorhanden sind, überprüft der Kernel zuerst die Daten in den Puffern, die die Metadaten enthalten, die auf die tatsächlichen Dateien / Daten verweisen, die in den Seitencaches enthalten sind. Sobald aus den Metadaten die tatsächliche Blockadresse der Datei bekannt ist, wird sie vom Kernel zur Verarbeitung übernommen.


2
2017-10-14 20:36