GNU/Linux >> Linux Esercitazione >  >> Linux

In Linux, qual è la differenza tra buffer e cache segnalati dal comando free?

Soluzione 1:

Il totale "memorizzato nella cache" includerà anche alcune altre allocazioni di memoria, come qualsiasi file system tmpfs. Per vedere questo 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 "cache" diminuire dei 100 Mb che hai copiato nel filesystem basato su ram (supponendo che ci fosse abbastanza RAM libera, potresti scoprire che parte di essa è finita in swap se la macchina è già impegnata in eccesso in termini dell'uso della memoria). Il "sync; echo 3> /proc/sys/vm/drop_caches" prima di ogni chiamata a free dovrebbe scrivere qualsiasi cosa in sospeso in tutti i buffer di scrittura (la sincronizzazione) e cancellare tutti i blocchi del disco memorizzati nella cache/buffered dalla memoria, quindi free leggerà solo altro allocazioni nel valore "memorizzato nella cache".

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

Quindi non è così semplice come "i buffer contano le scritture di file/rete in attesa e i conteggi memorizzati nella cache contano i blocchi letti/scritti di recente conservati nella RAM per salvare future letture fisiche", anche se per la maggior parte degli scopi questa descrizione più semplice andrà bene.

Soluzione 2:

Domanda a trabocchetto. Quando calcoli lo spazio libero devi effettivamente sommare buffer e cache entrambi. Questo è quello che sono riuscito a trovare

Un buffer è qualcosa che deve ancora essere "scritto" su disco. Una cache è qualcosa che è stato "letto" dal disco e memorizzato per un uso successivo.

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

Soluzione 3:

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

Capitolo 16:Pagine e Buffer Cache

Interazione

Impostare un collegamento tra pagine e buffer serve a poco se non ci sono vantaggi per altre parti del kernel. Come già notato, alcune operazioni di trasferimento da e verso dispositivi a blocchi potrebbero dover essere eseguite in unità la cui dimensione dipende dalla dimensione del blocco dei dispositivi sottostanti, mentre molte parti del kernel preferiscono eseguire operazioni di I/O con granularità di pagina poiché questo rende le cose molto più semplici - soprattutto in termini di gestione della memoria. In questo scenario, i buffer fungono da intermediari tra i due mondi.

Soluzione 4:

Spiegato da RedHat :

Cache Pagine:

Una cache è la parte della memoria che memorizza in modo trasparente i dati in modo che le future richieste di 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 Linux è costruito in modo tale da utilizzare quanta più RAM possibile per memorizzare nella cache le informazioni dai file system e dai dischi locali e remoti. Con il passare del tempo vengono eseguite varie letture e scritture sul sistema, il kernel cerca di mantenere i dati archiviati nella memoria per i vari processi in esecuzione sul sistema o i dati dei processi rilevanti che verrebbero utilizzati nel prossimo futuro. La cache non viene recuperata nel momento in cui il processo viene interrotto/chiuso, tuttavia quando gli altri processi richiedono più memoria rispetto alla memoria libera disponibile, il kernel eseguirà l'euristica per recuperare la memoria memorizzando i dati della cache e allocando quella memoria al nuovo processo.

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

I dati archiviati all'interno di una cache potrebbero essere valori che sono stati calcolati in precedenza o duplicati di valori originali archiviati altrove nel 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.

Anche i segmenti di memoria condivisa SysV sono considerati una cache, sebbene non rappresentino alcun dato sui dischi. Si può controllare 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 delle pagine. I buffer contengono 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 a i file/dati effettivi contenuti nelle cache delle pagine. Una volta che dai metadati è noto l'effettivo indirizzo di blocco del file, questo viene prelevato dal kernel per l'elaborazione.

Soluzione 5:

Liberazione buffer/cache

Avviso Questo spiega un metodo forte non raccomandato sul server di produzione! Quindi sei avvisato, non incolpare me se qualcosa va storto.

Per capire, la cosa, potresti forzare il tuo sistema per delegare quanta più memoria possibile a cache piuttosto che eliminare il file memorizzato nella cache:

Preambolo

Prima di fare il test, puoi 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: Devi disporre di tanti dischi liberi nella directory corrente, hai 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 l'ho fatto è molto utilizzato. Questo sarà più significativo su una macchina davvero silenziosa.


Linux
  1. Come eliminare i buffer di memoria e la cache in Linux

  2. Qual è la differenza tra memoria buffer e cache in Linux?

  3. Qual è la differenza tra "trova" e "trova" in Linux?

  4. Qual è la differenza tra &> e >&in bash?

  5. Qual è la differenza tra Unix, Linux, BSD e GNU?

Qual ​​è la differenza tra i kernel macOS e Linux

Qual è la differenza tra Linux e Unix?

Qual è la differenza tra Rsync e BTRFS in Linux?

Qual è la differenza tra il comando apt e apt-get?

Qual è la differenza tra i comandi kill e killall?

Qual è la differenza tra DMA e IO mappato in memoria?