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