4.16 Lo swap

Nei sistemi GNU/Linux viene generalmente utilizzata una parte della memoria di massa per memorizzare dati temporanei che non riescono ad essere contenuti nella memoria centrale (RAM): una sorta di memoria di appoggio della memoria centrale. Questa parte della memoria di massa è detta swap38.

L’insieme formato dall’area di swap e dalla memoria centrale costituisce quella che viene comunemente denominata memoria virtuale o virtual memory. Questo meccanismo permette ai processi di poter considerare la memoria centrale come se fosse illimitata, anche se fisicamente non lo è.

Quando il kernel ha bisogno di memoria centrale da dedicare ad un’attività, parte del contenuto di quest’ultima viene “scaricato” nello swap (swap out). È il virtual memory manager (una parte del kernel) che decide quale parte della memoria deve essere scaricata, ad esempio quella acceduta meno frequentemente o non acceduta da più tempo delle altre. Quando invece le informazioni alle quali un’attività fa riferimento sono presenti nello swap, queste devono essere ricaricate in memoria centrale (swap in).

La frequenza con la quale le informazioni vengono scaricate o ricaricate dallo swap può essere visualizzata con il comando vmstat (v. sez. 7.4.4).

Tale meccanismo può migliorare le prestazioni di macchine con una limitata quantità di memoria centrale. Lo swap, però, sebbene estenda la memoria centrale del sistema, non può essere considerato come parte della memoria centrale stessa, in quanto i tempi di accesso allo swap sono quelli relativi alla memoria di massa, notevolmente superiori a quelli della memoria centrale (circa 1 : 1000000).

I dati utilizzati dal kernel, come anche il codice del kernel stesso, non vengono mai scaricati dalla memoria centrale nello swap. Neanche il codice dei processi che girano in user space ha la necessità di essere scaricato nello swap poiché risiede già in una parte del filesystem dal quale è stato caricato in memoria centrale per essere eseguito. I dati relativi ai processi che girano in user space sono soggetti al meccanismo di swapping.

La dimensione dello swap dipende dall’utilizzo che si fa del sistema considerato: se si utilizza generalmente molta più memoria di quella fisicamente presente sul sistema si ha bisogno di una grande area di swap. In genere la dimensione dello swap dovrebbe essere uguale al doppio di quella della memoria centrale (RAM) e comunque un valore compreso tra 32 MiB e 2 GiB. È importante utilizzare una dimensione adeguata dello swap: non troppo piccola poiché potrebbe causare rallentamenti al sistema dovuti ad uno swapping eccessivo, né troppo grande per non avere uno spazio praticamente inutilizzato sul fileystem.

Lo swap qui presentato è di tipo statico nel senso che la sua dimensione è fissata quando viene creato. Esiste anche la possibilità di usare uno swap dinamico che incrementa o diminuisce la sua dimensione dipendentemente dal suo utilizzo da parte del sistema (swapd v. http://ftp.linux.hr/pub/swapd).

La parte di swap correntemente utilizzata dal sitema è visualizzabile con il comando free (v. sez. 7.4.4) o visualizzando il contenuto dei file /proc/swaps e /proc/meminfo.

Lo swap è generalmente costituito da un filesystem dedicato, in una partizione del disco. Si parla in tal caso di swap filesystem o swap partition. È comunque possibile realizzare lo swap con un file (swap file) od una combinazione dei due.

Per poter essere utilizzata, un’area di swap deve necessariamente essere inizializzata con il comando mkswap (man page mkswap(8)) (make swap).

____________________________________________________________________

Comando: mkswap
Path: /sbin/mkswap

SINTASSI  
# mkswap [option] device [size]  
DESCRIZIONE

______________________________________________________________

L’utilizzo dello swap di GNU/Linux può essere attivato o disattivato durante il funzionamento del sistema, senza aver bisogno di effettuare un riavvio dello stesso. Questo può essere fatto per mezzo dei comandi swapon e swapoff (man page swapon(8)).

__________________________________________________________________________________________________________

Comando: swapon
Path: /sbin/swapon

SINTASSI  
# swapon [option] [filename]  
DESCRIZIONE

________________________________________________________________________

___________________________________________________________________________________________________________________

Comando: swapoff
Path: /sbin/swapoff

SINTASSI  
# swapoff [option] [filename]  
DESCRIZIONE

________________________________________________________________

Le aree di swap vengono considerate dal sistema al suo avvio, se indicate nel file /etc/fstab. Tra le opzioni specifiche può essere indicata l’opzione pri che specifica la priorità da assegnare all’area di swap considerata (v. opzione -p priority del comando swapon). Di seguito è riportata, ad esempio, la parte di un file /etc/fstab relativa alle direttive di mounting dell’area di swap. Essa mostra due partizioni di swap (/dev/hda2 e /dev/hdc3) con priorità più elevata (5) e due file di swap (/work/swapfile.1 e /work/swapfile.2) con priorità più bassa (3).

# swap space in device partitions
/dev/hda2        none    swap    pri=5,defaults 0 0
/dev/hdc3        none    swap    pri=5,defaults 0 0
# swap space in swap files
/work/swapfile.1 none    swap    pri=3,defaults 0 0
/work/swapfile.2 none    swap    pri=3,defaults 0 0
In questo modo, quando il sistema avrà bisogno di effettuare operazioni di swapping, utilizzerà prima di tutto le partizioni /dev/hda2 e /dev/hdc3. Nel momento in cui questo spazio viene esaurito, saranno utilizzati i file /work/swapfile.1 e /work/swapfile.2.

L’utilizzo di più aree di swap (partizioni o file) su dischi differenti ha l’effetto di striping dei dischi, analogo a quello del RAID 0 (v. sez. 4.18), ovvero le informazioni vengono memorizzate su tutti i dischi. È dunque una buona idea avere più aree di swap (con la stessa priorità) se si hanno a disposizione più dischi su canali indipendenti, così il sistema può utilizzare le aree di swap effettivamente in parallelo, senza perdere in prestazioni.