Raddoppiare la RAM del Raspberry con zram

25/03/24 | ~ 4 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 dispone di 8 GB di RAM, e ne riserveremo 2 per zram con un apposito algoritmo di compressione, otterremo un aumento di circa 6 GB.

Come?

Non era molto chiaro, vero?
Andiamo con ordine:

Nell'esempio si usa l'algoritmo zstd con una compressione 1:4.

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.

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.7G", 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,7 GB, in quanto:
0,5 + (0,7/4) + 0,7 = 1,03 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.