Gestione della memoria in Linux
1.Panoramica sulla gestione della memoria
Uno degli strumenti usati sotto Unix per il controllo dei processi è
top e sorprende che spesso riporti una piccola quantità di memoria
libera dopo che il sistema è in esecuzione da un certo periodo.
Per esempio, dopo circa tre ore di uptime, la macchina che sto usando,
riporta di avere meno di 60MB di memoria libera anche se ne ha
a disposizione ben 512MB. La domanda che ci si può fare è: dov'è andata tutta questa memoria?
La mggior parte di memoria viene usata nella cache del disco, che è
attualmente sopra i 290MB. Questa memoria è riportata da top
come "cached". La memoria cached è essenzialmente libera e può essere
usata se un programma in esecuzione (o uno in partenza) ha necessità
di memoria.
La ragione per cui Linux usa molta memoria per il disk cache stà nel fatto
che la RAM non usata è sprecata. Mantenere una cache significa che se qualcosa
necessita degli stessi dati più volte, c'è una buona possibilità che questi
siano ancora nella memoria cache. Accedere ad informazioni qui è circa
1000 volte più veloce che prenderle dal disco. Se le informazioni non vengono
trovate nella cache, occorre rileggerle dal disco, ma in questo caso non abbiamo perdite di tempo.
Per avere una stima di quanta memoria è realmente disponibile per
le applicazioni, eseguire il comando:
Esempio 1: Memoria disponibile |
$ free -m
total used free shared buffers cached
Mem: 503 451 52 0 14 293
-/+ buffers/cache: 143 360
Swap: 1027 0 1027
|
La linea -/+ buffers/cache mostra la memoria usata e libera dalla prospettiva
delle applicazioni. Generalmente parlando, un piccolo uso dello swap
non incide drammaticamente sulle performance.
Notate che la mia macchina ha 512MB di memoria, ma ne è listata solo
503 come disponibile. La causa principale di questo è che il kernel non può
essere rimosso e quindi la memoria che occupa non potrà mai essere liberata.
Ci possono essere anche regioni di memoria usate dall'hardware per altri scopi,
a seconda dell'architettura del sistema.
2.Il limite misterioso di 880MB su x86
Di default, il kernel di Linux risiede e gestisce solo memoria bassa.
Questo rende la gestione delle pagine di memoria leggermente più semplice
il che a sua volta ne rende l'accesso leggermente più veloce.
Il rovescio della medaglia sta nel fatto che il kernel non può
usare tutta la memoria una volta che la quantità della RAM si avvicina agli 880MB.
Storicamente questo non è mai stato un problema specialmente per macchine desktop.
Per dare al kernel la capacità di usare tutta la RAM oltre 1GB occorre ricompilarlo.
Usando make menuconfig o qualsiasi altro modo di preferisca, configurare
le seguenti opzioni:
Esempio 2: Usare oltre 1G di RAM |
Processor Type and Features ---->
High Memory Support ---->
(X) 4GB
|
Questo si applica sia ai kernel della serie 2.4 che a quelli della serie 2.6.
Abilitando il supporto alla memoria alta teoricamente la velocità di accesso
perde un po' in performance, ma secondo Joseph_sys non ci sono praticamente differenze.
3.Differenza tra VIRT, RES e SHR nell'output di top
VIRT è la dimensione virtuale di un processo, che è la somma della memoria che attualmente
usa, la memoria mappata dal processo stesso (per esempio la RAM della scheda video per
un server X), i file sul disco che il processo ha mappato (specialmente librerie condivise)
e la memoria condivisa con altri processi.
VIRT rappresenta la quantità di memoria alla quale il processo può accedere in questo
momento.
RES è la dimensione residente, che è una rappresentazione accurata di quanta memoria
fisica sta consumando un processo. (Questo corrisponde direttamente alla colonna %MEM).
Questa sarà virtualmente sempre minore della dimensione di VIRT dato che molti
programmi dipendono dalla libreria C.
SHR indica la dimensione VIRT che è attualmente condivisibile (memoria o librerie).
Nel caso di librerie, non significa necessariamente che l'intera libreria sia residente.
Per esempio, se un programma usa solo alcune funzioni di una libreria, l'intera libreria
sarà mappata e sarà contata in VIRT e SHR, ma solo le parti della libreria che
contengono le funzioni che saranno usate sono caricate e contate in RES.
4.Differenza tra buffer e cache
I buffer sono associati con uno specifico dispositivo a blocchi e include il
caching di filesystem metadata così come il tener traccia al volo delle pagine.
La cache contiene solo dati di file parcheggiati. In pratica, il buffer di ricorda
cosa c'è nelle directory, quali sono i permessi di un file e tiene traccia da quale memoria
deve essere scritta o letta per una particolare periferica a blocchi. La cache mantiene
solo il contenuto dei file stessi.
Importante: Correzioni e aggiunte a questa sezione sono benvenute. Ho fatto alcune supposizioni
basate su come viene prodotto /proc/meminfo per arrivare a queste conclusioni. |
5. Swappiness (kernel 2.6)
Dalla serie 2.6 del kernel c'è un modo per controllare quanto Linux favorisca lo
swap su disco rispetto al restringimento della cache quando la memoria si sta esaurendo.
Quando un'applicazione necessita di memoria e tutta la RAM è occupata, il kernel ha
due modi per liberare la memoria che ha a disposizione: può ridurre la disk cache in RAM
eliminando i vecchi dati o può scambiare porzioni di programmi (pagine) poco usate
con la partizione swap del disco. Non è facile predire quale sarà il metodo più
efficiente. Il kernel fa una scelta approssimativamente immaginando l'efficienza dei due metodi in un dato momento, basandosi sull'attività più recente.
Prima della serie 2.6 del kernel, l'utente non aveva possibilità di influenzare i calcoli
e di intervenire dove il kernel faceva una scelta sbagliata, limitandosi ad avere
basse prestazioni. Questa situazione viene modificata nella serie 2.6 del kernel con
l'introduzione di quello che viene chiamato swappiness.
Lo swappiness prende una valore tra 0 e 100 per cambiare il bilanciamento tra lo swapping
di applicazione e la liberazione della cache. A 100, il kernel preferirà sempre trovare
pagine inattive e swapparle. In altri casi se avviene uno swapout dipende da quanta
memoria viene usata dalle applicazioni e quanta cache viene liberata da parti inattive.
Il valore predefinito di swappiness è 60. Un valore uguale a 0 riporta il tutto al vecchio
modo di operare dove applicazioni bisognose di memoria dovevano contrarsi in minuscole frazioni
di RAM. Per portatili che dovrebbero preferire un minore lavoro su disco è raccomandato un valore
di 20 o inferiore.
swappiness può essere modificato in qualsiasi momento coi seguenti comandi:
Esempio 3: Modificare il valore di swappiness |
# sysctl -w vm.swappiness=30
# echo 30 > /proc/sys/vm/swappiness
|
Il valore predefinito quando Gentoo si avvia può essere posto in /etc/sysctl.conf:
Esempio 4: swapiness all'avvio |
# Control how much the kernel should favor swapping out applications (0-100=
vm.swappiness = 30
|
Alcune patch permettono al kernel un auto regolazione sul livello di swappiness
come se fosse fisso e possono non tenere conto di valori assegnati dall'utente.
|