Was ist unter Linux der Unterschied zwischen „Puffern“ und „Cache“, der vom Befehl free gemeldet wird?

73

Dies ist eine alte Frage, die ich von Zeit zu Zeit gesehen habe. Mein Verständnis davon ist eher begrenzt (nachdem ich vor langer Zeit über die Unterschiede gelesen habe, aber die beteiligten Faktoide sind nie wirklich festgefahren).

So wie ich es verstehe,

  • Puffer

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

  • Zwischenspeicher

    Ist das Ergebnis abgeschlossener E / A-Vorgänge, dh Puffer, die geleert oder Daten von der Festplatte gelesen wurden, um eine Anforderung zu erfüllen.

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

Avery Payne
quelle
Es ist eher wie Metadaten, die Sie in Puffern finden, es ist nicht mit IO-Puffern verwandt. Einige der Kernel-Puffer werden im Slab-Allokator berücksichtigt, zählen jedoch überhaupt nicht zu den Puffern oder zum Cache-Speicher.
Eckes

Antworten:

42

Die "zwischengespeicherte" Gesamtsumme enthält auch einige andere Speicherzuordnungen, z. B. alle tmpfs-Dateisysteme. Um dies zu sehen, versuchen Sie:

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 abfällt, die Sie in das RAM-basierte Dateisystem kopiert haben (vorausgesetzt, dass genügend freier RAM vorhanden ist, werden Sie möglicherweise feststellen, dass ein Teil davon im Swap landet, wenn der Computer bereits überlastet ist der Speichernutzung). Das "sync; echo 3> / proc / sys / vm / drop_caches" vor jedem Aufruf von free sollte alles schreiben, was in allen Schreibpuffern ansteht (die Synchronisierung) und alle zwischengespeicherten / gepufferten Plattenblöcke aus dem Speicher löschen, so dass free nur andere liest Zuweisungen im "zwischengespeicherten" Wert.

Der von virtuellen Maschinen (z. B. unter VMWare ausgeführten) verwendete Arbeitsspeicher wird möglicherweise auch im "zwischengespeicherten" Wert von free mitgezählt, ebenso wie der Arbeitsspeicher, der von derzeit geöffneten Speicherzuordnungsdateien verwendet wird (dies hängt vom verwendeten Hypervisor / der verwendeten Version und ab) möglicherweise auch zwischen Kernelversionen).

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

David Spillett
quelle
1
+1 für interessante Nuancen. Dies ist die Art von Informationen, die ich suche. Tatsächlich vermute ich, dass die Zahlen so verwickelt sind, dass sie so viele verschiedene Aktivitäten betreffen, dass sie bestenfalls allgemeine Indikatoren sind.
Avery Payne
Ich denke nicht, dass der von virtuellen Maschinen verwendete RAM als "zwischengespeichert" gezählt wird, zumindest für qemu-kvm. Ich bemerke, dass der Cache-Wert auf meinem KVM-Host nicht nur zu klein ist, um korrekt zu sein (bei 1,9 Gig), sondern sich auch nicht ändert, wenn ich eine meiner VMs zerstöre / starte. Es ändert sich auch nicht, wenn ich den Trick "tmpfs mount" auf einer der VMs durchführe. Ich habe dort eine 800Meg-tmpfs-Partition erstellt und "zwischengespeichert" die richtigen Werte auf der VM angezeigt, aber es hat sich nicht auf dem VM-Host geändert. Aber der "verwendete" Wert ist geschrumpft / gewachsen, als ich meine VM zerstört / gestartet habe.
Mike S
... Ich habe Tests auf einem Centos 7.2.1511-VM-Host mit Kernel 3.10.0-327 ausgeführt.
Mike S
@MikeS: Wie unterschiedliche Virtualisierungslösungen mit Speicher umgehen, kann variieren. Tatsächlich kann sich die Art und Weise, wie der Kernel die verschiedenen Speicherauslastungen misst, zwischen den Hauptversionen ändern.
David Spillett
@MikeS: In Bezug auf "Führen Sie den tmpfs-Mount-Trick auf einer der VMs aus" - I hat dies keine Auswirkungen auf die Host-Messwerte, wenn keine anderen von der VM verwendeten Mems angezeigt werden. Ich sehe den Effekt in einer KVM-VM selbst: vor dd free = 2020, nach dd free = 1899, nach drop fs free = 2001 (der Unterschied von 19 MB ist auf andere Prozesse auf der VM zurückzuführen, die beim Ausführen nicht inaktiv waren) der Test). Der Host kann die Änderung möglicherweise nicht sehen: Der Speicher ist wahrscheinlich immer noch der VM zugeordnet, obwohl er von Prozessen in der VM verwendet werden kann.
David Spillett
5

Ich suchte nach einer klareren Beschreibung des Puffers und fand sie in "Professional Linux® Kernel Architecture 2008"

Kapitel 16: Seiten- und Puffer-Cache

Interaktion

Das Einrichten einer Verknüpfung zwischen Seiten und Puffern hat wenig Sinn, wenn es für andere Teile des Kernels keine Vorteile gibt. Wie bereits erwähnt, müssen einige Übertragungsvorgänge zu und von Blockgeräten möglicherweise in Einheiten ausgeführt werden, deren Größe von der Blockgröße der zugrunde liegenden Geräte abhängt, wohingegen viele Teile des Kernels es vorziehen, E / A-Vorgänge mit Seitengranularität durchzuführen macht die Sache viel einfacher - vor allem im Hinblick auf die Speicherverwaltung. In diesem Szenario fungieren Puffer als Vermittler zwischen den beiden Welten.

c4f4t0r
quelle
3

Erklärt von RedHat :

Cacheseiten:

Ein Cache ist der Teil des Speichers, in dem Daten transparent gespeichert werden, damit zukünftige Anforderungen für diese Daten schneller bearbeitet werden können. Dieser Speicher wird vom Kernel verwendet, um Plattendaten zwischenzuspeichern und die E / A-Leistung zu verbessern.

Der Linux-Kernel ist so aufgebaut, dass er so viel RAM wie möglich verwendet, um Informationen von Ihren lokalen und entfernten Dateisystemen und Festplatten zwischenzuspeichern. Während die Zeit vergeht, werden verschiedene Lese- und Schreibvorgänge auf dem System ausgeführt. Der Kernel versucht, die Daten für die verschiedenen auf dem System ausgeführten Prozesse oder die Daten der relevanten Prozesse, die in naher Zukunft verwendet werden würden, im Speicher zu halten. Der Cache wird nicht zurückgefordert, wenn der Prozess angehalten / beendet wird. Wenn jedoch die anderen Prozesse mehr Speicher als den verfügbaren Speicher benötigen, führt der Kernel Heuristiken aus, um den Speicher zurückzugewinnen, indem die Cache-Daten gespeichert und dieser Speicher einem neuen Prozess zugewiesen wird.

Wenn irgendeine Art von Datei / Daten angefordert wird, sucht der Kernel nach einer Kopie des Teils der Datei, auf den sich der Benutzer bezieht. Wenn keine solche Kopie vorhanden ist, reserviert er eine neue Seite des Cache-Speichers und füllt sie mit die entsprechenden Inhalte von der Festplatte ausgelesen.

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

Gemeinsam genutzte SysV-Speichersegmente werden ebenfalls als Cache behandelt, obwohl sie keine Daten auf den Datenträgern darstellen. Die Größe der gemeinsam genutzten Speichersegmente kann mit dem Befehl ipcs -m und der Spalte bytes überprüft werden.

Puffer:

Puffer sind die Plattenblockdarstellung der Daten, die unter den Seiten-Caches gespeichert sind. Buffers enthält die Metadaten der Dateien / Daten, die sich im Seiten-Cache befinden. Beispiel: Bei einer Anforderung von Daten, die im Seiten-Cache vorhanden sind, überprüft der Kern zunächst die Daten in den Puffern, die die Metadaten enthalten, die auf die tatsächlichen Dateien / Daten in den Seiten-Caches verweisen. Sobald aus den Metadaten die tatsächliche Blockadresse der Datei bekannt ist, wird diese vom Kernel zur Verarbeitung abgerufen.

Ijaz Ahmad Khan
quelle
2

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 besseren Verständnis könnten Sie Ihr System zwingen , so viel Speicher wie möglich zu delegieren, cacheum die zwischengespeicherte Datei zu löschen:

Präambel

Bevor Sie den Test durchführen, können Sie ein anderes Fenster öffnen und einen Treffer erzielen:

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

zum Verfolgen der Swap-Entwicklung in Echtzeit.

Hinweis: Sie müssen so viele Festplatten im aktuellen Verzeichnis entsorgen, wie Sie über mem + swap verfügen

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 Host, auf dem ich das gemacht habe, wird stark genutzt. Dies ist bei einer sehr leisen Maschine von größerer Bedeutung.

F. Hauri
quelle
1
-1 wenn ich könnte. Dies ist sowohl (A) irrelevant für die gestellte Frage als auch (B) ein schrecklich direkter Weg, um die Cache-Freigabe auszulösen. Es gibt direkte Möglichkeiten, um Letzteres zu erreichen. Daher ist es nicht zu verhindern, dass das System die Anforderungen durch Spam mit Daten erfüllt, bis diese als Nebeneffekt
angezeigt werden
Oh mein Gott! Bitte mach das niemals auf echten Servern!
Tamerlaha
@Tamerlaha Ich stimme zu, aber bitte lies den ersten Absatz noch einmal durch: Du bist gewarnt, beschuldige mich nicht ! Ziel ist es, die Auswirkungen von Puffer / Cache aufzuzeigen.
F. Hauri