Zram Swap: memoria de intercambio comprimida en la RAM

Publicado por Diego Córdoba en

Hoy aprenderemos a montar un espacio de intercambio o swap utilizando dispositivos zram, de modo que tengamos la memoria de intercambio comprimida directamente en RAM, en lo que se conoce como Zram swap.

En el artículo anterior introdujimos los conceptos y prácticas necesarias para entender los dispositivos de bloques virtuales, particularmente los dispositivos comprimidos en RAM, o zram. Ahora aprenderemos a usarlos como dispositivos de intercambio o swap en nuestro sistema GNU/Linux.

Swap en RAM

El espacio de intercambio, o memoria swap, es muy importante en los sistemas operativos, más cuando la memoria RAM es escasa.

Teniendo en cuenta que la partición o archivo de intercambio generalmente se encuentra en el disco rígido, ahora que conocemos los dispositivos virtuales, cabe preguntarse: ¿se aumentaría el rendimiento si el espacio de intercambio estuviera en RAM?

Cuando la RAM es escasa se hace uso intensivo de la swap, y esto ralentiza el funcionamiento del sistema, principalmente debido al tiempo de acceso al disco. Si, ya se, se estarán preguntando: si la swap se usa cuando la RAM es escasa, ¿no se volvería más escasa aún metiendo el intercambio ahí también, reduciendo aún más la memoria principal?

La respuesta es y no al mismo tiempo. Por un lado sí, se reduce el espacio disponible en RAM, lo que incrementaría las tareas de intercambio, pero por otro, pueden aplicarse técnicas de compresión sobre el espacio de swap para que ocupe menos RAM.

Dependiendo del algoritmo, el espacio ocupado en la RAM por un dispositivo zram puede ser aproximadamente un 40% del ocupado en el espacio de intercambio físico. Es decir, si en la partición de swap almacenamos 100MiB de páginas de memoria, eso ocuparía unos 40MiB en una swap comprimida en RAM.

En conclusión, un si bien la RAM utilizable se reduce, ese espacio reducido, al usarlo como swap, evita el tiempo de acceso a disco, permite almacenar la misma cantidad de páginas en disco, y por más que se requiera más procesamiento para las tareas de compresión, al final el tiempo total de acceso es más reducido y se beneficia, en general, el rendimiento del sistema.

Por supuesto, pueden utilizarse varios dispositivos de swap, con diferentes prioridades, y sobre diversos medios físicos, por lo que podría tenerse unos zram para swap comprimida en RAM, y además, cuando esto sea insuficiente, volcar la swap a una partición en el disco… nadie quiere que el sistema se congele, cierto?

A continuación veremos cómo montar manual y automáticamente dispositivos de Zram swap en GNU/Linux.

Manos a la obra con Zram Swap

Veamos manualmente cómo podemos crear una «partición virtual en RAM» usando un dispositivo zram. Primero vamos a crear el dispositivo de un tamaño determinado, por ejemplo, 512MiB:

sudo zramctl --find --size 512M

Ahora, procedemos a crear el sistema de archivos de swap en este dispositivo:

mkswap /dev/zram0

Y por último, carguemos el dispositivo de swap nuevo, con una prioridad, alta, por ejemplo, de 50 (la prioridad va desde 1 a 32767, siendo 1 la máxima prioridad, y -1 se considera «indefinida»).

swapon -p 50 /dev/zram0

Con esto, podremos verificar que nuestro dispositivo swap se encuentra activo y funcional simplemente ejecutando el comando swapon o swapon --show.

La siguiente captura muestra lo explicado:

zramctl swapon zram swap zswap

Para cargar esta configuración al inicio del sistema podría crearse un script similar a este:

#!/bin/bash
modprobe zram
su -c "echo $((512*1024*1024)) > /sys/block/zram0/disksize "
mkswap /dev/zram0 
swapon -p 50 /dev/zram0 

Y ejecutarlo al arrancar el sistema, o cargarlo en archivos de inicio del usuario como ~/.xinirtc (aunque no sería del todo elegante :P).

Zram Swap automatizados

En algunas distros existen paquetes que facilitan la administración de dispositivos zram como swap… es decir, que no hay que hacer todo esto a mano.

Yo lo he probado en Debian y Arch Linux, así que va mi tutorial para ambos.

Debian: zram-tools y zramswap

En Debian existe un paquete llamado zram-tools, que puede instalarse de esta forma:

sudo apt install zram-tools

Luego debemos modificar el archivo de configuración y establecer los parámetros necesarios. En mi caso, el archivo fue: /etc/default/zramswap, y descomenté un par de líneas para no usar los parámetros por defecto:

# Specifies amount of zram devices to create.
# By default, zramswap-start will use all available cores.
#CORES=1

# Specifies the amount of RAM that should be used for zram
# based on a percentage the total amount of available memory
#PERCENTAGE=10

# Specifies a static amount of RAM that should be used for
# the ZRAM devices, this is in MiB
SIZE=1024

# Specifies the priority for the swap devices, see swapon(2)
# for more details.
PRIORITY=100

Particularmente, activé las líneas SIZE y PRIORITY. Finalmente reinicié el servicio:

sudo zramswap restart
# o
sudo systemctl restart zramswap.service

Y ya pude disponer de la configuración deseada.

Arch Linux

En esta distro, y supongo que también en derivados, puede instalarse el paquete systemd-swap, cuyo archivo de configuración es /etc/systemd/swap.conf.

sudo pacman -S systemd-swap

Este archivo tiene varias secciones, entre ellas:

  • Zswap: para configurar un dispositivo de cache comprimida entre la RAM y el espacio de intercambio (seguramente en un futuro publique algo al respecto).
  • Zram: para configurar dispositivos zram como swap (tema de hoy).
  • Swap file: archivos de intercambio a modo de partición swap.
  • Swap device: partición tradicional de intercambio.

Cada apartado tiene su opción «XXXX_enabled=«, que puede estar seteado a 0 (desactivado) o 1 (activado). En mi caso particular configuré dispositivos zram como swap únicamente, por lo que la única opción activa fue la de zram (omito las demás, ya que las tengo desactivadas):

# ZRam
#
# Kernel >= 3.15
# Zram compression streams count for additional information see:
# https://www.kernel.org/doc/Documentation/blockdev/zram.txt
zram_enabled=1
zram_size=$(($RAM_SIZE/4))      # This is 1/4 of ram size by default.
zram_streams=$NCPU
zram_alg=lz4                    # lzo lz4 deflate lz4hc 842 - for Linux 4.8.4
zram_prio=200                 # 1 - 32767

En este caso esta configuración permitió crear un total de memoria de intercambio de 1/4 de la memoria RAM instalada. Esto se especificó en zram_size. A su vez, como mi procesador tiene 4 núcleos, este espacio de intercambio fue dividido en 4 dispositivos zram para mejorar el rendimiento (zram_streams). La prioridad para cada dispositivo fue de 200 (zram_prio).

Luego tocó reiniciar el servicio:

sudo systemctl restart systemd-swap.service

El resultado final:

zram swap zswap swapon

¿Qué tamaño debe tener? ¿Cuántos dispositivos? En general se recomienda un dispositivo por core del microprocesador. El tamaño total de la swap en RAM puede variar dependiendo del uso.

En mi caso, con las aplicaciones que uso normalmente, no suelo tener un uso de swap elevado, incluso podría reducir su tamaño, aunque esto no me resulta prioritario ya que los dispositivos zram no consumen espacio real en la memoria cuando están vacíos.

Conclusiones… y zswap?

Hemos aprendido a montar nuestros dispositivos de swap comprimidos en RAM. Esta técnica está aconsejada para equipos en los que la memoria RAM llega a ser insuficiente, principalmente aquellos que tienen menos de 4GiB de memoria principal, y dependiendo también de las aplicaciones que corramos.

Existe otra técnica denominada zswap, que puede causar algunas confusiones. Zswap no es lo mismo que zram como swap. Algunas diferencias entre ambos pueden ser:

  • Implementación: mientras zram implementa dispositivos de bloques comprimidos y dinámicamente ubicados en la RAM, zswap es una caché en el kernel Linux para páginas de memoria de intercambio, es decir, es un almacenamiento de cache de swap en RAM.
  • Uso: zram se utiliza para eliminar la necesidad de dispositivos de intercambio en disco o archivos. Zswap realiza cache de páginas almacenadas en el dispositivo de swap, por lo que éste será necesario.
  • Beneficios: Zram como swap permite eliminar la necesidad de un dispositivo de swap físico en memoria secundaria, y además, zram es un dispositivo de bloques de uso genérico, como comentamos antes, por lo que no está limitado a su uso como memoria de intercambio. Zswap por su parte reduce el uso de la memoria swap secundaria, enviando únicamente a la swap en disco las páginas de intercambio más antiguas.
  • Inconvenientes: en zram, una vez que las páginas son almacenadas en el dispositivo virtual se mantendrán hasta que se eliminen o marquen como inválidas. Esto quiere decir que si el dispositivo zram se llena por el intercambio, por más que estén cargadas páginas viejas y poco accedidas, las páginas nuevas, o de acceso más frecuente, no se podrán cargar (compcache, el predecesor de zram, tenía una opción para volcar a swap física las páginas menos usadas). Este inconveniente se podría sortear añadiendo un dispositivo swap físico con menor prioridad (necesito verificar documentación al respecto antes de afirmar nada :P).
    Zswap por otro lado requiere un dispositivo físico de swap, o un swap file.

Por mi parte llevo ya un tiempo usando zram como dispositivo de intercambio en Arch Linux y en Debian, y todo perfecto. Si lo probaste, o lo estás usando, o tenés alguna experiencia que quieras compartir, espero tu comentario! Seguramente a más de un visitante le resulte útil.

Espero les sirva, y será hasta la próxima!!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: Linux

Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador