Agilizando la swap con zram

Prácticamente cualquier equipo más o menos moderno suele tener suficiente RAM para realizar cualquier tarea no excesivamente intensiva sin recurrir a swap en exceso… aunque luego resulta que te encuentras con aplicaciones como Chrome donde un par de perfiles abiertos y unas cuantas pestañas resultan al cabo de un tiempo en suficiente I/O para que mismamente cambiar a otra aplicación tarde algunos segundos.

Para evitar esto lo más lógico sería evitar ese tipo de aplicaciones, pero si por la razón que sea no se puede, no se quiere, o si estás usando un equipo con RAM bastante limitada, se puede recurrir a métodos como zram o zswap.

Hay algunas diferencias entre ambos métodos, aunque a efectos prácticos el resultado final que veremos será más o menos similar.

En este artículo vamos a ver cómo hacerlo con zram.

Zram es un módulo del kernel que permite crear un dispositivo de bloques en memoria RAM y asignarlo como espacio de paginación.

Dicho así parece contraproducente usarlo como remedio para una escasez de memoria que provoque swapping, pero la gracia está en que ese espacio swap en memoria está comprimido, con un ratio aproximado de 2:1.

Nada es gratis sin embargo. Comprimir los datos en swap llevará un coste de proceso en tiempo de CPU, pero en casos como el mencionado anteriormente donde el culpable es Chrome y donde la CPU está normalmente ociosa en gran medida, las ventajas de fluidez al reducir la I/O superan al pequeño coste en CPU.

Para activar zram en primer lugar deberemos comprobar que el módulo del kernel está disponible (ejecutando como root):

modprobe zram

Si no devuelve ningún error, el módulo se debería haber cargado correctamente. Podemos comprobarlo con “lsmod | grep zram” y verificar que aparece.

En caso de no funcionar, en Fedora el paquete que trae este módulo es “storaged-zram”, que habría que instalar y posteriormente volver a lanzar el comando anterior para cargarlo.

A continuación indicaremos el tamaño que queremos darle al dispositivo de bloques, teniendo en cuenta que:

  • Al ser un ratio de compresión 2:1 no tiene sentido darle un tamaño mayor del doble de la memoria física RAM.
  • Zram consume un 0,1% de la memoria asignada, con lo que asignar más espacio del necesario conlleva memoria desaprovechada que es consumida por zram.

Para asignar un tamaño de un giga pondríamos:

echo 1G > /sys/block/zram0/disksize

Sólo nos faltaría preparar el espacio para usarlo como swap:

mkswap /dev/zram0

Y activar la nueva swap, opcionalmente indicando una prioridad mayor que la swap ya existente para asegurar su uso:

swapon --priority 100 /dev/zram0

Con esto ya tendremos funcionando nuestra swap en memoria, lo cual podemos comprobar con “swapon -s“, aunque sólo permanecerá activo hasta que reiniciemos.

Para hacerlo persistente tendremos que configurarlo como servicio. En Fedora 24 hay un script de systemd en “/usr/lib/systemd/system/zram.service” que podemos copiar a “/etc/systemd/system/” y activarlo con “systemctl enable zram“.

Hay más opciones configurables para zram que se pueden consultar en la documentación del módulo, como por ejemplo crear varios dispositivos de bloques (normalmente uno por cada core de CPU como máximo) o limitar el uso de memoria.