In Linux, qual è la differenza tra "buffer" e "cache" segnalata dal comando gratuito?


74

Questa è una vecchia domanda che ho visto di volta in volta. La mia comprensione è piuttosto limitata (avendo letto delle differenze molto tempo fa, ma i factoidi coinvolti non sono mai rimasti bloccati).

A quanto ho capito,

  • buffer

    Sono utilizzati da programmi con operazioni di I / O attive, ovvero dati in attesa di essere scritti su disco

  • nascondiglio

    È il risultato di operazioni di I / O completate, ad esempio buffer che sono stati scaricati o dati letti dal disco per soddisfare una richiesta.

Posso avere una chiara spiegazione per i posteri?



È più simile ai metadati che trovi nei buffer, non è correlato agli io buffer. Alcuni buffer del kernel sono contabilizzati nell'allocatore slab ma non contano affatto per i buffer o la memoria cache.
Controlla il

Risposte:


42

Il totale "memorizzato nella cache" includerà anche alcune altre allocazioni di memoria, come qualsiasi file system tmpfs. Per vederlo in effetti prova:

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

e vedrai il valore di "cache" scendere di 100Mb che hai copiato nel filesystem basato su ram (supponendo che ci fosse abbastanza RAM libera, potresti trovarne un po 'finito in swap se la macchina è già impegnata eccessivamente in termini di uso della memoria). Il "sync; echo 3> / proc / sys / vm / drop_caches" prima di ogni chiamata gratuita dovrebbe scrivere qualsiasi cosa in sospeso in tutti i buffer di scrittura (la sincronizzazione) e cancellare tutti i blocchi del disco memorizzati nella cache / buffer dalla memoria in modo che liberi siano solo altri allocazioni nel valore "memorizzato nella cache".

La RAM utilizzata dalle macchine virtuali (come quelle in esecuzione su VMWare) può anche essere conteggiata nel valore "cache" gratuito, così come la RAM utilizzata dai file mappati in memoria attualmente aperti (questo varierà a seconda dell'hypervisor / versione che si sta utilizzando e eventualmente anche tra le versioni del kernel).

Quindi non è così semplice come "i conteggi dei buffer in attesa di scritture di file / rete e conteggi cache blocchi di lettura / scrittura recentemente conservati nella RAM per salvare future letture fisiche", sebbene per molti scopi questa descrizione più semplice lo farà.


1
+1 per sfumature interessanti. Questo è il tipo di informazioni che sto cercando. In effetti, sospetto che le cifre siano così contorte, così coinvolte in così tante attività diverse, che nel migliore dei casi sono indicatori generali.
Avery Payne,

Non credo che la RAM utilizzata dalle macchine virtuali sia considerata come "cache", almeno per qemu-kvm. Ho notato che sul mio host KVM, il valore della cache non è solo troppo piccolo per essere corretto (a 1,9 Gig), ma non cambia se distruggo / avvio una delle mie macchine virtuali. Inoltre, non cambia se eseguo il trucco di montaggio di tmpfs su una delle macchine virtuali. Ho creato una partizione tmpfs 800Meg lì e "memorizzato nella cache" ha mostrato i valori corretti sulla VM ma non è cambiato sull'host VM. Ma il valore "usato" si è ridotto / cresciuto quando ho distrutto / avviato la mia macchina virtuale.
Mike S,

... Ho eseguito dei test su un host VM Centos 7.2.1511 con kernel 3.10.0-327.
Mike S,

@MikeS: il modo in cui le diverse soluzioni di virtualizzazione gestiscono la memoria può variare, infatti il ​​modo in cui il kernel misura vari usi della memoria può cambiare tra le versioni principali.
David Spillett,

@MikeS: per quanto riguarda "esegui il trucco di montaggio di tmpfs su una delle macchine virtuali" - I che non influirà sulle letture dell'host se non mostrano altri mem utilizzati dalla macchina virtuale. Vedo l'effetto in una stessa macchina virtuale KVM: prima di dd free = 2020, dopo dd free = 1899, dopo drop fs free = 2001 (la differenza di 19 Mb sarà dovuta ad altri processi sulla VM, non era inattivo quando ho eseguito il test). L'host potrebbe non vedere la modifica: probabilmente la memoria è ancora allocata alla VM anche se è gratuita per l'uso da parte dei processi nella VM.
David Spillett,


5

Stavo cercando una descrizione più chiara del buffer e l'ho trovato in "Professional Linux® Kernel Architecture 2008"

Capitolo 16: Pagina e cache buffer

Interazione

L'impostazione di un collegamento tra pagine e buffer ha pochi scopi se non ci sono benefici per altre parti del kernel. Come già notato, potrebbe essere necessario eseguire alcune operazioni di trasferimento da e verso dispositivi a blocchi in unità le cui dimensioni dipendono dalla dimensione del blocco dei dispositivi sottostanti, mentre molte parti del kernel preferiscono eseguire operazioni di I / O con granularità della pagina in quanto rende le cose molto più semplici, soprattutto in termini di gestione della memoria. In questo scenario, i buffer agiscono come intermediari tra i due mondi.


3

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, per prima cosa 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.


2

Liberare buffer / cache

Avvertenza Questo spiega un metodo efficace non raccomandato sul server di produzione! Quindi sei avvisato, non incolparmi se qualcosa va storto.

Per quanto riguarda la cosa, potresti forzare il tuo sistema a delegare cachequanta più memoria possibile per eliminare il file memorizzato nella cache:

Preambolo

Prima di fare il test, potresti aprire un'altra finestra un colpo:

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

per seguire l'evoluzione dello swap in tempo reale.

Nota: è necessario disporre di altrettanti dischi liberi nella directory corrente, è necessario mem + swap

La 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, l'host su cui ho fatto questo è fortemente utilizzato. Ciò sarà più significativo su una macchina molto silenziosa.


1
-1 se potessi. Ciò è (A) irrilevante per la domanda posta e (B) un modo orribilmente schietto di innescare la cancellazione della cache. Esistono modi diretti per eseguire quest'ultimo, quindi non è difensibile indurre il sistema a rispettare lo spamming con i dati fino a quando non si scarica come effetto collaterale
underscore_d

Oh mio Dio! Per favore, non farlo mai su server reali!
Tamerlaha,

@Tamerlaha Sono d'accordo, ma per favore rileggi il primo paragrafo: sei avvisato, non incolpare me ! L'obiettivo di ciò è mostrare le implicazioni del buffer / cache.
F. Hauri,
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.