Jump to content

zram (Español)

From ArchWiki

zram, anteriormente denominado compcache, es un módulo del núcleo de Linux que permite crear un dispositivo de bloques comprimido en la memoria RAM, es decir, un disco RAM con compresión entiempo real. El dispositivo de bloques creado con zram puede utilizarse como espacio de intercambio o como disco RAM de uso general. Los dos usos más habituales de zram son el almacenamiento de archivos temporales (/tmp) y como dispositivo de intercambio. Inicialmente, zram solo tenía esta última función, de ahí su nombre original «compcache» («caché comprimida»).


Uso de la swap

Inicialmente, el dispositivo de bloques zram creado, no reserva ni utiliza memoria RAM. Solo cuando sea necesario o se desee traspasar archivos a la memoria de intercambio, estos se comprimirán y se trasladarán al dispositivo de bloques zram. A continuación, el dispositivo de bloques zram aumentará o se reducirá dinámicamente según sea necesario.

Incluso suponiendo que zstd solo alcance una relación de compresión conservadora de 1:2 (los datos del mundo real muestran una relación habitual de 1:3), zram ofrecerá la ventaja de poder almacenar más contenido en la RAM que sin compresión de memoria.


Nota
  • Al configurar zram, el tamaño del dispositivo zram determina la cantidad máxima de datos sin comprimir que puede almacenar, no el tamaño máximo comprimido. Puedes configurar el tamaño de zram para que sea igual o incluso superior a la capacidad de la RAM física de tu sistema, siempre y cuando el tamaño comprimido en la RAM física no supere la capacidad de la RAM física de tu sistema.
  • Si la función del núcleo zswap permanece activada, impedirá que zram se utilice de forma eficaz. Esto se debe a que zswap actúa como una caché de intercambio delante de zram, interceptando y comprimiendo las páginas de memoria expulsadas antes de que puedan llegar a zram. A pesar de lo que indica la salida de zramctl(8), la mayor parte de zswap queda sin utilizar en estas circunstancias. Por lo tanto, se recomienda desactivar zswap de forma permanente mediante el parámetro del núcleo o la configuración de sysfs antes de iniciar el sistema.
  • No se admite la hibernación en el espacio de intercambio de zram, ni siquiera cuando zram está configurado con un dispositivo de respaldo en un almacenamiento permanente. logind impedirá que se intente hibernar en un espacio de intercambio de zram.
Tip Puedes especificar la cantidad máxima de memoria que zram puede utilizar para almacenar los datos comprimidos mediante el parámetro mem_limit

Un tamaño sencillo con el que empezar es la mitad de la memoria total del sistema.

Manualmente

Para configurar un dispositivo zram comprimido con zstd con la mitad de la capacidad de memoria del sistema y una prioridad superior a la normal (solo para la sesión actual):

# modprobe zram
# zramctl /dev/zram0 --algorithm zstd --size "$(($(grep -Po 'MemTotal:\s*\K\d+' /proc/meminfo)/2))KiB"
# mkswap -U clear /dev/zram0
# swapon --discard --priority 100 /dev/zram0

Para desactivarlo de nuevo, reinicia el sistema o ejecuta:

# swapoff /dev/zram0
# modprobe -r zram

En el siguiente documento se ofrece una explicación detallada de todos los pasos, opciones y posibles problemas:documentación oficial del módulo zram.

Para una solución definitiva, sigue uno de los métodos que se describen en las siguientes secciones.

Uso de una regla de udev

El ejemplo siguiente describe cómo configurar automáticamente el espacio de intercambio en zram al arrancar el sistema mediante una única regla de udev y una entrada en fstab. No se necesitan paquetes adicionales para que esto funcione.

Explicitamente Carga automática de módulos:

/etc/modules-load.d/zram.conf
zram

Crea la siguiente udev rule ajustando el atributo disksize según sea necesario:

/etc/udev/rules.d/99-zram.rules
ACTION=="add", KERNEL=="zram0", ATTR{initstate}=="0", ATTR{comp_algorithm}="zstd", ATTR{disksize}="4G", TAG+="systemd"

Añade /dev/zram a tu fstab con una prioridad superior a la predeterminada y la opción x-systemd.makefs :

/etc/fstab
/dev/zram0 none swap defaults,discard,pri=100,x-systemd.makefs 0 0

Usando zram-generator

zram-generator es un proyecto relacionado con systemd, alojado en GitHub organization que utiliza sus convenciones y mecanismos.

Proporciona systemd-zram-setup@zramN.service para inicializar automáticamente los dispositivos zram sin que los usuarios tengan que enable/start la plantilla o sus instancias. Consulta zram-generator(8).

Para usarlo, instale zram-generator, y cree el archivo /etc/systemd/zram-generator.conf con el siguiente contenido:

/etc/systemd/zram-generator.conf
[zram0]

Esto es suficiente para crear un dispositivo zram llamado zram0 con las opciones predeterminadas (consulte zram-generator.conf(5) para ver sus valores actuales).

Por defecto, el dispositivo zram utilizará la mitad del tamaño de la RAM pero no mas de 4 GiB: por ejemplo. creará un dispositivo zram de 2 GiB si tiene 4 GiB de RAM, pero solo un dispositivo zram de 4 GiB si tiene 8 GiB de memoria o más.

Si desea cambiarlo, utilice el parámetro zram-size:

/etc/systemd/zram-generator.conf
[zram0]
zram-size = min(ram / 2, 16384)

Esto permitirá que el dispositivo zram utilice la mitad de la cantidad total de memoria, hasta 16 GiB. Esto permitirá que el dispositivo zram utilice la mitad de la memoria total, hasta un máximo de 16 GiB. (min(x,y) compara los dos valores y elige el menor).

  • Si desea permitir incondicionalmente que el dispositivo zram utilice la mitad de la memoria, utilice zram-size = ram / 2
  • Para un tamaño fijo, utilice e.j. zram-size = 8192.

Consulte zram-generator.conf(5) § EJEMPLOS para ver gráficos y un ejemplo más complejo.

Para usar un algoritmo de compresión diferente al predeterminado del kernel, utilice: compression-algorithm:

/etc/systemd/zram-generator.conf
[zram0]
compression-algorithm = lzo-rle zstd(level=3) (type=idle)

Los algoritmos subsiguientes se utilizan para la recompresión.

Consulte zram-generator.conf(5) para ver la lista de todas las opciones disponibles

Una vez definida la configuración, ejecute daemon-reload y start con servicio que haya configurado systemd-zram-setup@zramN.service ( donde N coincida con el ID numérico de la instancia; en el ejemplo es systemd-zram-setup@zram0.service).

Puede comprobar el estado de la swap del o de los dispositivo(s) /dev/zramN leyendo la instancia unit status de su(s) systemd-zram-setup@zramN.service, utilizando zramctl(8), o swapon(8).

Usando zramswap

zramswapAUR ofrece un script automatizado para configurar un espacio de intercambio con una prioridad más alta y un tamaño predeterminado del 20 % de la memoria RAM de tu sistema. Para que esto se realice automáticamente en cada arranque, activa el servicio, zramswap.service.

Consejos y trucos

Comprobación de las estadísticas de zram

Utiliza zramctl(8). Ejemplo:

$ zramctl
NAME       ALGORITHM DISKSIZE  DATA  COMPR  TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd           32G  1.9G 318.6M 424.9M         [SWAP]
  • DISKSIZE = 32G: este dispositivo zram almacenará hasta 32 GiB de datos sin comprimir.
  • DATA = 1.9G: actualmente, hay 1,9 GiB (sin comprimir) de datos almacenados en este dispositivo zram.
  • COMPR = 318.6M: los 1,9 GiB de datos sin comprimir se han comprimido a 318,6 MiB
  • TOTAL = 424.9M: incluyendo los metadatos, los 1,9 GiB de datos sin comprimir ocupan 424,9 MiB de RAM física

Algoritmo de compresión

Utiliza cat /sys/block/zramN/comp_algorithm tras crear el dispositivo zram N para obtener los algoritmos de compresión disponibles, así como el que está seleccionado actualmente (que aparece entre paréntesis).

Resultados con linux 6.17.9.arch1-1 utilizando las opciones predeterminadas:

lzo-rle lzo lz4 lz4hc [zstd] deflate 842

Varios dispositivos zram

Por defecto, al cargar el módulo zram se crea un único dispositiv /dev/zram0 .

Si necesitas más de un dispositivo /dev/zram, especifica la cantidad utilizando num_devices Manipulación manual de módulos o Añadir o eliminar dispositivos zram.

Optimización swap en zram

Dado que zram se comporta de forma diferente a swap en el disco, podemos configurar el espacio de intercambio del sistema para aprovechar al máximo sus ventajas:

/etc/sysctl.d/99-vm-zram-parameters.conf
vm.swappiness = 180
vm.watermark_boost_factor = 0
vm.watermark_scale_factor = 125
vm.page-cluster = 0

Explicación de la configuración:

Estos son los valores que utiliza what Pop!_OS. Esa solicitud de incorporación de cambios de Pop!_OS en GitHub, también incluye enlaces a algunas pruebas realizadas por usuarios en some testing done by users on r/Fedora, que determinaron que vm.page-cluster = 0 es el valor ideal. También concluyeron que un valor elevado de swappiness es lo ideal, lo que coincide con lo que sugiere the kernel docs:

El valor por defecto es 60.
Para el espacio de intercambio en memoria, como zram o zswap, así como para configuraciones híbridas que cuentan con espacio de intercambio en dispositivos más rápidos que el sistema de archivos, se pueden considerar valores superiores a 100. Por ejemplo, si la E/S aleatoria en el dispositivo de intercambio es, de media, dos veces más rápida que la E/S del sistema de archivos, el valor de «swappiness» debería ser 133 (x + 2x = 200, 2x = 133,33).

En un sistema con un disco duro, las E/S aleatorias en el dispositivo en memoria serían varios órdenes de magnitud más rápidas que las E/S en el sistema de archivos, por lo que el valor de «swappiness» debería ser de aproximadamente 200. Incluso en un sistema con un SSD rápido, un valor alto de «swappiness» puede ser ideal.

Activación de un dispositivo de respaldo para un bloque zram

zram se puede configurar para enviar páginas no comprimibles a un dispositivo de bloque específico:

Para añadir un dispositivo de respaldo manualmente:

# echo /dev/sdX > /sys/block/zram0/backing_dev

Para añadir un dispositivo de respaldo a tu dispositivo de bloque zram mediante zram-generator, actualiza el archivo /etc/systemd/zram-generator.conf con lo siguiente en tu dispositivo [zramX] al que quieres añadir el dispositivo de respaldo:

/etc/systemd/zram-generator.conf
writeback-device=/dev/disk/by-partuuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

Las páginas incompresibles se pueden enviar al dispositivo de bloque ejecutando lo siguiente:

# echo huge > /sys/block/zramX/writeback

Uso de zram con fines distintos a swap

zram también se puede utilizar como un dispositivo de bloques genérico respaldado por RAM, por ejemplo, un /dev/ram que consume menos memoria física, aunque con un rendimiento ligeramente inferior. Sin embargo, hay que tener en cuenta algunas salvedades:

  • No hay compatibilidad con tablas de particiones (no se crea automáticamente /dev/zramxpy).
  • El tamaño del bloque es fijo 4 kiB.

La forma más obvia de solucionar esto es montar un dispositivo loop sobre el zram mediante losetup, especificando el tamaño de bloque deseado con la opción -b y utilizando la opción -P ara procesar las tablas de particiones y la creación automática de los dispositivos loop de las particiones.

# zramctl -f -s NG
/dev/zramx

Copia la imagen de disco en el nuevo /dev/zramx, y, a continuación, crea un dispositivo de bucle. Si la imagen de disco tiene una tabla de particiones, el tamaño de bloque del dispositivo de bucle debe coincidir con el tamaño de bloque utilizado por la tabla de particiones, que suele ser de 512 o 4096 bytes.

# losetup -f -b 512 -P /dev/zramx
# ls /dev/loop*
/dev/loop0 /dev/loop0p1 /dev/loop0p2
# mount /dev/loop0p1 /mnt/boot
# mount /dev/loop0p2 /mnt/root
Note
  • La numeración de los dispositivos zram depende de los dispositivos zram ya existentes, y su tamaño debe ser suficiente para albergar la imagen de disco.
  • El resultado del comando ls /dev/loop* depende del contenido de la imagen de disco.

Véase también