2009-03-01 21 views
27

Voglio forzare il kernel Linux ad allocare più memoria alle applicazioni dopo che la cache inizia a occupare troppa memoria (come si può vedere dall'output di 'free').Come pulire le cache utilizzate dal kernel Linux

Ho eseguito

sudo sync; sudo sysctl -w vm.drop_caches=3; free 

(per liberare sia dentry disco cache/inode e cache di pagina) e vedo che solo circa la metà della cache utilizzata è stata liberata - il resto rimane. Come posso sapere cosa sta occupando il resto del cache e forzarlo a essere liberato?

+0

La chache che rimane è solo una cache che viene gettata via immediatamente quando è necessaria nuova memoria. Non è utile forzare la rimozione di queste regioni della cache. Le applicazioni saranno sempre i primi cittadini per la memoria e non dovranno lottare con la cache per questo. – ypnos

+1

Ho un problema con il mio server e credo che qualcosa stia abusando della cache fino al punto in cui le applicazioni vengono relegate alle pagine scambiate e si stanno affliggendo a causa della mancanza di memoria. Potrebbe essere un problema del kernel che potrebbe non essere. L'eliminazione della cache potrebbe essere un buon modo per testare. – Guss

+0

il tuo 'sysctrl' deve essere 'sysctl' – raittes

risposta

17

Si vorrà aumentare vfs_cache_pressure e impostare swappiness su 0. Ciò farà sì che il kernel recuperi la cache più velocemente, dando ai processi uguali o più favore quando si decide viene espulso. Si solo si desidera eseguire questa operazione se i processi che si interessano fanno molto poco I/O su disco. Se un processo di I/O di rete si deve scambiare per servire le richieste, questo è un problema e la vera soluzione è metterlo su un server meno competitivo.

Con l'impostazione di swappiness di default, il kernel preferisce quasi sempre mantenere la cache relativa alla FS nella memoria reale. Quindi, se aumenti la pressione della cache, assicurati di regolare anche la swappiness.

+0

Grazie per la risposta. Anche se non è quello che speravo, lo accetterò perché include informazioni che non conoscevo e fornisce alcune linee guida per raggiungere un obiettivo. Mi piacerebbe ancora sapere come capire a cosa serve la cache, specialmente quando non viene pulito da drop_caches. – Guss

16

Il contenuto di /proc/meminfo indica che cosa il kernel utilizza per la RAM.

È possibile utilizzare /proc/sys/vm/vfs_cache_pressure per forzare il kernel per recuperare la memoria che viene utilizzato per le cache filesystem legati più pigramente o avidamente.

Si noti che l'applicazione può trarre vantaggio dall'ottimizzazione di questo parametro solo se esegue poca o nessuna I/O su disco.

+1

La mia app fa pochissimo IO - la maggior parte dei dati proviene da un DB remoto. Sono un po 'confuso su/proc/meminfo: Vedo su Cached: 1.9GB, SwapCached: 8MB. IIRC, ciò significa che Cached è composto da 8 MB di caching di swap, 1.892 GB di altra roba (cache del disco e cos'altro?). Dove vengono contati i file mappati in memoria? – Guss

+0

I file mappati in memoria (se l'app è del tutto buona) dovrebbero avere i propri consigli e la propria pressione, preferibilmente dall'applicazione che chiama posix_madvise(). Potresti anche voler leggere la tua impostazione "swappiness". –

+0

In effetti una buona risposta, non solo una risposta alla mia domanda :-). Ho capito correttamente che i file mappati in memoria sono contati rispetto all'impronta di memoria RES della loro applicazione? – Guss

15

Si potrebbe trovare John Nilsson's answer to my Question utile per l'eliminazione della cache al fine di verificare se che è legato al vostro problema:

sync && echo 1 > /proc/sys/vm/drop_caches

Anche se sto cercando di indovinare l'unica vera differenza è di 1 vs 3

+0

1 cancella solo la cache del disco - era pertinente alla tua domanda. Voglio anche svuotare la cache della pagina perché penso che una delle mie app stia perdendo memoria e si guasta male. – Guss

+2

1 cancella la cache di pagina, 2 cancella dentifricie e inode, 3 cache di pagine chiare, dentelli e inode – Schildmeijer

Problemi correlati