Was ist der Unterschied zwischen Puffer und Cache-Speicher unter Linux?


179

Für mich ist nicht klar, was der Unterschied zwischen den beiden Linux-Speicherkonzepten ist: bufferund cache. Ich habe diesen Beitrag gelesen und es scheint mir, dass der Unterschied zwischen ihnen die Ablaufrichtlinie ist:

  1. Die Richtlinie von buffer lautet first-in, first-out
  2. Die Cache-Richtlinie lautet "Am wenigsten verwendet".

Habe ich recht?

Insbesondere betrachte ich die beiden Befehle: freeundvmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859

Sie sollten uns mehr Kontext geben, beide Begriffe werden mit unterschiedlichen Bedeutungen verwendet. Beziehen Sie sich auf die freeBefehlsausgabe?
Leonbloy

3
Sie haben Recht, ich sehe mir die beiden Befehle an: free, vmstat. siehe meine Updates.
James.Xu

1
Sie können auch unix.stackexchange.com
leonbloy

Antworten:


69

"Puffer" geben an, wie viel Teil des RAM für Cache-Plattenblöcke reserviert ist. "Cached" ähnelt "Buffers", nur dass diesmal Seiten beim Lesen von Dateien zwischengespeichert werden.

Zitat aus:


3
Ich habe dies mit einem einfachen Python-Programm getestet, das große Mengen von Blöcken schreibt. Was passiert ist, dass das cachegefüllt wird, wie von gemeldet free -w -h, nicht die buffersSpalte. Ich denke, die cacheSpalte zählt sowohl Festplattenschreibvorgänge als auch Festplattenlesevorgänge und bufferswird für etwas anderes verwendet.
CMCDragonkai

@CMCDragonkai danke für die experimentellen Beweise. Die interessante Frage ist, ob Sie schneller geschrieben haben, als die Festplatte ausspülen konnte. (zB würde die Synchronisierung lange dauern), was uns sagen würde, ob schmutzige Blöcke anders gezählt werden als saubere. Linux wird sicherlich beide Typen zwischenspeichern (lru wie in der Frage erwähnt), aber einer ist in Bezug auf den Speicherdruck weitaus ernster.
Seth Robertson

179

Puffer sind einem bestimmten Blockgerät zugeordnet und umfassen das Zwischenspeichern von Dateisystem-Metadaten sowie das Verfolgen von Seiten während des Flugs. Der Cache enthält nur geparkte Dateidaten. Das heißt, die Puffer merken sich, was sich in Verzeichnissen befindet, welche Dateiberechtigungen vorhanden sind, und verfolgen, aus welchem ​​Speicher für ein bestimmtes Blockgerät geschrieben oder in diesen gelesen wird. Der Cache enthält nur den Inhalt der Dateien selbst.

Zitat Link


1
Kurz und gut erklärt. Vielen Dank.
Neugieriger

84

Zitierte Antwort (als Referenz):

Kurze Antwort: Zwischengespeichert ist die Größe des Seitencaches. Puffer ist die Größe der speicherinternen Block-E / A-Puffer. Zwischengespeicherte Angelegenheiten; Puffer sind weitgehend irrelevant.

Lange Antwort: Zwischengespeichert ist die Größe des Linux-Seitencaches abzüglich des Speichers im Swap-Cache, der durch SwapCached dargestellt wird (daher ist die Gesamtseiten-Cache-Größe Cached + SwapCached). Linux führt alle Datei-E / A über den Seiten-Cache aus. Schreibvorgänge werden so implementiert, dass die entsprechenden Seiten im Seitencache einfach als verschmutzt markiert werden. Die Flusher-Threads schreiben dann regelmäßig alle verschmutzten Seiten auf die Festplatte zurück. Lesevorgänge werden implementiert, indem die Daten aus dem Seitencache zurückgegeben werden. Wenn sich die Daten noch nicht im Cache befinden, werden sie zuerst ausgefüllt. Auf einem modernen Linux-System kann Cached leicht mehrere Gigabyte betragen. Es schrumpft nur als Reaktion auf den Speicherdruck. Das System löscht den Seitencache und tauscht Daten auf die Festplatte aus, um bei Bedarf mehr Speicher zur Verfügung zu stellen.

Puffer sind speicherinterne Block-E / A-Puffer. Sie sind relativ kurzlebig. Vor der Linux-Kernel-Version 2.4 verfügte Linux über separate Seiten- und Puffer-Caches. Seit 2.4 sind der Seiten- und der Puffercache vereinheitlicht, und Puffer sind unformatierte Festplattenblöcke, die nicht im Seitencache dargestellt sind, dh keine Dateidaten. Die Puffermetrik ist daher von minimaler Bedeutung. Auf den meisten Systemen sind Puffer oft nur zehn Megabyte groß.


7
"Puffer sind weitgehend irrelevant" - Nein. In vielen Fällen ist das Zwischenspeichern von Dateiinhalten irrelevant, aber das Beibehalten der Metadaten im Cache beschleunigt die Arbeit. Zum Beispiel ein Video-Streaming-NAS-Server.
Gunther Piez

Jedes System, das viele E / A-Vorgänge ausführt, verwendet viel Speicher für Puffer. Ich lade gerade eine 100 GB MySQL / InnoDB-Datenbank und die Puffer gehen die ganze Zeit über über 2 GB.
Marcelo Pacheco

21

Es ist nicht ganz so einfach, aber es könnte helfen zu verstehen:

Der Puffer dient zum Speichern von Dateimetadaten (Berechtigungen, Speicherort usw.). Jede Speicherseite wird hier verfolgt.

Der Cache dient zum Speichern des tatsächlichen Dateiinhalts.


5
IOW, Puffer = Metadaten; Cache = Daten;
Freedom_Ben

13

Erklärt von RedHat :

Cache-Seiten:

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 Datenträgerdaten 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 Remote-Dateisystemen und -Datenträgern zwischenzuspeichern. Während die Zeit vergeht, werden verschiedene Lese- und Schreibvorgänge auf dem System ausgeführt, und der Kernel versucht, 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 zu speichern. Der Cache wird zu dem Zeitpunkt nicht zurückgefordert, zu dem der Prozess gestoppt / beendet wird. Wenn die anderen Prozesse jedoch mehr Speicher als der frei verfügbare 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 werden.

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

Die Daten, die in einem Cache gespeichert werden, können Werte sein, die zuvor 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 festzustellen, ob er diese Daten enthält. Die Daten können schneller aus dem Cache als aus dem Quellursprung abgerufen werden.

SysV-Shared-Memory-Segmente werden ebenfalls als Cache berücksichtigt, obwohl sie keine Daten auf den Festplatten darstellen. Sie können die Größe der gemeinsam genutzten Speichersegmente mit dem Befehl ipcs -m und der Spalte bytes überprüfen.

Puffer:

Puffer sind die Plattenblockdarstellung der Daten, die unter den Seitencaches gespeichert sind. Puffer enthalten die Metadaten der Dateien / Daten, die sich unter dem Seitencache befinden. Beispiel: Wenn Daten angefordert werden, die im Seitencache vorhanden sind, überprüft der Kernel zunächst die Daten in den Puffern, die die Metadaten enthalten, die auf die tatsächlichen Dateien / Daten in den Seitencaches verweisen. Sobald aus den Metadaten die tatsächliche Blockadresse der Datei bekannt ist, wird sie vom Kernel zur Verarbeitung aufgenommen.


12

Puffer und Cache.

Ein Puffer muss noch auf die Festplatte "geschrieben" werden.

Ein Cache wurde von der Festplatte "gelesen" und zur späteren Verwendung gespeichert.


2
Tipp für neue Benutzer: Stellen Sie sicher, dass Ihre Antwort so klar wie möglich mit der Frage zusammenhängt. Wenn ich Sie wäre, würde ich Ihrer Antwort einen Abschnitt hinzufügen, der mit "Also, mit Ihrem Beispiel ..." beginnt, und etwas näher darauf eingehen.
Piotr Wadas

25
Ich denke nicht, dass diese Antwort im selben Kontext wie die Frage wahr ist (nämlich was der Linux-Kernel unter "Puffer" und "Cache" versteht
Freedom_Ben

8

Ich denke, diese Seite wird helfen, den Unterschied zwischen Puffer und Cache tief zu verstehen. http://www.tldp.org/LDP/sag/html/buffer-cache.html

Das Lesen von einer Festplatte ist im Vergleich zum Zugriff auf (echten) Speicher sehr langsam. Darüber hinaus ist es üblich, denselben Teil einer Festplatte in relativ kurzen Zeiträumen mehrmals zu lesen. Beispielsweise könnte man zuerst eine E-Mail-Nachricht lesen, dann den Brief in einen Editor lesen, wenn man darauf antwortet, und dann das Mail-Programm veranlassen, ihn erneut zu lesen, wenn man ihn in einen Ordner kopiert. Oder überlegen Sie, wie oft der Befehl lsauf einem System mit vielen Benutzern ausgeführt werden kann. Wenn Sie die Informationen nur einmal von der Festplatte lesen und dann im Speicher behalten, bis sie nicht mehr benötigt werden, können Sie alle bis auf den ersten Lesevorgang beschleunigen. Dies wird als Festplattenpufferung bezeichnet, und der für diesen Zweck verwendete Speicher wird als Puffercache bezeichnet.

Da der Speicher leider eine endliche, ja knappe Ressource ist, kann der Puffercache normalerweise nicht groß genug sein (er kann nicht alle Daten enthalten, die jemals verwendet werden sollen). Wenn der Cache voll ist, werden die Daten, die am längsten nicht verwendet wurden, verworfen und der so freigegebene Speicher für die neuen Daten verwendet.

Die Festplattenpufferung funktioniert auch für Schreibvorgänge. Einerseits werden geschriebene Daten häufig bald wieder gelesen (z. B. wird eine Quellcodedatei in einer Datei gespeichert und dann vom Compiler gelesen). Daher ist es eine gute Idee, Daten, die in den Cache geschrieben werden, abzulegen. Auf der anderen Seite wird das Programm, das schreibt, schneller ausgeführt, indem die Daten nur in den Cache gestellt und nicht sofort auf die Festplatte geschrieben werden. Die Schreibvorgänge können dann im Hintergrund ausgeführt werden, ohne die anderen Programme zu verlangsamen.


Dies erklärt, was Puffer-Cache ist, aber nicht, was der Unterschied zwischen Puffer und Cache in den Ausgaben der Befehle vmstat und free ist.
Roel Schroeven

4

In Link 2 von Seth Robertson heißt es: "Um diese Begriffe gründlich zu verstehen, lesen Sie das Linux-Kernel-Buch wie Linux Kernel Development von Robert M. Love."

Ich habe in der 2. Ausgabe des Buches einige Inhalte zum Thema "Puffer" gefunden.

Obwohl das physische Gerät selbst auf Sektorebene adressierbar ist, führt der Kernel alle Plattenoperationen in Form von Blöcken aus.

Wenn ein Block im Speicher gespeichert ist (z. B. nach einem Lesevorgang oder einem anstehenden Schreibvorgang), wird er in einem 'Puffer' gespeichert. Jeder 'Puffer' ist genau einem Block zugeordnet. Der 'Puffer' dient als Objekt, das einen Plattenblock im Speicher darstellt.

Ein 'Puffer' ist die speicherinterne Darstellung eines einzelnen physischen Plattenblocks.

Block-E / A-Vorgänge bearbeiten jeweils einen einzelnen Plattenblock. Eine übliche Block-E / A-Operation ist das Lesen und Schreiben von Inodes. Der Kernel bietet die Funktion width (), um einen einzelnen Block von der Festplatte auf niedriger Ebene zu lesen. Über 'Puffer' werden Plattenblöcke den zugehörigen In-Memory-Seiten zugeordnet. ""


2

Der Puffer enthält Metadaten, die zur Verbesserung der Schreibleistung beitragen

Der Cache enthält den Dateiinhalt selbst (manchmal noch nicht auf die Festplatte geschrieben), wodurch die Leseleistung verbessert wird


1

Zitat aus dem Buch: Einführung in das Abrufen von Informationen

Zwischenspeicher

Wir möchten so viele Daten wie möglich im Speicher behalten, insbesondere die Daten, auf die wir häufig zugreifen müssen. Wir nennen die Technik, häufig verwendete Festplattendaten im Hauptspeicher-Caching zu speichern.

Puffer

Betriebssysteme lesen und schreiben im Allgemeinen ganze Blöcke. Das Lesen eines einzelnen Bytes von der Festplatte kann daher genauso lange dauern wie das Lesen des gesamten Blocks. Blockgrößen von 8, 16, 32 und 64 Kilobyte (KB) sind üblich. Wir nennen den Teil des Hauptspeichers, in dem ein gelesener oder geschriebener Block gespeichert ist, einen Puffer.


0

Ein Puffer ist ein Speicherbereich, in dem Daten vorübergehend gespeichert werden, während sie innerhalb eines Computers von einem Ort an einen anderen verschoben werden. Ein Cache ist ein temporärer Speicherbereich, in dem häufig aufgerufene Daten für einen schnellen Zugriff gespeichert werden können. Sobald die Daten im Cache gespeichert sind, kann die zukünftige Verwendung durch Zugriff auf die zwischengespeicherte Kopie erfolgen, anstatt die Originaldaten erneut abzurufen, sodass die durchschnittliche Zugriffszeit kürzer ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.