Lo Swap e la Memoria Virtuale

Introduzione

Si sentono sempre, in giro, tantissime diverse opinioni sull'utilizzo dello Swap. Ci sono quelli della filosofia (arcaica) che "deve essere il doppio della RAM", quelli che dicono che "oggi non serve più, abbiamo RAM più che sufficiente", poi ci sono quelli che dicono che il sistema "senza Swap è più veloce" e quelli che dicono che è più lento.

Ma nel 2015, con la RAM a basso costo, vale ancora la pena investire dello spazio su disco da dedicare allo Swap? La risposta rapida è: Sì, ne vale la pena. Ma andiamo ad analizzare la situazione.

La Memoria Virtuale

Swap

Ho avuto l'onore, durante i miei studi Universitari, di seguire due corsi (e sostenerne i relativi esami) col prof. Ozalp Babaoglu, colui che ha introdotto e sviluppato la Memoria Virtuale (e molto altro, tra cui il TCP/IP) in Unix. Sì, l'originale Unix! L'argomento, dunque, mi è sempre stato molto a cuore.

Tutti i dispositivi informatici hanno una RAM, ovvero una memoria ad accesso rapido su cui vengono appoggiati i dati in uso. Essa è veloce, decisamente più di qualunque disco fisso (anche delle moderne SSD), ed è una delle principali componenti che determinano la velocità operativa di una macchina, sia essa un server, un computer "tradizionale" che uno SmartPhone, Tablet, ecc.

La Memoria Virtuale è la somma della RAM e dello spazio che definiamo come Swap, ovvero uno spazio su un dispositivo di memorizzazione più lento che viene utilizzato quando il sistema ha bisogno di (o decide che sia meglio) liberare un certo quantitativo di memoria ad accesso rapido (RAM, appunto).

Il Sistema Operativo, in pratica, decide cosa sia meglio tenere pronto all'uso e cosa possa parcheggiare in un luogo meno conveniente, ma ugualmente accessibile. La Memoria totale vista da esso è, dunque, la somma tra RAM e Swap. Oltre questo quantitativo non si può andare, e se si dovesse superare la soglia di tolleranza il sistema inizierebbe a mandare degli OOM1 e gestire la situazione. Come verrà gestita è completamente dipendente dal sistema operativo in uso2.

Lo Swap

Ogni Sistema Operativo ha una gestione diversa del concetto di Swap, ma il succo è sempre il solito:

Swap è uno spazio su un dispositivo più lento che viene utilizzato come estensione della memoria RAM

Storicamente, Windows ha gestito lo Swap come un file presente nel file system principale. Di dimensione dinamica (cresce al crescere delle esigenze), viene principalmente utilizzato quando la RAM della macchina comincia ad essere piena.

Nei sistemi Unix-Like (quindi anche i *BSD e GNU/Linux), lo Swap è stato generalmente collocato in una partizione dedicata e ottimizzata allo scopo. Il principio è semplice: i file system devono occuparsi di gestire file (quindi permessi d'accesso, orari di creazione e modifica, redistribuzione dei vari pezzi dei file stessi nelle varie porzioni di disco, problemi di frammentazione3, ecc), aggiungendo quindi uno strato alla mera lettura/scrittura fisica sul dispositivo. La partizione di Swap è dunque dedicata solo allo Swap, e il sistema operativo può usufruirne senza dover fare tutti quei controlli e senza andare ad appesantire un file system più complesso. È comunque possibile, anche su GNU/Linux e i vari *BSD, utilizzare un file di swap, e può essere una soluzione comoda sia per necessità (es: bisogno di aggiungere dello Swap successivamente all'installazione, oppure incrementarlo solo per periodi limitati) che per malleabilità. Ci sono infatti degli interessanti programmi che gestiscono dinamicamente gli swap-file, facendoli crescere o cancellandoli in base alle reali necessità della macchina.

A volte mi sento dire:

"Ma io ho tanta RAM, molta più di quanta me ne serva. Perché dovrei comunque creare uno spazio di Swap?"

Ci sono (almeno) due ragioni distinte:

  1. I Sistemi Operativi come GNU/Linux hanno una gestione molto intelligente della RAM. Sapendo che è un bene prezioso, cercano di sfruttarla al massimo. Tutto lo spazio libero, quindi, cercheranno di utilizzarlo per fare cache delle letture e scritture sui dischi. Terrà dunque in memoria tutto ciò che ha letto fino a quando questa memoria non sia piena o necessaria per altri utilizzi più importanti. Linux, ad esempio, tende ad utilizzare TUTTA la RAM a disposizione, partendo dal principio che sarebbe sprecato tenerla ferma a non far nulla. In questi casi, lo Swap è utile in quanto dopo un certo tempo il Kernel si accorge che certe applicazioni (es: init, alcuni daemon come cron che potrebbero non avere nulla da fare, ciò che riguarda il boot e lo shutdown, ecc.) non vengono utilizzate da un bel po' ma stanno stagionando nella nostra preziosa RAM. Pur non avendone stretta necessità, deciderà di spostare ciò che è relativo a queste applicazioni nello Swap, così da avere più RAM libera sia per la cache dei dischi che per eventuali picchi di carico. L'aggressività di questo comportamento è configurabile mediante l'impostazione della swappiness. Per fare un esempio pratico, se abbiamo il tavolo vuoto e torniamo con i sacchetti della spesa, conviene lasciarla a lungo sul tavolo o mettere a posto le cose negli stipetti e avere il tavolo libero per qualunque utilizzo successivo?

  2. Quasi tutte le distribuzioni di GNU/Linux utilizzano lo Swap come spazio di memorizzazione dati in caso di ibernazione. Il contenuto della RAM viene dunque "congelato" e copiato nello Swap, pronto ad essere ricaricato e rimesso al proprio posto al boot successivo. In questo caso, è necessario che lo Swap sia almeno grande quanto il contenuto (escluse le cache, ovviamente) della RAM stessa.

Insomma, in molti casi possiamo lavorare anche senza Swap ma la sua presenza migliora l'efficienza di gestione delle nostre risorse.

Quanto deve essere grande la mia partizione di Swap?

Non esiste una risposta universale. Dipende

Un tempo si diceva che dovesse essere il doppio della RAM, ma erano i tempi in cui misuravamo la memoria in Megabyte, non in Gigabyte. Oggi sarebbe, a mio avviso, quasi sempre uno spreco di risorse. Se avete bisogno di ibernare il PC, consiglio di dare una dimensione leggermente maggiore del quantitativo della vostra memoria RAM. In caso di sistemi che non hanno questa necessità (es: server), suggerisco di valutare caso per caso, ma dare sempre almeno un paio di GB. In caso di picchi o di necessità mutate e di impossibilità a modificare le partizioni, c'è sempre la già citata possibilità di utilizzare uno swap-file (fisso o dinamicamente allocato).

C'è sempre poi da ricordare che nello Swap vengono memorizzate porzioni di memoria RAM, dunque è possibile analizzare lo spazio anche dopo lo spegnimento del computer e trovarvi password, dati personali, ecc. Per i più attenti c'è sempre la possibilità di crittare lo Swap, sia con chiave fissa (richiesta ad ogni boot) che con chiave dinamicamente generata ad ogni avvio, che appunto si invalida allo spegnimento della macchina.


  1. OOM sta per Out Of Memory, ossia "ho finito la memoria a disposizione". 

  2. Linux, così come FreeBSD, ha un OOM killer intelligente e ragionevolmente efficiente. Esso cerca i processi più onerosi e tenta di capire se sono fondamentali per l'esecuzione del sistema. Di solito, nella mia esperienza, gli OOM killer uccidono Apache e MySQL, che reggono bene e "ripartono" alleggeriti. Windows, invece, non ha un OOM Killer e il sistema diventa instabile fino a crashare completamente. Consiglio questa interessante lettura 

  3. Per quanto molta gente sia convinta del contrario, anche i file system supportati nativamente da Linux (e *BSD) soffrono di frammentazione. La differenza rispetto a Windows è che essi ne soffrono meno, ma non ne sono immuni. L'utilizzo di SSD annulla quasi completamente il problema. 

Commenti