Qual è la differenza tra memoria buffer vs cache in Linux?


179

Per me non è chiaro qual è la differenza tra i due concetti di memoria di Linux: buffere cache. Ho letto questo post e mi sembra che la differenza tra loro sia la politica di scadenza:

  1. la politica del buffer è first-in, first-out
  2. la politica della cache è utilizzata di recente.

Ho ragione?

In particolare, sto guardando i due comandi: freeevmstat

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

Dovresti darci più contesto, entrambi i termini sono usati con significati diversi. Ti riferisci freeall'output del comando?
leonbloy,

3
hai ragione, sto guardando i due comandi: gratuito, vmstat. vedi i miei aggiornamenti.
James.Xu,

1
Puoi anche visitare unix.stackexchange.com
leonbloy il

Risposte:


69

I "buffer" rappresentano la parte di RAM dedicata ai blocchi del disco cache. "Memorizzato nella cache" è simile a "Buffer", solo che questa volta memorizza nella cache le pagine dalla lettura dei file.

citazione da:


3
Ho provato questo usando un semplice programma Python che scrive grandi quantità di blocchi. Quello che succede è che cacheviene riempito come riportato da free -w -h, non la bufferscolonna. Penso che la cachecolonna contenga sia le scritture del disco sia le letture del disco e bufferssia usata per qualcos'altro.
CMCDragonkai,

@CMCDragonkai grazie per le prove sperimentali. La domanda interessante è se stavi scrivendo più velocemente di quanto il disco potesse scaricare. (ad es. la sincronizzazione richiederebbe molto tempo) che ci direbbe se i blocchi sporchi sono contati in modo diverso rispetto a quelli puliti. Linux memorizzerà sicuramente entrambi i tipi di cache (come indicato nella domanda) ma uno è molto più serio in termini di pressione della memoria.
Seth Robertson,

179

I buffer sono associati a un dispositivo a blocchi specifico e coprono la memorizzazione nella cache dei metadati del file system e il monitoraggio delle pagine in volo. La cache contiene solo dati di file parcheggiati. Cioè, i buffer ricordano cosa c'è nelle directory, quali sono i permessi dei file e tengono traccia di quale memoria viene scritta o letta per un particolare dispositivo a blocchi. La cache contiene solo il contenuto dei file stessi.

link preventivo


1
Breve e ben spiegato. Grazie.
curioso

84

Risposta citata (per riferimento):

Risposta breve: la cache è la dimensione della cache della pagina. Buffer è la dimensione dei buffer I / O del blocco in memoria. Questioni memorizzate nella cache; I buffer sono in gran parte irrilevanti.

Risposta lunga: cache è la dimensione della cache della pagina Linux, meno la memoria nella cache di swap, che è rappresentata da SwapCached (quindi la dimensione della cache della pagina totale è cache + SwapCached). Linux esegue tutti gli I / O dei file attraverso la cache della pagina. Le scritture vengono implementate semplicemente contrassegnando come sporche le pagine corrispondenti nella cache delle pagine; i fili del flusher quindi periodicamente riscrivono sul disco eventuali pagine sporche. Le letture vengono implementate restituendo i dati dalla cache della pagina; se i dati non sono ancora nella cache, vengono prima popolati. Su un moderno sistema Linux, la cache può essere facilmente di diversi gigabyte. Si restringerà solo in risposta alla pressione della memoria. Il sistema eliminerà la cache della pagina insieme allo scambio di dati sul disco per rendere disponibile più memoria, se necessario.

I buffer sono buffer di I / O a blocchi in memoria. Sono relativamente di breve durata. Prima della versione 2.4 del kernel di Linux, Linux aveva cache di pagina e buffer separate. Dalla versione 2.4, la cache della pagina e del buffer sono unificate e i buffer sono blocchi di dischi grezzi non rappresentati nella cache della pagina, ovvero non i dati del file. La metrica Buffer è quindi di minima importanza. Sulla maggior parte dei sistemi, i buffer sono spesso solo decine di megabyte.


7
"I buffer sono in gran parte irrilevanti" - No. Esistono molti casi in cui la memorizzazione nella cache del contenuto dei file è irrilevante, ma mantenere i metadati nella cache accelera le cose. Un server NAS di streaming video, ad esempio.
Gunther Piez,

Qualsiasi sistema che esegue un sacco di I / O utilizzerà molta memoria per i buffer. Sto caricando in massa un database MySQL / InnoDB da 100 GB e i buffer superano continuamente i 2 GB.
Marcelo Pacheco,

21

Non è "abbastanza" così semplice, ma potrebbe aiutare a capire:

Il buffer serve per la memorizzazione dei metadati dei file (permessi, posizione, ecc.). Ogni pagina di memoria viene tenuta traccia di qui.

La cache serve per archiviare il contenuto effettivo del file.


5
IOW, Buffer = Metadata; Cache = Data;
Freedom_Ben

13

Spiegato da RedHat :

Pagine della cache:

Una cache è la parte della memoria che archivia in modo trasparente i dati in modo che le future richieste per tali dati possano essere servite più velocemente. Questa memoria viene utilizzata dal kernel per memorizzare nella cache i dati del disco e migliorare le prestazioni di I / O.

Il kernel di Linux è costruito in modo tale da utilizzare quanta più RAM possibile per memorizzare nella cache informazioni dai file system e dai dischi locali e remoti. Man mano che il tempo passa su varie letture e scritture vengono eseguite sul sistema, il kernel cerca di conservare i dati archiviati nella memoria per i vari processi in esecuzione sul sistema o quelli dei processi rilevanti che verrebbero utilizzati nel prossimo futuro. La cache non viene recuperata nel momento in cui il processo ottiene l'arresto / uscita, tuttavia quando gli altri processi richiedono più memoria della memoria disponibile libera, il kernel eseguirà l'euristica per recuperare la memoria archiviando i dati della cache e allocando quella memoria a un nuovo processo.

Quando viene richiesto qualsiasi tipo di file / dati, il kernel cercherà una copia della parte del file su cui sta agendo l'utente e, se tale copia non esiste, allocherà una nuova pagina di memoria cache e la riempirà di il contenuto appropriato letto dal disco.

I dati archiviati in una cache potrebbero essere valori che sono stati calcolati in precedenza o duplicati di valori originali archiviati in altre parti del disco. Quando vengono richiesti alcuni dati, la cache viene prima controllata per vedere se contiene quei dati. I dati possono essere recuperati più rapidamente dalla cache che dalla sua origine di origine.

I segmenti di memoria condivisa SysV sono anche considerati come cache, sebbene non rappresentino alcun dato sui dischi. Si può verificare la dimensione dei segmenti di memoria condivisa usando il comando ipcs -m e controllando la colonna dei byte.

Buffer:

I buffer sono la rappresentazione a blocchi del disco dei dati archiviati nelle cache della pagina. Buffer contiene i metadati dei file / dati che risiedono nella cache della pagina. Esempio: quando c'è una richiesta di qualsiasi dato presente nella cache della pagina, prima il kernel controlla i dati nei buffer che contengono i metadati che puntano ai file / dati effettivi contenuti nella cache delle pagine. Una volta dai metadati è noto l'indirizzo di blocco effettivo del file, che viene raccolto dal kernel per l'elaborazione.


12

buffer e cache.

Un buffer è qualcosa che deve ancora essere "scritto" sul disco.

Una cache è qualcosa che è stata "letta" dal disco e memorizzata per un uso successivo.


2
nuovo suggerimento per l'utente: rendi la tua risposta il più chiara possibile correlata alla domanda. Se fossi in te, aggiungerei alla tua risposta una sezione che inizia con "Quindi, con il tuo esempio ..." e approfondire un po 'quello.
Piotr Wadas,

25
Non penso che questa risposta sia vera nello stesso contesto di quella della domanda (vale a dire, cosa significa il kernel Linux per "buffer" e "cache"
Freedom_Ben

8

Penso che questa pagina aiuterà a comprendere a fondo la differenza tra buffer e cache. http://www.tldp.org/LDP/sag/html/buffer-cache.html

La lettura da un disco è molto lenta rispetto all'accesso alla memoria (reale). Inoltre, è comune leggere più volte la stessa parte di un disco durante periodi di tempo relativamente brevi. Ad esempio, si potrebbe prima leggere un messaggio di posta elettronica, quindi leggere la lettera in un editor quando si risponde ad esso, quindi fare in modo che il programma di posta lo legga di nuovo quando lo si copia in una cartella. Oppure, considerare la frequenza con cui il comando lspuò essere eseguito su un sistema con molti utenti. Leggendo le informazioni dal disco una sola volta e quindi conservandole in memoria fino a quando non sono più necessarie, è possibile accelerare tutto tranne la prima lettura. Questo si chiama buffering del disco e la memoria utilizzata per lo scopo si chiama cache buffer.

Poiché la memoria è, sfortunatamente, una risorsa limitata, anzi, scarsa, la cache del buffer di solito non può essere abbastanza grande (non può contenere tutti i dati che si vogliono mai usare). Quando la cache si riempie, i dati non utilizzati da più tempo vengono eliminati e la memoria così liberata viene utilizzata per i nuovi dati.

Il buffering del disco funziona anche per le scritture. Da un lato, i dati scritti vengono spesso letti di nuovo presto (ad esempio, un file di codice sorgente viene salvato in un file, quindi letto dal compilatore), quindi è consigliabile inserire i dati scritti nella cache. D'altra parte, inserendo solo i dati nella cache, non scrivendoli sul disco contemporaneamente, il programma che scrive funziona più velocemente. Le scritture possono quindi essere eseguite in background, senza rallentare gli altri programmi.


Questo spiega cos'è la cache del buffer, ma non quale sia la differenza tra buffer e cache negli output di vmstat e comandi gratuiti.
Roel Schroeven,

4

Link 2 di Seth Robertson ha detto "Per una comprensione approfondita di questi termini, fare riferimento al libro del kernel Linux come Linux Kernel Development di Robert M. Love."

Ho trovato alcuni contenuti su "buffer" nella seconda edizione del libro.

Sebbene il dispositivo fisico stesso sia indirizzabile a livello settoriale, il kernel esegue tutte le operazioni del disco in termini di blocchi.

Quando un blocco viene archiviato in memoria (ad esempio, dopo una lettura o in attesa di una scrittura), viene memorizzato in un "buffer". Ogni 'buffer' è associato esattamente a un blocco. Il "buffer" funge da oggetto che rappresenta un blocco del disco in memoria.

Un 'buffer' è la rappresentazione in memoria di un singolo blocco del disco fisico.

Le operazioni di I / O del blocco manipolano un singolo blocco del disco alla volta. Un'operazione I / O a blocchi comune è la lettura e la scrittura di inode. Il kernel fornisce la funzione bread () per eseguire una lettura di basso livello di un singolo blocco dal disco. Tramite "buffer", i blocchi del disco sono associati alle pagine in memoria associate. "


2

Il buffer contiene metadati che aiutano a migliorare le prestazioni di scrittura

La cache contiene il contenuto del file stesso (a volte ancora da scrivere sul disco) che migliora le prestazioni di lettura


1

Citazione dal libro: Introduzione al recupero delle informazioni

nascondiglio

Vogliamo conservare il maggior numero possibile di dati in memoria, in particolare quei dati a cui dobbiamo accedere frequentemente. Chiamiamo la tecnica di mantenere i dati del disco utilizzati di frequente nella cache della memoria principale.

Buffer

I sistemi operativi generalmente leggono e scrivono interi blocchi. Pertanto, la lettura di un singolo byte dal disco può richiedere tanto tempo quanto la lettura dell'intero blocco. Le dimensioni dei blocchi di 8, 16, 32 e 64 kilobyte (KB) sono comuni. Chiamiamo la parte della memoria principale in cui un blocco letto o scritto è memorizzato un buffer.


0

Un buffer è una regione di memoria utilizzata per conservare temporaneamente i dati mentre vengono spostati da una posizione all'altra all'interno di un computer. Mentre una cache è un'area di archiviazione temporanea in cui i dati a cui si accede frequentemente possono essere archiviati per un accesso rapido. Una volta archiviati i dati nella cache, è possibile utilizzarli in futuro accedendo alla copia memorizzata nella cache anziché recuperare nuovamente i dati originali, in modo da ridurre il tempo medio di accesso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.