“Linux ed il mistero della memoria scomparsa”, a Natale nei cinema!
19 ottobre 2012 2 commenti
Sicuramente molti di voi conoscono il fantastico tool “free” che ci permette di controllare lo stato della memoria sul nostro sistema GNU/Linux
$ free -m
total used free shared buffers cached
Mem: 870 181 689 0 4 34
-/+ buffers/cache: 142 727
Swap: 2551 10 2541
inoltre, tutti sanno che per capire quanta RAM è libera su sistema, bisogna sommare il valore della colonna “free” con quello di “buffers” e “cached”, quindi nel mio caso parliamo di 727Mb liberi.
Questo, non è del tutto vero, ed ora vi illustro il perché:
total used free shared buffers cached Mem: 870 833 37 0 274 33 -/+ buffers/cache: 525 345 Swap: 2551 10 2541
quello riportato è relativo allo stesso sistema GNU/Linux e la quantità di memoria disponibile non è 344Mb, ma praticamente, la stessa di prima! ![]()
Ma facciamo un esempio, supponiamo di partire da una situazione iniziale come la seguente
total used free shared buffers cached Mem: 870 165 704 0 0 22 -/+ buffers/cache: 142 728 Swap: 2551 10 2541
e lanciamo questo comando per creare un file di 500Mb
dd if=/dev/zero of=bigfile bs=1M count=500
se andiamo a controllare nuovamente lo stato della memoria, quello che otteniamo è
total used free shared buffers cached Mem: 870 693 176 0 4 532 -/+ buffers/cache: 156 713 Swap: 2551 10 2541
i 500Mb che abbiamo scritto, sono stati completamente “cache-ati” e la “formula standard” per il calcolo della memoria disponibile funziona!
Ora proviamo invece a lanciare questo comando, per trovare tutti i files presenti sul nostro sistema (quindi ci vorrà un po di tempo), partendo sempre da una situazione “pulita”
ls -lR / > /dev/null 2>&1
e cosa otteniamo dal comando “free”???
total used free shared buffers cached Mem: 870 838 31 0 279 29 -/+ buffers/cache: 529 340 Swap: 2551 10 2541
E qui la formuta ci restituisce 339Mb… il comando è terminato, non ho fatto partire nessuna nuova applicazione, ma dove è andata a finire questa memoria??? Chi la sta usando???
La risposta è: il kernel di Linux…
Si, perché ha mantenuto traccia di tutte le informazioni lette su filesystem, i famosi inode, così se qualche altra applicazione (ma anche la stessa) ha bisogno delle stesse informazioni, non deve andarle a leggere nuovamente dal disco, ma le troverà disponibili in RAM
Ma attenzione, non è che il kernel ci stia “rubando” la memoria, ma la sta usando per il sistema, non è un errore, è un comportamento voluto per mantenere il sistema performante e per usare al meglio le risorse disponibili!
E, ovviamente, se il sistema avrà necessità, questa memoria sarà rilasciata da kernel, per essere utilizzata dalle applicazioni che ne faranno richiesta
Ma, a questo punto, sorge un problema… come individuarla??? Come facciamo a capire se ci troviamo in questa situazione o se invece, abbiamo la necessità di espandere la RAM?
Qui ci viene di aiuto il filesystem “proc”, dove è presente il file “meminfo”, più precisamente, basterà eseguire questo comando
grep SReclaimable /proc/meminfo SReclaimable: 397444 kB
questa è la RAM, momentaneamente occupata dal kernel ma disponibile all’occorrenza!
Il motivo che mi ha spinto a scrivere questo post, in realtà, non è per spiegare dove è andata a finire questa memoria, ma per consigliarvi di NON eseguire “a cuor leggero” uno dei comando più suggeriti al mondo, parlo del “fantomatico” risolutore di ogni problema di RAM
echo 3 > /proc/sys/vm/drop_caches
perché questa cache serve! Al kernel come a noi! Cancellarla significa solo obbligare il sistema a rileggere nuovamente le informazioni dal disco a discapito quindi delle performance!
Tanto, se ci dovesse servire memoria, ci penserà il kernel a liberarla in tutta autonomia!











Ottimo post! Veramente interessante!
Pingback: Marco Bollero (paper0k): “Linux ed il mistero della memoria scomparsa”, a Natale nei cinema! | TCNews24.it