Come svuotare i buffer e la cache su un sistema Linux?


315

Prima di fare qualche benchmarking come si libererebbe la memoria (RAM) che il kernel Linux sta consumando per i suoi buffer e cache?


Si noti che questo è utile soprattutto per il benchmarking. Svuotare i buffer e la cache riduce le prestazioni! Se sei qui perché pensavi che liberare buffer e cache fosse una cosa positiva, vai a leggere Linux ha mangiato la mia RAM! . La breve storia: la memoria libera è memoria inutilizzata è memoria sprecata .


1
Qual è l'interesse per la domanda e la risposta aperte duplici? unix.stackexchange.com/questions/58553/… & unix.stackexchange.com/questions/17936/…
innocent-world

1
@ innocent-world - non li ho mai visti mentre stavo cercando, quindi sembrava essere un buco nella knowledge base su questo sito e cercavo di riempirlo.
slm

2
@ innocent-world - guardando quelle 2 domande, penso che ci sia ancora spazio per queste domande e risposte. Questo funge da domande e risposte canoniche sul sito. Questi sono abbastanza specifici in ciò a cui si stanno rivolgendo. Inoltre, questo mostra informazioni sull'analisi dei buffer e della cache e su come impostare i parametri usando sudo. Nessuna delle altre 2 domande affronta nessuna di queste questioni.
slm

Si prega di leggere questo articolo linuxatemyram.com Se si comprende il rischio, è possibile eseguire gratuitamente && sync && echo 3> / proc / sys / vm / drop_caches && free

Risposte:


491

Svuotare la cache dei buffer

Se mai vuoi svuotarlo puoi usare questa catena di comandi.

# free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

È possibile segnalare al kernel Linux di eliminare vari aspetti degli elementi memorizzati nella cache modificando l'argomento numerico con il comando precedente.

  • Per liberare pagecache:

    # echo 1 > /proc/sys/vm/drop_caches
    
  • Per liberare dentisti e inode:

    # echo 2 > /proc/sys/vm/drop_caches
    
  • Per liberare pagecache, dentries e inode:

    # echo 3 > /proc/sys/vm/drop_caches
    

Quanto sopra è pensato per essere eseguito come root. Se stai provando a farli usando sudoallora dovrai cambiare leggermente la sintassi in qualcosa del genere:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'

NOTA: c'è una versione più esoterica del comando sopra se ti interessa:

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

Perché il cambiamento nella sintassi? Il /bin/echoprogramma è in esecuzione come root, a causa di sudo, ma la shell che reindirizza l'output dell'eco al file solo root è ancora in esecuzione come te. La shell corrente esegue il reindirizzamento prima dell'inizio sudo .

Vedere cosa c'è nei buffer e nella cache

Dai un'occhiata linux-ftoolsse desideri analizzare il contenuto dei buffer e della cache. In particolare, se desideri vedere quali file sono attualmente memorizzati nella cache.

fincore

Con questo strumento puoi vedere quali file vengono memorizzati nella cache in una directory di dati.

fincore [options] files...

  --pages=false      Do not print pages
  --summarize        When comparing multiple files, print a summary report
  --only-cached      Only print stats for files that are actually in cache.

Ad esempio /var/lib/mysql/blogindex:

root@xxxxxx:/var/lib/mysql/blogindex# fincore --pages=false --summarize --only-cached * 
stats for CLUSTER_LOG_2010_05_21.MYI: file size=93840384 , total pages=22910 , cached pages=1 , cached size=4096, cached perc=0.004365 
stats for CLUSTER_LOG_2010_05_22.MYI: file size=417792 , total pages=102 , cached pages=1 , cached size=4096, cached perc=0.980392 
stats for CLUSTER_LOG_2010_05_23.MYI: file size=826368 , total pages=201 , cached pages=1 , cached size=4096, cached perc=0.497512 
stats for CLUSTER_LOG_2010_05_24.MYI: file size=192512 , total pages=47 , cached pages=1 , cached size=4096, cached perc=2.127660 
stats for CLUSTER_LOG_2010_06_03.MYI: file size=345088 , total pages=84 , cached pages=43 , cached size=176128, cached perc=51.190476 
stats for CLUSTER_LOG_2010_06_04.MYD: file size=1478552 , total pages=360 , cached pages=97 , cached size=397312, cached perc=26.944444 
stats for CLUSTER_LOG_2010_06_04.MYI: file size=205824 , total pages=50 , cached pages=29 , cached size=118784, cached perc=58.000000 
stats for COMMENT_CONTENT_2010_06_03.MYI: file size=100051968 , total pages=24426 , cached pages=10253 , cached size=41996288, cached perc=41.975764 
stats for COMMENT_CONTENT_2010_06_04.MYD: file size=716369644 , total pages=174894 , cached pages=79821 , cached size=326946816, cached perc=45.639645 
stats for COMMENT_CONTENT_2010_06_04.MYI: file size=56832000 , total pages=13875 , cached pages=5365 , cached size=21975040, cached perc=38.666667 
stats for FEED_CONTENT_2010_06_03.MYI: file size=1001518080 , total pages=244511 , cached pages=98975 , cached size=405401600, cached perc=40.478751 
stats for FEED_CONTENT_2010_06_04.MYD: file size=9206385684 , total pages=2247652 , cached pages=1018661 , cached size=4172435456, cached perc=45.321117 
stats for FEED_CONTENT_2010_06_04.MYI: file size=638005248 , total pages=155763 , cached pages=52912 , cached size=216727552, cached perc=33.969556 
stats for FEED_CONTENT_2010_06_04.frm: file size=9840 , total pages=2 , cached pages=3 , cached size=12288, cached perc=150.000000 
stats for PERMALINK_CONTENT_2010_06_03.MYI: file size=1035290624 , total pages=252756 , cached pages=108563 , cached size=444674048, cached perc=42.951700 
stats for PERMALINK_CONTENT_2010_06_04.MYD: file size=55619712720 , total pages=13579031 , cached pages=6590322 , cached size=26993958912, cached perc=48.533080 
stats for PERMALINK_CONTENT_2010_06_04.MYI: file size=659397632 , total pages=160985 , cached pages=54304 , cached size=222429184, cached perc=33.732335 
stats for PERMALINK_CONTENT_2010_06_04.frm: file size=10156 , total pages=2 , cached pages=3 , cached size=12288, cached perc=150.000000 
---
total cached size: 32847278080

Con l'output sopra puoi vedere che ci sono molti file * .MYD, * .MYI e * .frm che sono attualmente in cache.

Scambiare

Se si desidera cancellare lo swap è possibile utilizzare i seguenti comandi.

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7298164     689328          0      30416     457936
-/+ buffers/cache:    6809812    1177680
Swap:      5963772     609452    5354320

Quindi utilizzare questo comando per disabilitare lo scambio:

$ swapoff -a

Puoi confermare che ora è vuoto:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7777912     209580          0      39332     489864
-/+ buffers/cache:    7248716     738776
Swap:            0          0          0

E per riattivarlo:

$ swapon -a

E ora riconfermare con free:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7785572     201920          0      41556     491508
-/+ buffers/cache:    7252508     734984
Swap:      5963772          0    5963772

13
non ho mai sentito parlare di linux-ftools dopo così tanti anni, sebbene sapessi come eliminare la cache. sei davvero un guru. Grazie per la condivisione!
johnshen64,

5
Le cose che dici sulla sincronizzazione sono sbagliate: secondo il documento di Linux, scrivere su drop_cache cancellerà solo il contenuto pulito (già sincronizzato). Inoltre, anche se rilascia dati non sincronizzati, dire che digitando il comando di sincronizzazione appena prima di cancellare la cache salverebbe i tuoi dati è sbagliato: c'è un tempo diverso da zero tra il comando di sincronizzazione drop_cache write, quindi tutti i dati potrebbero essere aggiunti durante questo lasso di tempo. Non c'è nulla di atomico qui.
Congelli501,

3
Ho avuto queste informazioni qui: kernel.org/doc/Documentation/sysctl/vm.txt - "Questa è un'operazione non distruttiva e non libererà alcun oggetto sporco". Dice anche che la sincronizzazione potrebbe essere utilizzata per aumentare la dimensione della cache rilasciata (per le cache di writeback).
Congelli501,

26
Preferisci "sudo sysctl vm.drop_caches = 1" rispetto a "sudo sh -c 'echo 1> / proc / sys / vm / drop_caches'"
Raúl Salinas-Monteagudo

8
@slm mi piace usare teeper scrivere come root:echo 3 | sudo tee /proc/sys/vm/drop-caches
pqnet il
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.