Sfratti di cache Linux


8

Osservando come si comporta la cache VFS sulla mia macchina Linux, posso vedere che anche quando effettivamente inattivo (crond e la maggior parte degli altri demoni si sono arrestati, le interfacce si sono abbassate) la quantità di memoria libera aumenta gradualmente implicando che gli oggetti vengono sfrattati dalla cache.

Ho fatto molti googling ma non riesco a trovare alcun riferimento a come questo è controllato (a meno che non sia un effetto collaterale di vm_swappiness). Qualcuno può mettermi sulla strada giusta per capire perché gli elementi vengono espulsi dalla cache quando non c'è richiesta di nuova allocazione di memoria?


«Sottintendendo che gli oggetti vengono espulsi dalla cache» - beh, in tal caso si vmstatvedrebbe aumentare la dimensione della cache, vero?
poige

decrescente sicuramente. Sì, lo sono (in diminuzione)
symcbean

Quindi, dici che l'aumento della memoria libera e la dimensione della cache / buf stanno diminuendo allo stesso tempo, giusto?
poige

Risposte:


1

lo scambio influenza solo se la memoria dell'applicazione allocata viene scambiata per fare spazio alla cache. vfs_cache_pressure è il sysctl che controlla ciò che stai vedendo.


1
No - vfs_cache_pressure controlla il rapporto tra metadati e ritenzione di pagecache (almeno secondo i documenti che ho letto e gli esperimenti che ho eseguito)
symcbean

1
Giusto. Ho fatto un po 'più di ricerca e da quello che posso vedere tutto è ordinato in un elenco di ordini LRU e guardato solo quando viene raggiunta o superata una soglia (artificiale o fisica). Detto questo, suppongo che qualcosa stia ancora accadendo (come un thread del kernel che si sta svegliando o qualcosa del genere). Se per te è estremamente importante capirlo, sembra che ci sia uno script systemtap pre-scritto chiamato "mmreclaim.stp" che tiene traccia delle richieste del gestore della memoria. Vorrei anche assicurarmi che in realtà non cambierà usando "sar -A".
Bratchley,

1

Linux scarica i dati dalla cache della pagina usando un processo chiamato pdflush

pdflush è controllato dai parametri di / proc / sys / vm

#/proc/sys/vm/dirty_expire_centisecs
The hundredth of the second after which data will be considered to be expired from the page cache and will be written at the next opportunity.

#/proc/sys/vm/dirty_writeback_centisecs`    
The hundredth of a second after which the pdflush wakes up to write data to disk.

#/proc/sys/vm/vfs_cache_pressure`    
This will reclaim dentries and inodes which are also part of the cache.

Puoi consultare i seguenti thread per ulteriori informazioni:

Il demone pdflush
Teoria del funzionamento e dell'ottimizzazione per carichi pesanti di scrittura
Memoria cache di Linux


Grazie Joe, tuttavia le prime 2 opzioni riguardano specificamente i dati che devono essere riscritti nel filesystem (cioè il buffer di scrittura) e non i dati che sono stati letti e che non sono stati modificati (il buffer di lettura). Vfs_cache_pressure controlla la preferenza per lo sfratto dei metadati del file rispetto al contenuto del file.
symcbean,

@symcbean Hai ragione. La risposta parla di più sulla cache di scrittura. La cache di lettura viene cancellata in base a LRU. Tuttavia, Linux utilizza una strategia a due elenchi in base alla quale viene cancellata la cache di lettura. Puoi leggere di più su Two-List Stragety e su come Linux cancella la cache di lettura qui . Fammi sapere se questo ha senso. Nel tuo caso suppongo che dopo che tutti i processi sono stati arrestati, queste cache di lettura entrano in un elenco inattivo e vengono cancellate
Joe,

grazie, bell'articolo. Qualche idea da quale libro provenga il capitolo? Tuttavia, anche se spiega come una determinata pagina abbia la priorità per lo sfratto, non spiega davvero perché le pagine vengano sfrattate quando non vi è una domanda apparente di memoria. Cosa controlla il processo "per ridurre la cache per rendere disponibile più RAM per altri usi"? Con cosa li sostituisce?
symcbean,

@symcbean Lo sfratto della cache funziona immediatamente quando c'è una richiesta di memoria. Tuttavia, non ha senso averlo nella cache quando nessuno lo sta attivamente utilizzando. Lì dalle pagine attive diventano pagine inattive e alla fine vengono sfrattate. Presumo che la tua domanda abbia origine dal punto in cui lo sfratto avverrà solo quando c'è richiesta di memoria. Il Linux cancellerebbe ogni pagina inattiva come e quando sono disponibili. Come [notato nell'articolo] [ jothirams.com/linux-cached-memory/] se tutto è attivo, si esaurirà la memoria e verrà chiamato OOM.
Joe,
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.