Raddoppiare la RAM del Raspberry con zram

25/03/24 (aggiornamento 09/04/25) | ~ 5 minuti

Perché?

Perché mai dovrei posizionare un file di swap, tipicamente utilizzato per ovviare alla saturazione della RAM, proprio all'interno della suddetta memoria volatile?
Devo ammettere che l'incomprensione e lo scetticismo stavano prevalendo, ma poi ho accantonato i preconcetti e ci ho provato lo stesso: è così (oltre che con l'aiuto delle risorse linkate a fondo pagina) che ho iniziato il mio percorso con zram.

Vicissitudini a parte, zram consente essenzialmente di comprimere una porzione di RAM, aumentandone di fatto la sua dimensione effettiva.
Se ad esempio la nostra macchina disponesse di 8 GB di RAM, e ne riservassimo 4 GB per zram con un apposito algoritmo di compressione, otterremmo un totale di circa 16 GB.

Come?

Non era molto chiaro, vero?
Andiamo con ordine:

Nell'esempio si usa l'algoritmo zstd con una compressione tipica 1:3.
Alla RAM fisica (8 GB) si sottrae la porzione effettivamente riservata alla zram (4 GB), sommando poi l'ammontare dei dati una volta non compressi (12 GB).
Ancora più semplice, forse, un calcolo basato sulla dimensione effettiva di zram non compressa, tenendo conto di quanto si va a perdere nella RAM fisica: 8+(12-4)=16GB.

Pro e contro

A fronte di un notevole aumento della capacità effettiva di RAM, l'impiego di zram implica costanti compressioni/decompressioni dei dati al suo interno, che gravano sul carico della CPU. Questo potrebbe influire sulle prestazioni e/o la durata della batteria nei laptop.
È anche vero che il file di zram resta silente finché non inizia ad essere popolato.
Non tutti il contenuto all'interno di zram potrebbe essere compresso con il rapporto migliore, l'efficienza dell'algoritmo dipende anche dal tipo di dati.

Difficile pure fare calcoli veramente precisi (anche per l'alternarsi dell'uso di gigabyte, gibibyte, megabyte o mebibyte nei file di configurazione), e in ogni caso la RAM reale non subirà un vero incremento.
Si avrà invece a disposizione una swap molto performante (in quanto non richiede accesso al disco, ma rimane confinata in RAM), che in molte occasioni permetterà di archiviare più dati nella memoria volatile.

Alcuni processi non potranno beneficiare direttamente dei vantaggi di zram. La creazione di macchine virtuali, ad esempio, sarà sempre limitata dalla quantità di RAM fisica (comunque più ottimizzata se gli altri processi vengono spostati in zram).
La dimensione compressa di zram dovra in ogni caso essere minore della quantità totale di RAM fisica.

Il doppio della RAM su Raspberry

Un caso di utilizzo sensato, quindi, potrebbe essere quello di un dispositivo con a bordo una scarsa quantità di RAM, magari non espandibile. Il mio Raspberry Pi Zero con ben 512 MB (!) di memoria sembra essere proprio la cavia ideale!
Proviamo a "raddoppiare" la sua RAM.

Per consuetudine la rappresentazione dei comandi avviene con il prefisso "$ ", che non va digitato nella shell.

Prima di tutto dobbiamo attivare il modulo del kernel zram: $ sudo echo zram > /etc/modules-load.d/zram.conf

Una regola di udev definirà le specifiche vere e proprie del file compresso in RAM adibito a swap: $ sudo echo 'ACTION=="add", KERNEL=="zram0", ATTR{comp_algorithm}="zstd", ATTR{disksize}="0.75G", RUN="/usr/bin/mkswap -U clear /dev/%k", TAG+="systemd"' > /etc/udev/rules.d/99-zram.rules L'attributo disksize è determinante per impostare la dimensione non compressa di zram.
Con una RAM fisica di circa 0,5 GB, per ottenere un raddoppio dobbiamo settare la sua dimensione su 0,75 GB, in quanto:
[0,5 - (0,75/3)] + 0,75 = 1 GB

Concludiamo appendendo una riga nel file fstab, per l'esecuzione automatica all'avvio della zram: $ sudo echo "/dev/zram0 none swap defaults,pri=100 0 0" >> /etc/fstab Nella riga c'è anche un parametro per dare maggiore priorità al file di swap (pri=100).
Sarà necessario un riavvio per l'attuazione di tutte le modifiche apportate.

[user@dajelinux ~]$ dajelinux --per-approfondire

Come KVM, zram è un modulo integrato nel kernel Linux, quindi "universale" e configurabile in vari modi.