2010-06-11 15 views
19

Linux /proc/meminfo mostra un numero di statistiche di utilizzo della memoria.Come misurare in modo affidabile la memoria disponibile in Linux?

MemTotal:  4040732 kB 
MemFree:   23160 kB 
Buffers:  163340 kB 
Cached:  3707080 kB 
SwapCached:   0 kB 
Active:  1129324 kB 
Inactive:  2762912 kB 

C'è un bel po 'di sovrapposizione tra di loro. Ad esempio, per quanto ho capito, può esserci una cache di pagine attiva (appartiene a "cache" e "attivo") e cache di pagine inattiva ("non attivo" + "memorizzato nella cache").

Quello che voglio fare è misurare la memoria "libera", ma in un modo che includa pagine usate che potrebbero essere eliminate senza un impatto significativo sulle prestazioni generali del sistema.

Inizialmente, ero propenso a usare "free" + "inattivo", ma l'utilità "free" di Linux utilizza "free" + "cache" nella sua visualizzazione "buffer-adjusted", quindi sono curioso di sapere l'approccio è

Quando il kernel esaurisce la memoria, qual è la priorità delle pagine da eliminare e qual è la metrica più appropriata per misurare la memoria disponibile?

+1

Controllare anche 'Committed_AS', che è la dimensione effettiva che il kernel ha effettivamente _promised_ ai processi. Sembra che tu stia tentando di più di prevedere cosa succede se assegni/blocchi/usi xx byte, dato l'attuale utilizzo della memoria? –

+0

@ Tim Post, sì, non ho nemmeno iniziato a mettere il sovrastimaggio nella foto. Sto cercando di ottenere un numero che preveda quando iniziano le cose brutte se viene utilizzata più memoria. –

risposta

2

io direi che è difficile da misurare quali pagine, in caso di caduta, causerebbe al sistema di avere un "impatto significativo sulle prestazioni complessive del sistema". Le pagine in uso dai processi utente sono (Totale) - (Gratuito + Copia cache + Paging). Il secondo termine è tutta la memoria che il kernel potrebbe liberare se necessario. Tuttavia, liberare le pagine di memoria utilizzate per la cache e le pagine avrebbe un impatto significativo sulle prestazioni generali del sistema.

Se dovessi usare un euristico, direi che dovresti prendere il valore di "Inattivo" che è "La quantità totale di buffer o memoria cache di pagina, in kilobyte, che sono gratuiti e disponibili. è memoria che non è stata usata di recente e può essere recuperata per altri scopi. " Se si scopre che si prende questo e il sistema continua a funzionare bene, si potrebbe stimare una certa percentuale di "Active" di prendere come una supposizione così perché il sistema potrebbe aver utilizzato alcune pagine di recente, ma non ha intenzione di utilizzare di nuovo. Sai di più sul sistema di me. Se il sistema è dedicato a tutto ciò che stai per fare, poi le pagine ei file memorizzati nella cache in Active che possono essere utilizzati a breve dipenderebbe dal fatto che il sistema è stato recentemente utilizzato per qualcos'altro.

8

Dal momento che ciò che “memoria disponibile” significa appunto dipende dal vostro scopo, e il vostro scopo è quello di evitare situazioni OOM:

Partenza how Qt Extended (previously Qtopia) anticipates OOM situations.

Ci sono due eventi:

  • (MemFree + Buffer + cache)/MemTotal < treshold (in /proc/meminfo)
  • Major pagefaults> treshold (pgmajfault in /proc/vmstat penso)

Il primo è un allarme rapido che la memoria è bassa e attiva il monitoraggio più frequente dei pagefaults. Il secondo segnale trashing, che uccide le prestazioni del sistema ed è un buon suggerimento che il killer OOM verrà eseguito.

+0

+1 Buon algoritmi per impedire OOM – SeanDowney

3

All'inizio ho trovato la tua domanda facile, in quanto in pratica l'output da free nelle colonne '+ buffer/cache' è quello che uso e normalmente funziona.

Ma una delle situazioni in cui non funziona è quando si hanno pesanti lettura per gli stessi blocchi. Per esempio.leggendo lo stesso 1 gb_file più e più volte:

while true; do cat 1gb_file >/dev/null; done 

Se il sistema ha> 1 GB di cache allora questo correre veloce. Ma se inizi a utilizzare parte di quella cache per qualcos'altro, distruggerà le prestazioni del sistema.

Così quando si valutano le soluzioni, provare quanto sopra e vedere se la soluzione tiene conto di ciò.

2

Io uso il seguente:

FREE_KB = MemFree + Buffers + Cached 

FREE_KB=$(($(echo `sed -n '2p;3p;4p' < /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /+/g"))) 


USED_KB = MemTotal - MemFree - Buffers - Cached 

USED_KB=$(($(echo `head -n4 /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /-/g"))) 
+0

Mi sembra che/proc/meminfo restituisca byte o kb possa dipendere dal sistema. Per me il codice sopra sembra restituire byte, YMMV. – russellpierce

+0

Quale kernel usi? Nella funzione Linux corrente meminfo_proc_show restituisce solo kB. – Const

2

da Linux-3.14 non v'è nuova MemAvailable metrica in/proc/meminfo.

E controllare la riga '-/+ buffer/cache:' in uscita senza utilità.

Problemi correlati