(Probabilmente è un po' tardi per l'OP, ma questo viene chiesto abbastanza spesso, quindi ci proverò)
free
normalmente mostra qualcosa del genere:
total used free shared buffers cached
Mem: 8195284 8137708 57576 0 1232328 2651156
-/+ buffers/cache: 4254224 3941060
Swap: 18892216 759852 18132364
Le persone tendono a guardare il Mem:
line quando si cerca di scoprire quanta memoria libera hanno. Sfortunatamente quella riga è abbastanza fuorviante, perché il kernel di Linux cerca di fare un uso ottimale della memoria disponibile in (almeno) questi modi:
-
Mette nella cache i dati dal sottosistema I/O (ad esempio il disco), in modo che siano prontamente disponibili se necessario.
-
Eliminerà attivamente i processi che sono rimasti inattivi per un po' di tempo nello spazio di swap, a favore della memorizzazione nella cache dei dati per i processi attivi. Questo tende a favorire il throughput rispetto alla reattività, quindi alcune persone ottimizzano il proprio kernel per modificare questo comportamento.
Il primo punto è fonte di confusione riguardo a free
, perché Mem:
la riga include la memoria utilizzata per la memorizzazione nella cache nella quantità di memoria utilizzata. Il kernel, tuttavia, memorizzerà nella cache il più possibile per motivi di prestazioni. Infatti, su qualsiasi sistema Linux attivo da un po' di tempo, la memoria libera tende ad essere prossima allo zero:la memoria inutilizzata è memoria sprecata.
La memoria cache, tuttavia, può essere liberata dal kernel se necessario da un altro processo. Anche se avrà un certo impatto sulle prestazioni di I/O, altri processi possono disporre di più memoria senza utilizzare lo spazio di swap . Pertanto, per la maggior parte degli intenti e degli scopi, quella memoria è libera .
Ecco perché free
include una seconda riga, dove la memoria cache è considerata libera:
-/+ buffers/cache: 4254224 3941060
Questa seconda riga è ciò che le persone dovrebbero guardare quando vogliono sapere se hanno abbastanza memoria libera per un certo scopo.
Nell'esempio sopra, secondo il Mem:
line ci sono ~57 MB di memoria libera. Se si legge la seconda riga, però, ci sono in realtà circa 3,9 GB che può essere utilizzato senza forzare lo scambio dei processi attivi. Come nota a margine, ci sono anche circa 760 MB di dati usati raramente che sono stati scambiati, per fare più spazio nella memoria principale per i processi e la memorizzazione nella cache.
All'incirca nello stesso momento, il contenuto di /proc/meminfo
:
MemTotal: 8195284 kB
MemFree: 57660 kB
Buffers: 1232352 kB
Cached: 2651156 kB
SwapCached: 119936 kB
.
.
.
MemTotal
:la memoria fisica disponibile rilevata dal kernel.
MemFree
:la memoria fisica inutilizzata - la memoria libera mostrata nel Mem:
riga di free
.
Buffers
:archiviazione relativamente temporanea di blocchi di disco non elaborati.
Cached
:cache in memoria per i file letti dal disco. Non include la memoria SwapCached.
SwapCached
:memoria che una volta è stata scambiata, quindi reinserita ma è ancora nello spazio di scambio. Se necessario, i suoi contenuti possono essere semplicemente scartati (molto velocemente!), senza doverli sostituire (più lentamente).
Quindi, per avere una stima semi-accurata della memoria effettivamente disponibile
MemFree + Buffers + Cached + SwapCached
è un buon punto di partenza - e quello free
mostra in quella seconda riga.
Naturalmente, la gestione della memoria e le relative statistiche e misurazioni sono più complicate di così. I numeri mostrati da free
nella migliore delle ipotesi sono semplici stime, poiché ci sono molte altre variabili da tenere in considerazione se si desidera approfondire. Per le persone che eseguono regolarmente l'ottimizzazione dell'utilizzo della memoria, questa è quasi una forma d'arte.
MODIFICA:
Un link un po' divertente su questo "problema":
http://www.linuxatemyram.com/
MODIFICA 2:
Per confermare il commento sull'analisi dell'uso della memoria quasi come una forma d'arte:
Anche free
perde una parte importante dei dati memorizzati nella cache sui moderni sistemi Linux. Da /proc/meminfo
sul mio sistema:
SReclaimable: 2253576 kB
Si tratta di circa 2 GB di memoria che viene utilizzata dall'allocatore di lastre di sistema per la memorizzazione nella cache delle voci di directory e simili ed è recuperabile (ovvero può essere cancellata e utilizzata dai processi se necessario). Ancora free
non la considera memoria cache e non la inserisce in nessuno dei suoi calcoli e quindi si presenta come memoria utilizzata.
Il slabtop
utility, se disponibile, consente all'amministratore di sistema di scoprire a cosa serve la slab cache.
Un modo (solo per l'utente root) per avere free
mostrare l'effettivo utilizzo della memoria del sistema è il seguente:
# swapoff -a
# sync
# echo 3 > /proc/sys/vm/drop_caches
# free
total used free shared buffers cached
Mem: 8195284 3181468 5013816 0 8656 228832
-/+ buffers/cache: 2943980 5251304
Swap: 0 0 0
# swapon -a
Il primo comando disabilita lo spazio di swap. Non dovrebbe essere emesso se la memoria disponibile potrebbe non essere sufficiente per contenere i dati che sono stati scambiati - in tal caso si deve tener conto del Swap:
line of free nei loro calcoli sull'utilizzo della memoria.
Il secondo comando esegue il push di tutti i dati memorizzati nel buffer sul disco. Consente di liberare più memoria cache nel passaggio successivo.
Il terzo comando è il più importante dell'insieme:costringe il kernel a eliminare quanti più dati memorizzati nella cache possibile (cache di pagine, voci di directory, inode, ecc.).
Poi free
infine mostra ciò che effettivamente usano i processi in esecuzione nel suo -/+ buffers/cache:
linea. È piuttosto evidente che anche dopo aver eliminato tutti i dati memorizzati nella cache, il kernel riavvii rapidamente la memorizzazione nella cache:in questo caso ha già raggiunto quasi 250 MB di dati memorizzati nella cache in pochi secondi.
Il comando finale abilita nuovamente lo spazio di swap - è necessario solo se è stato utilizzato anche il primo comando.
Va notato che questi comandi dovrebbero essere eseguiti dall'utente root per avere i privilegi necessari.