GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist unter Linux der Unterschied zwischen Puffern und Cache, die vom Befehl free gemeldet werden?

Lösung 1:

Die "zwischengespeicherte" Summe enthält auch einige andere Speicherzuweisungen, wie z. B. alle tmpfs-Dateisysteme. 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 sinkt, die Sie in das RAM-basierte Dateisystem kopiert haben (vorausgesetzt, es war genügend freier RAM vorhanden, könnten Sie feststellen, dass ein Teil davon im Swap endete, wenn die Maschine bereits überbelegt ist in Begriffen der Speichernutzung). Das "sync; echo 3> /proc/sys/vm/drop_caches" vor jedem Aufruf von free sollte alles schreiben, was in allen Schreibpuffern (der Synchronisierung) anhängig ist, und alle zwischengespeicherten/gepufferten Festplattenblöcke aus dem Speicher löschen, damit free nur andere lesen wird Zuweisungen im "gecachten" Wert.

Der von virtuellen Maschinen (wie denen, die unter VMWare laufen) verwendete Arbeitsspeicher kann ebenfalls im „gecachten“ Wert von free gezählt werden, ebenso wie der Arbeitsspeicher, der von derzeit geöffneten speicherabgebildeten Dateien verwendet wird (dies variiert je nach verwendetem Hypervisor/Version und möglicherweise auch zwischen Kernelversionen).

Es ist also nicht so einfach wie "Puffer zählt ausstehende Datei-/Netzwerkschreibvorgänge und zwischengespeicherte zählt kürzlich gelesene/geschriebene Blöcke, die im RAM gehalten werden, um zukünftige physische Lesevorgänge zu speichern", obwohl diese einfachere Beschreibung für die meisten Zwecke ausreicht.

Lösung 2:

Knifflige Frage. Wenn Sie den freien Speicherplatz berechnen, müssen Sie tatsächlich Puffer und Cache addieren. Dies ist, was ich finden konnte

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

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

Lösung 3:

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

Kapitel 16:Seiten- und Puffer-Cache

Interaktion

Einen Link zwischen Pages und Buffers einzurichten, hat wenig Sinn, wenn es keine Vorteile für andere Teile des Kernels gibt. Wie bereits erwähnt, müssen einige Übertragungsoperationen zu und von Blockgeräten möglicherweise in Einheiten durchgeführt werden, deren Größe von der Blockgröße der zugrunde liegenden Geräte abhängt, während viele Teile des Kernels es vorziehen, I/O-Operationen mit Seitengranularität auszuführen, da dies die Dinge viel einfacher macht – insbesondere in Bezug auf die Speicherverwaltung. In diesem Szenario fungieren Puffer als Vermittler zwischen den beiden Welten.

Lösung 4:

Erklärt von RedHat :

Cache-Seiten:

Ein Cache ist der Teil des Speichers, der Daten transparent speichert, sodass zukünftige Anforderungen für diese Daten schneller bedient werden können. Dieser Speicher wird vom Kernel verwendet, um Festplattendaten 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 über verschiedene Lese- und Schreibvorgänge auf dem System vergeht, versucht der Kernel, Daten für die verschiedenen Prozesse, die auf dem System ausgeführt werden, oder die Daten relevanter Prozesse, die in naher Zukunft verwendet werden, im Speicher gespeichert zu halten. Der Cache wird zu dem Zeitpunkt, an dem der Prozess gestoppt/beendet wird, nicht zurückgefordert. Wenn jedoch die anderen Prozesse mehr Speicher als den frei verfügbaren Speicher benötigen, führt der Kernel Heuristiken aus, um den Speicher zurückzugewinnen, indem er die Cache-Daten speichert und diesen Speicher einem neuen Prozess zuweist.

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

Die in einem Cache gespeicherten Daten können Werte sein, die früher berechnet wurden, oder Duplikate von Originalwerten, 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 abgerufen werden als von ihrem Quellursprung.

SysV-Shared-Memory-Segmente werden ebenfalls als Cache gezählt, obwohl sie keine Daten auf den Platten darstellen. Man kann die Größe der Shared-Memory-Segmente mit dem Befehl ipcs -m und der Bytes-Spalte prüfen.

Puffer :

Puffer sind die Plattenblockdarstellung der Daten, die unter den Seitencaches gespeichert werden. Puffer enthalten die Metadaten der Dateien/Daten, die sich unter dem Seiten-Cache befinden. Beispiel:Wenn Daten angefordert werden, die im Seiten-Cache vorhanden sind, prüft der Kernel zuerst die Daten in den Puffern, die die Metadaten enthalten, auf die verwiesen wird die eigentlichen Dateien/Daten, die in den Seitencaches enthalten sind. Sobald aus den Metadaten die tatsächliche Blockadresse der Datei bekannt ist, wird sie vom Kernel zur Verarbeitung abgeholt.

Lösung 5:

Puffer/Cache freigeben

Warnung Dies erklärt eine starke Methode, die auf Produktionsservern nicht empfohlen wird! Seien Sie also gewarnt, geben Sie mir nicht die Schuld, wenn etwas schief geht.

Zum Verständnis der Sache könnte man zwingen Ihr System, so viel Speicher wie möglich an cache zu delegieren als die zwischengespeicherte Datei löschen:

Präambel

Bevor Sie den Test durchführen, können Sie ein anderes Fenster mit einem Treffer ö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
...

um die Entwicklung des Swaps in Echtzeit zu verfolgen.

Hinweis: Sie müssen so viele Festplatten im aktuellen Verzeichnis frei haben, wie Sie mem+swap haben

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 wird auf einer wirklich leisen Maschine von größerer Bedeutung sein.


Linux
  1. Was ist der Unterschied zwischen „locate“ und „find“ in Linux?

  2. Was ist der Unterschied zwischen &> und >&in bash?

  3. Was ist der Unterschied zwischen ls und l?

  4. Was ist der Unterschied zwischen Unix, Linux, BSD und GNU?

  5. Was ist der Unterschied zwischen unlink und rm?

Was ist der Unterschied zwischen macOS- und Linux-Kernels

Was ist der Unterschied zwischen Linux und Unix?

Was ist der Unterschied zwischen Rsync und BTRFS unter Linux?

Was ist der Unterschied zwischen apt und dem Befehl apt-get?

Was ist der Unterschied zwischen Kill- und Killall-Befehlen?

Was ist der Unterschied zwischen DMA und Memory-Mapped IO?