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.
Cos'è zram
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.
Carichiamo zram
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
.
Configuriamo lo swap con eudev
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.
Usiamo zram come disco
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
Gestiamo zram
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]