Gestione della memoria in Linux

Contenuti:

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
l'opzione -m sta per megabytes e l'output dovrebbe apparire simile a questo

             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.



Ultimo aggiorn.:
20 Giugno 2004
sapphirecat
Autore

Enrico Morelli
Autore

Sommario:  Questo articolo mostra la gestione della memoria in Linux e risponde alla domanda 'Perché non c'è RAM libera?'
- 2002 Gentoo.it - Domande, commenti e/o correzioni? Email gentoo-dev@gentoo.it.