Perché Linux elimina la cache di memoria quando è quasi piena?


14

Ecco come appare il grafico della memoria su un VPS che esegue CentOS con 512 MB di RAM e nginx / php-fpm / mysqld che serve contenuti (principalmente statici) a un paio di migliaia di visitatori al giorno.

Grafico della memoria settimanale

(quelli sono giorni sull'asse x)

Come puoi vedere, è piuttosto nervoso nell'area cache e buffer. La cache di memoria viene eliminata a intervalli irregolari (escludendo un cron job responsabile). Di solito, ma non sempre, viene eliminato nel punto in cui non può crescere. A volte si schiarisce quasi del tutto, altre volte solo a metà.

Sto cercando di capire la logica dietro queste purghe. Mi aspetto che i dati dei file vengano memorizzati nella cache molto più a lungo e non vedo altri programmi che utilizzano più memoria del solito quando la cache di memoria viene svuotata.

È un comportamento normale o mi manca qualcosa?

AGGIORNAMENTO: un aggiornamento della memoria sembra aver stabilizzato il grafico. Continuo a vedere piccole gocce, ma in nessun luogo significativo come prima dell'aggiornamento.

Dopo l'aggiornamento della memoria


È un container OpenVZ / Virtuozzo o una vera macchina virtuale come XEN o KVM?
Giordania,

1
Non riesco a spiegare cosa sono, ma ho un VPS che mostra lo stesso comportamento. dl.dropbox.com/u/1578899/memory-week.png
EightBitTony,

@jordanm È una macchina virtuale basata su Xen.
Redburn,

@EightBitTony Grazie per la condivisione. Il tuo sembra un po 'più "naturale", ma vedo chiaramente un modello simile (ma forse più prevedibile) di cadute nella cache di memoria.
Redburn,

Mi chiedevo se Munin 2 rappresentasse graficamente / raccogliendo i dati in modo abbastanza diverso da causare alcune differenze (grafico più fluido sul tuo), ma anche il mio mostra un calo nel mezzo di un ciclo piuttosto che quotidiano. È strano, di sicuro.
EightBitTony,

Risposte:


3

Potrebbero essere molte cose. Forse uno dei programmi che stai utilizzando occasionalmente e brevemente utilizza molta RAM. Se sono davvero settimane sull'asse x, dovresti campionare con una risoluzione molto più alta (ad es. Una volta al minuto o anche al secondo) per ottenere maggiori informazioni su ciò che sta accadendo che sta causando il rilascio della cache. pse anche l' topoutput (compresa la media del carico) durante quel periodo sarebbe utile.


Sì, suppongo che potremmo teorizzare che uno scoppio molto breve e improvviso nell'uso della memoria che si verifica in circa un minuto, e che non viene individuato da Munin, potrebbe scaricare la cache, che ovviamente viene individuata perché persiste.
EightBitTony,

L'intestazione è un po 'confusa, in quanto mostra in realtà una settimana di dati, quindi quelli sono giorni su x-as, non settimane. Per quanto riguarda la frequenza di polling: Munin recupera i dati ogni 5 minuti e non credo che la frequenza possa essere modificata. Sto solo eseguendo nginx, mysql, php-fpm e munin-node. Può avere qualcosa a che fare con la cache mysql, forse?
Redburn,

Ho fatto in modo che top (in ordine di utilizzo della memoria) scrivesse il suo output su un file ogni 5 secondi, quindi ho analizzato quel file e non ho trovato alcun processo che mostri alcun comportamento insolito nel punto in cui la memoria cache è improvvisamente caduta. A meno che un processo non possa usare così tanta memoria e sfuggire ancora a quella finestra di 5 secondi, non sono convinto che questa potrebbe essere la causa. Ma se non ci sono processi in esecuzione, cosa potrebbe essere?
Redburn

Questo thread è un po 'stantio, ma una rapida osservazione sulla metodologia: quanto un processo contribuisce alla cache di memoria del sistema non si rifletterà (facilmente) in alto , poiché un processo molto attivo può impilare gli oggetti nella cache molto rapidamente senza il proprio memoria allocata aumentando molto. Ad esempio, leggendo un file molto grande in piccoli blocchi per la trasmissione - mentre il processo potrebbe non utilizzare mai più di pochi MB allocati , quei pochi MB cambieranno e accumuleranno costantemente i riferimenti nella cache. Quindi la cosa da guardare nell'output superiore sarebbe un improvviso accumulo di tempo della CPU.
Riccioli d'oro,

Potrebbe interessarti anche questo: cognitivedissonance.ca/cogware/plog
goldilocks il

2

Una possibile ragione potrebbe essere un file in crescita, come dire un registro, che viene rimosso, compresso o inviato altrove quando raggiunge una determinata dimensione.

In entrambi i casi, le sue dimensioni memorizzate nella cache, possibilmente il tutto se non c'è pressione di memoria nel tuo sistema operativo, verrebbero liberate dalla cache non appena il file originale verrà rimosso.


Un'idea interessante, ma i file di registro più attivi raramente superano una dimensione del file di 25 MB prima di essere ruotati e l'utilizzo della cache / buffer tende a diminuire di circa 200 MB.
Redburn
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.