zram su Slackware

Questo articolo spiega come abilitare ed utilizzare zram in Slackware-current (e 14.2).

La vecchia guida per la -current pre quasi-beta è presente qui.

zram (conosciuto in precedenza anche come compcache) è un modulo del Kernel Linux che permette di creare un area di swap compressa, direttamente nella RAM. Questo modulo permette a dispositivi con poca RAM (es. vecchi PC, netbook, notebook, smartphone, sistemi embedded, etc.) di aumentare le performance generali del sistema. Inoltre avendo la swap in RAM permette ai dispositivi che usano memorie di tipo flash (es. sdcard, {mini,micro}sd) di non swappare su di essa. In questo modo la vita della memoria flash si allunga notevolmente in quanto non ci saranno cicli di lettura/scrittura.

Il modulo è presente sin dalla versione 3.2 del Kernel Linux ed stato diverso tempo in staging ma dalla versione 3.14 del Kernel Linux è in mainline.

Per caricare all'avvio zram, editiamo da root con il nostro editor di testo preferito il file /etc/rc.d/rc.modules.local ed aggiungiamo la riga:

/sbin/modprobe zram

Prossimo passo è specificare il numero dei block device da far creare a zram (di default zram ne crea solo uno - /dev/zram0).

Quanti block device servono ?

Per utilizzare la swap con zram è raccomandato creare almeno un block device per cpu in modo da ottimizzare il carico sulle CPU.

Per sapere quanti core abbiamo sulla nostra macchina possiamo scoprirlo in questo modo:

$ cat /proc/cpuinfo | grep processor | wc -l

Per far creare automaticamente più block device creiamo il file /etc/modprobe.d/zram.conf ed aggiungiamo la riga:

options zram num_devices=2

Usiamo LILO

Un'altro modo per configurare zram è utilizzare LILO aggiungendo al file /etc/lilo.conf nella variabile append la stringa zram.num_devices=n (dove n è il numero dei block devices da creare). Dopo aver modificato lilo.conf ricordiamoci di lanciare lilo.

Un modo che ritengo più flessibile senza creare script-shell è far gestire ad eudev la creazione dello swap all'avvio del sistema. Per farlo basta creare il file /etc/udev/rules.d/10-zram.rules ed aggiungiamo la seguente riga:

10-zram.rules
KERNEL=="zram0", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}=="0", ATTR{disksize}="512M", RUN+="/sbin/mkswap $env{DEVNAME}"

In questo modo alla creazione del block device (in questo caso /dev/zram0) in automatico imposterà la dimensione (512M) ed eseguirà il comando mkswap per creare l'area di swap.

Creiamo più aree di swap per sistemi multicore

Nel caso in cui abbiamo più block devices zram da creare, possiamo modificare la riga così:

10-zram.rules
KERNEL=="zram[0-9]", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}=="0", ATTR{disksize}="512M", RUN+="/sbin/mkswap $env{DEVNAME}"

In questo modo eudev creerà diverse aree di swap da 512M.

Nulla vieta di utilizzare zram come spazio temporaneo per salvare file (ad esempio /tmp). A differenza di altre soluzioni del tipo tmpfs o ramdisk, zram ha il vantaggio di comprimere i dati.

Possiamo aggiungere un nuovo spazio con udev usando il file appena creato 10-zram.rules aggiungendo una riga del tipo:

KERNEL=="zram1", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}=="0", ATTR{disksize}="512M", RUN+="/sbin/mkfs.ext4 $env{DEVNAME}"

Nell'esempio abbiamo creato un nuovo disco da 512M e formattato con ext4 (possiamo utilizzare qualsiasi tipo di FS con o senza journaling – es. /sbin/mkfs.ext4 -O ^has_journal)

Per montare all'avvio questo disco magari per utilizzarlo per la nostra directory /tmp aggiungiamo al file /etc/fstab la seguente riga:

/dev/zram1    /tmp    ext4    defaults    0  0

Oltre agli strumenti classici per controllare lo stato della memoria swap (free, /proc/swaps) ed occupata (df) viene fornito anche un tool zramctl che ci da diverse informazioni sull'occupazione dello spazio e dati compressi oltre alla gestione di zram stesso:

# zramctl
NAME       ALGORITHM DISKSIZE   DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo           512M   193M 52,9M 57,4M       1 [SWAP]
/dev/zram1 lzo           512M 192,6M 52,8M 57,3M       1 [SWAP]