Perché rilasciare cache in Linux?


84

Nei nostri server abbiamo l'abitudine di far cadere le cache a mezzanotte.

sync; echo 3 > /proc/sys/vm/drop_caches

Quando eseguo il codice sembra liberare molta RAM, ma devo davvero farlo. La RAM libera non è uno spreco?


62
Trova la persona che l'ha inserito e chiedigli perché lo ha fatto. Come hai indovinato correttamente, non c'è una buona ragione evidente per questo.
Michael Hampton

10
Debug del kernel. Questo è tutto. Questo in realtà non libera alcuna RAM; rilascia cache, come suggerisce il nome, e quindi riduce le prestazioni.
Michael Hampton

28
@ivcode Quindi dovresti trovare e risolvere il problema con quel server piuttosto che cercare di evitare le condizioni che lo causano. Se la mia auto si è fermata ogni volta che ho fatto una curva a destra, evitare una brusca curva a destra è una pessima soluzione.
David Schwartz,

7
Related thedailywtf.com/Articles/Modern-Memory-Management.aspx Sostenere fermamente che è una cattiva idea.
Drunix,

7
Correlato e una descrizione utile del "problema": linuxatemyram.com
Bill Weiss,

Risposte:


86

Hai ragione al 100%. E ' non è una buona pratica per liberare la RAM. Questo è probabilmente un esempio di amministrazione del sistema di culto delle merci.


9
+1 per menzionare l'amministrazione del sistema di Cargo Cult. Qualsiasi amministratore di sistema che non conosca quel termine e che cosa significhi dovrebbe essere licenziato.
Tonny,

8
@Tonny: Saremmo rimasti senza dipartimento di amministratore di sistema quindi :(
PlasmaHH,

2
Come la maggior parte dell'umanità, adoro le affermazioni sfacciate con molta approvazione, ma una citazione o un ragionamento guadagnerebbero il +1 del mio super-io.
Aaron Hall,

2
Spiega l'amministrazione del culto delle merci, così come sopra, se non ti dispiace. Forse in una modifica successiva? Sto ancora trattenendo il mio +1 ...: P
Aaron Hall

2
"è possibile che, sebbene l'applicazione non stia utilizzando questa RAM, ma Linux sta eseguendo la memorizzazione nella cache in modo aggressivo nella sua memoria e anche se l'applicazione ha bisogno di memoria, non libererà parte di questa cache ma preferirebbe iniziare a scambiare". Non molto specifico In pratica, la gestione della memoria non è perfetta e avere una manopola da ruotare quando si presenta l'imperfezione è una buona cosa.
Dan Pritts,

62

Sì, la cancellazione della cache libera la RAM, ma fa sì che il kernel cerchi i file sul disco piuttosto che nella cache, il che può causare problemi di prestazioni.

Normalmente il kernel svuota la cache quando la RAM disponibile è esaurita. Scrive spesso il contenuto sporco sul disco usando pdflush.


20
+1 per spiegare perché è una cattiva idea.
Ogre Salmo33,

35

Il motivo per eliminare le cache in questo modo è per il benchmark delle prestazioni del disco ed è l'unica ragione per cui esiste.

Quando si esegue un benchmark ad alta intensità di I / O, si desidera essere sicuri che le varie impostazioni che si eseguono eseguano effettivamente l'I / O su disco, quindi Linux consente di eliminare le cache anziché eseguire un riavvio completo.

Per citare dalla documentazione :

Questo file non è un mezzo per controllare la crescita delle varie cache del kernel (inode, dentries, pagecache, ecc ...). Questi oggetti vengono automaticamente recuperati dal kernel quando è necessaria memoria altrove nel sistema.

L'uso di questo file può causare problemi di prestazioni. Dal momento che elimina gli oggetti memorizzati nella cache, può costare una quantità significativa di I / O e CPU per ricreare gli oggetti rilasciati, soprattutto se erano in uso intenso. Per questo motivo, si sconsiglia l'utilizzo al di fuori di un ambiente di test o di debug.


Naturalmente, a seconda di ciò che si sta tentando di fare, anche un riavvio completo potrebbe non cancellare a sufficienza la cache del disco.
un CVn del

1
"Questi oggetti vengono automaticamente recuperati dal kernel quando è necessaria memoria" è l'obiettivo del progetto, ma potrebbe non essere sempre il comportamento reale.
Dan Pritts,

@DanPritts Cosa ti fa pensare esattamente che non sia così?
Joe,

2
Il caso ovvio è quando si desidera cancellare la RAM per consentire l'allocazione di più hugepage (non trasparenti); un altro caso è rappresentato dai bug di pausa della raccolta dei rifiuti hugepage trasparenti (vedere la mia risposta / commenti altrove su questa domanda). Ma il mio commento era destinato al caso generale. A volte le persone che gestiscono il sistema conoscono meglio delle persone che lo hanno progettato / implementato. Spesso no - questo è ciò che il loro commento sta cercando di proteggere. Sono contento che il
Dan Pritts il

26

L'idea di base qui probabilmente non è poi così male (solo molto ingenua e fuorviante): potrebbero esserci dei file in cache, che è molto improbabile che possano essere raggiunti nel prossimo futuro, ad esempio i file di registro. Questi ram "divorati", che in seguito dovranno essere liberati dal sistema operativo in un modo o nell'altro.

A seconda delle impostazioni di swappiness, modello di accesso ai file, modello di allocazione della memoria e molte altre cose imprevedibili, può accadere che quando non si liberano queste cache, saranno successivamente costretti a essere riutilizzati, il che richiede un po 'più di tempo rispetto a allocare memoria dal pool di memoria non utilizzata. Nel peggiore dei casi, le impostazioni di swappiness di Linux causeranno lo scambio della memoria del programma, perché Linux pensa che questi file potrebbero essere più probabili da usare nel prossimo futuro rispetto alla memoria del programma.

Nel mio ambiente, Linux ipotizza abbastanza spesso di sbagliare, e all'inizio della maggior parte dei server di borsa valori europei (intorno alle 0900 ora locale) inizieranno a fare cose che fanno solo una volta al giorno, necessitando di scambiare memoria precedentemente scambiata perché scrivendo i file di log, la compressione, la copia, ecc. stavano riempiendo la cache al punto in cui le cose dovevano essere scambiate.

Ma la memorizzazione nella cache è la soluzione a questo problema? sicuramente no. Quale sarebbe la soluzione qui è dire a Linux ciò che non sa: che probabilmente questi file non verranno più utilizzati. Questo può essere fatto dall'applicazione di scrittura usando cose come posix_fadvise()o usando uno strumento cmd line vmtouch(che può anche essere usato per esaminare cose e file di cache).

In questo modo è possibile rimuovere i dati non più necessari dalle cache e conservare gli elementi che devono essere memorizzati nella cache, poiché quando si rilasciano tutte le cache, è necessario rileggere molte cose dal disco. E quello nel momento peggiore possibile: quando è necessario; causando ritardi nell'applicazione che sono evidenti e spesso inaccettabili.

Quello che dovresti avere in atto è un sistema che monitora i tuoi schemi di utilizzo della memoria (ad esempio se qualcosa sta cambiando) e quindi analizzarli di conseguenza e agire di conseguenza. La soluzione potrebbe essere quella di eliminare alcuni file di grandi dimensioni alla fine della giornata usando vtouch; potrebbe anche essere quello di aggiungere più RAM perché l'utilizzo di picco giornaliero del server è proprio questo.


Tutte le app sul mio server sono in esecuzione su Nohup. Forse nohup.out viene memorizzato nella cache e sta esaurendo la memoria?
ivcode

@ivcode: questo potrebbe essere un motivo, controlla quanto è grande nohup.out. Forse usa vmtouch per capire quanto viene memorizzato nella cache.
PlasmaHH,

Ho un lavoro cron su cat /dev/null > path/nohup.outogni 15 minuti poiché nohup.out sta crescendo rapidamente. Forse Linux sta memorizzando nella cache nohup.out anche se lo sto cancellando
ivcode

5
@ivcode Se non hai bisogno dell'output nohup, dovresti reindirizzarlo a /dev/null. Sembra che ad un certo punto tu abbia avuto amministratori di sistema molto inesperti che lavoravano sui tuoi sistemi. Vedi stackoverflow.com/questions/10408816/… per come indirizzare nohupl'output a/dev/null
David Wilkins,

sebbene nohup.out venga cancellato a intervalli di 15 minuti, se il processo delle app viene interrotto per qualche motivo, nohup.out verrà automaticamente sottoposto a backup da un altro script. ho provato vmtouch. è davvero un ottimo strumento
ivcode

16

Ho visto che le cache di rilascio sono utili quando si avvia un gruppo di macchine virtuali. O qualsiasi altra cosa che utilizza pagine di grandi dimensioni come alcuni server di database.

Le pagine di grandi dimensioni in Linux devono spesso deframmentare la RAM per trovare 2 MB di RAM fisica contigua da inserire in una pagina. Liberare tutta la cache dei file rende questo processo molto semplice.

Ma sono d'accordo con la maggior parte delle altre risposte in quanto non esiste un motivo generalmente valido per eliminare la cache dei file ogni notte.


1
Ho votato a favore del fatto che il pregiudizio del secondo ordine è la risposta alla caduta delle cache.
Noah Spurrier,

1
Inoltre, nelle applicazioni HPC su nodi ad alta memoria (1Tb), la lettura di alcuni file di grandi dimensioni comporta una notevole quantità di memoria memorizzata nella cache. Poiché molte applicazioni HPC eseguono malloc di centinaia di GB, il sistema può bloccarsi per ore mentre i processi di migrazione spostano inutilmente piccoli frammenti di memoria frammentata sui nodi NUMA una volta che il sistema raggiunge il "bordo" della memoria cache. Peggio ancora, nulla che tu possa fare nella zona utente per liberare le cache se non ingannare il sistema nell'allocare tutti i piccoli blocchi da 2 MB che può rilasciare contemporaneamente, lasciando che la deframmentazione hugepaged e le app funzionino normalmente.
user1649948

+1 Il comando per creare pagine di grandi dimensioni ( sysctl -w vm.nr_hugepages=...) si rifiuta persino di funzionare a meno che io non abbia prima lasciato cadere le cache (Arch Linux).
Aleksandr Dubinsky,

8

È possibile che questo sia stato istituito come un modo per stabilizzare il sistema quando non c'era nessuno con le capacità o l'esperienza per trovare effettivamente il problema.

Liberare risorse

La caduta delle cache essenzialmente libererà alcune risorse, ma ciò ha un effetto collaterale nel rendere il sistema effettivamente più duro nel fare ciò che sta cercando di fare. Se il sistema sta eseguendo lo swap (tentando di leggere e scrivere da una partizione di swap su disco più velocemente di quanto non sia effettivamente in grado), la caduta periodica delle cache può alleviare il sintomo , ma non fa nulla per curare la causa .

Cosa sta divorando la memoria?

È necessario determinare cosa sta causando molto consumo di memoria che fa sembrare che la caduta delle cache funzioni. Ciò può essere causato da un numero qualsiasi di processi server mal configurati o semplicemente erroneamente utilizzati. Ad esempio, su un server ho assistito al massimo utilizzo della memoria quando un sito Web Magento ha raggiunto un determinato numero di visitatori in un intervallo di 15 minuti. Ciò è stato causato dalla configurazione di Apache per consentire l'esecuzione simultanea di troppi processi. Troppi processi, usando molta memoria (Magento è una bestia a volte) = scambio.

Linea di fondo

Non dare per scontato che sia qualcosa di necessario. Siate proattivi nel scoprire perché è lì, abbiate il coraggio di disabilitarlo se altri suggeriscono che è sbagliato e osservate il sistema - imparate qual è il vero problema e risolvetelo.


4

Linux / m68k in realtà ha un bug del kernel che fa impazzire kswapd e consuma il 100% di CPU (50% se c'è qualche altra attività legata alla CPU, come un autobuilder di pacchetti binari Debian - vulgo buildd - già in esecuzione), che può (la maggior parte del tempo; non sempre) essere mitigato eseguendo questo particolare comando ogni poche ore.

Detto questo ... il tuo server probabilmente non è un sistema m68k (Atari, Amiga, Macintosh classico, VME, Q40 / Q60, Sun3) ;-)

In questo caso, la persona che ha messo in riga o ha seguito alcuni consigli discutibili o, nella migliore delle ipotesi, obsoleti, o ha avuto l'idea di come la RAM dovrebbe essere utilizzata in modo errato (il pensiero moderno dice effettivamente "la RAM libera è spreco di RAM" e suggerisce la memorizzazione nella cache) o "scoperto" che questo "risolve" [sic!] un altro problema altrove (ed era troppo pigro per cercare una soluzione corretta).


"un bug del kernel che fa impazzire kswapd" - Quale bug è questo?
Ben

@Ben vedi questa discussione (questo messaggio e un paio di follow-up, uno dei quali include un'ipotesi da dove potrebbe provenire)
mirabilos

1
Sto riscontrando un problema simile (anche se è x86_64) e l'unica soluzione in questo momento è eliminare le cache serverfault.com/questions/740790/…
Fernando

2
@Fernando Ho un cronjob "drop caches" anche sul m68k box
mir

3

Un motivo potrebbe essere che il sito sta eseguendo una sorta di monitoraggio, che controlla la quantità di RAM libera e invia un avviso agli amministratori quando la RAM libera scende al di sotto di una certa percentuale. Se quello strumento di monitoraggio è abbastanza stupido da non includere la cache nel calcolo ram gratuito, potrebbe inviare falsi avvisi; svuotare regolarmente la cache potrebbe sopprimere questi avvisi, pur consentendo allo strumento di notare quando il RAM "reale" si sta esaurendo.

Naturalmente, in questo tipo di situazione, la vera soluzione è quella di modificare lo strumento di monitoraggio per includere la cache nel calcolo ram gratuito; pulire la cache è solo una soluzione alternativa, e anche una cattiva, perché la cache si riempirà rapidamente quando i processi accedono al disco.

Quindi, anche se la mia ipotesi è vera, la pulizia della cache non ha senso, è piuttosto una soluzione alternativa da parte di qualcuno che non è abbastanza competente per risolvere il problema principale.


3

Mi viene in mente un motivo plausibile per farlo in un lavoro cron notturno.

Su un sistema di grandi dimensioni, può essere utile eliminare periodicamente le cache in modo da poter rimuovere la frammentazione della memoria.

Il supporto trasparente hugepage del kernel esegue una scansione periodica della memoria per fondere piccole pagine in hugepage. In condizioni degenerate ciò può comportare pause di sistema di un minuto o due (la mia esperienza con questo è stata in RHEL6; si spera che sia migliorata). La caduta delle cache può consentire alla spazzatrice di hugepage di avere un po 'di spazio su cui lavorare.

Potresti sostenere che questa è una buona ragione per disabilitare gli hugepage trasparenti; OTOH potresti credere che valga la pena avere il miglioramento complessivo delle prestazioni da hugepage trasparenti e vale la pena pagare il prezzo della perdita della cache una volta al giorno.


Ho pensato a un'altra ragione per cui vorresti farlo, anche se non in un lavoro cron. Proprio prima che un sistema di virtualizzazione migra una VM su un nuovo hardware sarebbe un ottimo momento per questo. Meno contenuto di memoria da copiare nel nuovo host. Dovrai eventualmente leggere dalla memoria, invece, ovviamente, ma probabilmente prenderei quel compromesso.

Non so se qualcuno dei software virt lo faccia davvero.


1
Hai qualche fonte per questo? Sembra qualcosa che dovrebbe essere risolto nel kernel se è un tale problema.
gparent

3
Ho esperienza personale con le pause con hugepages trasparenti. RHEL6, Dell R810, 4CPU, 64 GB di RAM. La disabilitazione di hugepage trasparenti (c'è un file / proc per farlo) risolve immediatamente le pause. Non ho provato la tecnica di rilascio della cache in quel momento; invece ho riconfigurato le nostre app java per utilizzare hugepage non trasparenti e ho lasciato gli hugepage trasparenti disabilitati. IIRC, abbiamo esaminato la situazione abbastanza da renderci conto che non eravamo le uniche persone colpite e che Red Hat era a conoscenza del problema.
Dan Pritts,

Ciao Dan, ho constatato lo stesso comportamento sul mio server. Lavoro, con un'enorme quantità di dati, e c'è una drastica riduzione delle prestazioni dopo oltre 10 calcoli di uno stesso programma Python (x2-3 del primo tempo di calcolo). Se do un'occhiata, la dimensione della cache di memoria è enorme, 100 + GB. E se svuoto questa cache di memoria e rieseguo il mio programma, ottengo il tempo di calcolo iniziale. Hai qualche documento o informazione da condividere su questo fenomeno? Grazie.
Axel Borja,

1
access.redhat.com/solutions/46111 lo descrive. Puoi disabilitare hugepage trasparenti per vedere se questo è il problema nel tuo caso.
Dan Pritts,

2

Solo per aggiungere i miei due centesimi: il sistema sa benissimo che queste pagine di memoria sono cache e scenderanno quanto necessario quando un'applicazione richiede memoria.

Un'impostazione pertinente è /proc/sys/vm/swappiness, che dice al kernel durante le nuove allocazioni di memoria di preferire eliminare cache di memoria o scambiare pagine di memoria allocate "inattive".


1

La domanda è del 2014, ma poiché il problema esiste fino ad oggi su alcuni backend centos 6.8 nascosti, potrebbe essere ancora utile per qualcuno.

https://github.com/zfsonlinux/zfs/issues/1548 descrive un problema con zfs. Lì, lo spazio su disco non viene liberato per i file eliminati perché se si utilizza nfs sopra zfs gli inode del file non vengono eliminati dalla cache degli inode del kernel.

Per citare dal thread di bug, Behlendorf, 6 gennaio 2015 ha scritto:

La speculazione attuale è che per qualche motivo il server NFS mantiene una versione cache dell'handle del file. Fino a quando il server NFS non rilascia questo handle di file, ZFS non può scollegare questo file. Alcuni test chiari hanno dimostrato che l'eliminazione delle cache sul server causerà l'eliminazione di questo riferimento (come l'handle del file NFS) in quel momento lo spazio viene liberato correttamente. La pressione della memoria può anche causare la caduta.

vale a dire un'eco notturna 3> / proc / sys / vm / drop_caches è la soluzione più semplice per quel bug se non si desidera avere un tempo morto per ristrutturare zfs.

Quindi forse non l'amministrazione di culto cargo, ma un buon debugging è stato il motivo.


0

Ciò può avere senso sui sistemi NUMA (accesso alla memoria non uniforme), in cui, in genere, ciascuna CPU (socket) può accedere a tutta la memoria in modo trasparente, ma è possibile accedere alla propria memoria più velocemente della memoria di altri socket, in associazione con applicazioni HPC parallele.

Molte semplici applicazioni parallele tendono a eseguire l'I / O dei file da un singolo processo, lasciando in uscita una grande frazione di memoria su un singolo nodo NUMA allocato alla cache del disco, mentre sull'altro nodo NUMA la memoria può essere per lo più libera. In queste situazioni, poiché il processo di recupero della cache nel kernel Linux, per quanto ne so, non è ancora a conoscenza di NUMA, i processi in esecuzione sul nodo NUMA che ha memoria allocata alla cache sono costretti ad allocare memoria sull'altro nodo NUMA, purché ci sia RAM libera sull'altro nodo, uccidendo così le prestazioni.

Tuttavia, in un sistema HPC, sarebbe più saggio pulire la cache prima di iniziare un nuovo processo utente, non in un momento specifico con cron.

Per applicazioni non parallele è improbabile che si verifichi questo problema.


0

Quando la cache della pagina è piuttosto grande (molto più grande del tuo attuale utilizzo di swap) e lo scambio e lo scambio avvengono a turno, è quando devi eliminare le cache. Ho visto casi in cui l'utilizzo della memoria aumenta in uno dei miei server di database MariaDB che eseguono Ubuntu 16.04LTS e Linux ha appena scelto di aumentare l'utilizzo dello scambio anziché rimuovere le cache di pagine inutilizzate. Hugepage trasparenti già disabilitati nel mio sistema perché TokuDB ha richiesto che fosse disabilitato. Ad ogni modo forse non è un bug, ma Linux continua a fare questo comportamento per me è abbastanza sconcertante. Varie fonti affermano che Linux rimuoverà la cache della pagina quando l'applicazione lo richiede:

Ma la realtà non è così semplice. La soluzione alternativa è:

  1. Eseguire periodicamente la cache di rilascio
  2. Eseguire la cache di rilascio quando necessario (monitorare usando vmstat 1 per lo scambio di attività)
  3. Consiglia a linux di rimuovere alcuni file dalla cache (come i file di log di apache) usando utility come dd o python-fadvise. Vedi https://unix.stackexchange.com/questions/36907/drop-a-specific-file-from-the-linux-filesystem-cache

Esempio di esecuzione dd:

dd if=/var/log/apache2/access_log.1 iflag=nocache count=0

Esempio python-fadvise:

pyadvise -d /var/log/apache2/access_log.1


-5

Ho una macchina desktop con 16 GB di RAM in esecuzione sul kernel PAE. Dopo un'ora o due le prestazioni del disco si riducono drasticamente fino a quando non lascio cadere le cache, quindi le metto semplicemente in cron. Non so se questo è un problema con il kernel PAE o con l'implementazione della cache così lenta se c'è molta memoria.


9
Questo è un ottimo esempio dell'amministrazione del sistema "cult cult": piuttosto che individuare e risolvere il problema, lo si sta semplicemente mascherando.
Michael Hampton

2
A volte la soluzione conveniente è quella giusta. Potrebbe semplicemente rimandare la risoluzione del vero problema, oppure potrebbe essere la soluzione più richiesta nelle circostanze. Anche se è una cattiva pratica, non è ancora "culto delle merci". C'è una causa ed effetto dimostrati: rilascia cache e migliora le prestazioni del disco.
Dan Pritts,

1
Parte della definizione originale di CCSA era la tendenza a confondere la correlazione con la causalità, ed eccoci qui. Mascherare un problema affrontando un'entità correlata ma non causale è una soluzione ottimale dei problemi, che è ciò a cui il concetto di CCSA sta cercando di mettere in guardia.
underscore_d
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.