La gestione della memoria virtuale su Linux ha attraversato una lunga evoluzione, passando da un modello di swap su disco relativamente semplice a soluzioni ibride che combinano compressione e caching in RAM. Tecnologie come zswap e zram, ormai integrante da tempo nel kernel Linux (tra il 2010 e il 2013), hanno modificato in modo significativo il comportamento del sistema quando c’è scarsità di memoria. Oggi queste due opzioni sono spesso considerate equivalenti, ma la loro architettura e le implicazioni d’uso divergono in maniera sostanziale, con impatti concreti su prestazioni, latenza e stabilità.
Da un lato si registra la diffusione di sistemi con grandi quantità di RAM (bisognerà comunque fare i conti con la crisi che stiamo vivendo) e storage veloce, come SSD NVMe; dall’altro abbiamo anche scenari diametralmente opposti, come i molteplici dispositivi embedded con risorse limitate.
La compressione della memoria consente di aumentare la capacità effettiva senza accedere immediatamente all’unità di memorizzazione, riducendo l’I/O e migliorando la reattività. Tuttavia, scegliere il meccanismo sbagliato può produrre effetti negativi, fino a peggiorare il comportamento del sistema rispetto a una configurazione tradizionale.
Architettura e funzionamento di zswap
zswap opera come un livello intermedio tra la RAM e lo swap su disco. Quando il kernel decide di spostare una pagina nello swap, zswap la intercetta tramite l’API dedicata e la comprime, conservandola in un pool dinamico di memoria. Solo quando questo pool raggiunge un limite configurato, le pagine meno utilizzate sono trasferite sul dispositivo di swap reale, seguendo una politica LRU (Least Recently Used).
Il comportamento dinamico di zswap rappresenta il punto centrale: il pool di zswap cresce e si riduce in funzione del carico, evitando allocazioni premature.
La compressione utilizza moduli del kernel, come LZO, ZSTD o LZ4, selezionabili a runtime. A partire dalla versione 6.18 del kernel Linux, il sistema utilizza direttamente zsmalloc, un allocatore di memoria progettato per comprimere e gestire i dati in modo più efficiente, aumentando così la quantità di informazioni memorizzabili nello stesso spazio rispetto al precedente zbud, che era meno ottimizzato sotto questo aspetto.
Il vantaggio principale risiede nella capacità di adattare il comportamento in modo graduale: quando la memoria compressa non basta più, il sistema scarica automaticamente i dati meno rilevanti sull’unità di memorizzazione. In questo modo mantiene in RAM le pagine più “calde”, preservando la reattività complessiva anche sotto carichi elevati.
Architettura e limiti operativi di zram
La tecnologia zram adotta un approccio differente: crea un dispositivo a blocchi interamente in RAM, su cui è possibile configurare swap o filesystem temporanei. Ogni pagina scritta è compressa al volo, consentendo di aumentare la capacità apparente della memoria disponibile.
La caratteristica più rilevante è anche la principale limitazione: la capacità è fissa. Una volta raggiunto il limite, il sistema non dispone di un meccanismo nativo per spostare altrove i dati meno utilizzati. Se non esiste un ulteriore swap su disco, il kernel può arrivare rapidamente a una condizione di OOM (Out Of Memory), con conseguente terminazione dei processi.
Nel tempo il kernel ha aggiunto alcune funzionalità a questo meccanismo, tra cui la possibilità opzionale di scrivere i dati su una memoria persistente (cioè uno storage non volatile come un disco o un’unità flash) tramite CONFIG_ZRAM_WRITEBACK; tuttavia, il funzionamento di base rimane quello di un’area di memoria separata e isolata.
A differenza di zswap, non è previsto un collegamento diretto con le strategie generali di gestione della memoria del sistema.
Impatto su CPU, I/O e latenza
Entrambe le tecnologie introducono un overhead computazionale legato alla compressione. Nella pratica, il costo CPU risulta generalmente inferiore al beneficio ottenuto riducendo l’I/O su disco, soprattutto su sistemi con storage lento o sotto carichi intensi.
zram può garantire prestazioni molto elevate quando l’insieme dei dati effettivamente utilizzati dal sistema (working set) è contenuto completamente nella memoria RAM compressa, cioè quando tutte le informazioni necessarie sono gestite in forma compressa senza dover ricorrere a memorie più lente come il disco. Tuttavia, quando la memoria si satura, la mancanza di un meccanismo di scarico graduale provoca picchi di latenza e condizioni di stallo.
zswap, invece, introduce una latenza leggermente maggiore nelle fasi iniziali, ma garantisce maggiore stabilità nel lungo periodo. Il passaggio progressivo verso lo swap su disco evita blocchi improvvisi e riduce il rischio di freeze prolungati.
Scenari d’uso reali e criteri di scelta
L’adozione di una soluzione rispetto all’altra dipende dal contesto operativo. Sistemi desktop o server dotati di swap su SSD NVMe traggono beneficio da zswap, che sfrutta l’unità come livello di fallback mantenendo la memoria attiva in RAM compressa.
zram trova applicazione in scenari più specifici: dispositivi embedded, sistemi diskless o ambienti dove si desidera evitare qualsiasi scrittura persistente, anche per motivi di sicurezza o durata dello storage flash. In questi casi, la capacità limitata rappresenta un compromesso accettabile.
Un aspetto aggiuntivo riguarda la gestione dell’OOM, cioè la situazione in cui la memoria RAM disponibile si esaurisce: quando è attiva zram, l’impiego di strumenti come systemd-oomd o earlyoom consente di mantenere il sistema più reattivo, perché essi intervengono in anticipo terminando i processi meno critici ed evitando che il kernel perda tempo in lunghi e spesso inutili tentativi di liberare memoria (reclaim).
Considerazioni operative e configurazioni moderne
Le distribuzioni Linux oggi disponibili adottano strategie differenziate nella gestione della memoria compressa, riflettendo scelte progettuali legate al tipo di sistema target.
- Fedora rappresenta il caso più evidente di orientamento verso zram: nelle versioni recenti abilita automaticamente un dispositivo di swap compresso in RAM tramite
systemd-zram-generator, dimensionato in funzione della memoria disponibile. Tale scelta privilegia la reattività e riduce drasticamente le scritture su disco, risultando particolarmente efficace su workstation e laptop. - Ubuntu segue una strada diversa: nelle installazioni standard mantiene uno swap su disco (tipicamente un file) e abilita zswap a livello di kernel, utilizzandolo come cache compressa intermedia. L’obiettivo è contenere l’I/O senza rinunciare alla prevedibilità dello swap tradizionale, caratteristica rilevante soprattutto in contesti server e cloud.
- Debian, più conservativa, non abilita nessuna delle due tecnologie per impostazione predefinita, lasciando all’amministratore la scelta esplicita. Arch Linux, coerente con la sua filosofia minimale, non impone alcuna configurazione ma offre pieno supporto a entrambe le soluzioni.
Sono differenze tutt’altro che casuali: zram tende a massimizzare le prestazioni percepite nei sistemi con memoria limitata o carichi interattivi, mentre zswap si integra meglio in ambienti dove la gestione della memoria deve rimanere stabile anche sotto pressione prolungata.
Come verificare quale tecnologia è in uso
Dal punto di vista operativo, la verifica della configurazione attiva è immediata.
La presenza di zram può essere identificata controllando la presenza di dispositivi come /dev/zram0 (comando ls /dev/zram*) e verificando che siano utilizzati come swap tramite swapon --show. Un riferimento generico all’unità di memorizzazione locale conferma che si sta usando solo lo swap tradizionale su disco.
zswap, invece, espone il proprio stato attraverso il parametro /sys/module/zswap/parameters/enabled: il valore Y indica che il meccanismo è attivo nel kernel (digitare cat /sys/module/zswap/parameters/enabled). L’assenza di questo percorso segnala che il modulo non è caricato.
In entrambi i casi, l’osservazione dell’utilizzo reale dello swap consente di capire se la compressione sta intervenendo o meno.
Come attivare zswap e zram
L’attivazione di queste tecnologie segue logiche differenti. zram è generalmente gestito a livello di spazio utente: su molte distribuzioni è sufficiente installare e abilitare il generatore systemd dedicato (systemd-zram-generator), che crea automaticamente i dispositivi e li configura come swap.
In alternativa, può essere configurato manualmente tramite modprobe zram, impostazione della dimensione e inizializzazione con mkswap e swapon.
zswap, al contrario, è una funzionalità del kernel che si abilita tramite parametro di boot (zswap.enabled=1) o attraverso configurazioni persistenti del bootloader. La disattivazione segue lo stesso schema: rimozione del servizio per zram oppure impostazione zswap.enabled=0 per zswap.
È tecnicamente possibile utilizzare entrambe le soluzioni contemporaneamente, ad esempio combinando zram e swap su disco con zswap attivo. Tuttavia, questa stratificazione introduce un livello di complessità che raramente porta benefici. La presenza di più livelli di compressione può rendere meno prevedibile il comportamento del sistema sotto pressione, soprattutto in termini di latenza e priorità dello swap. In generale, si tratta insomma di un intervento controproducente e ampiamente sconsigliato.
Una configurazione efficace tende quindi a privilegiare la semplicità: zram come sostituto dello swap nei sistemi orientati alle prestazioni locali, oppure zswap come ottimizzazione trasparente dello swap su disco in ambienti più tradizionali. Ridurre il numero di variabili in gioco facilita l’analisi del comportamento della memoria e permette di ottenere risultati più stabili, replicabili e misurabili nel tempo.