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

Since zram behaves differently than disk swap, we can configure the system's swap to take full potential of the zram advantages:

/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

Explanation of the configuration:

These values are what Pop!_OS uses. That Pop!_OS GitHub pull request also links to some testing done by users on r/Fedora, which determined that vm.page-cluster = 0 is ideal. They also found a high swappiness value to be ideal, which matches what is suggested by the kernel docs:

The default value is 60.
For in-memory swap, like zram or zswap, as well as hybrid setups that have swap on faster devices than the filesystem, values beyond 100 can be considered. For example, if the random IO against the swap device is on average 2x faster than IO from the filesystem, swappiness should be 133 (x + 2x = 200, 2x = 133.33).

On a system with a hard drive, random I/O against the in-memory device would be orders of magnitude faster than I/O against the filesystem, so swappiness should be ~200. Even on a system with a fast SSD, a high swappiness value may be ideal.

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

zram can be configured to push incompressible pages to a specified block device:

To add a backing device manually:

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

To add a backing device to your zram block device using zram-generator, update /etc/systemd/zram-generator.conf with the following under your [zramX] device you want the backing device added to:

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

Incompressible pages can then be pushed to the block device by executing:

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

Uso de zram con fines distintos a swap

zram can also be used as a generic RAM-backed block device, e.g. a /dev/ram with less physical memory usage, but slightly lower performance. However there are some caveats:

  • There is no partition table support (no automatic creation of /dev/zramxpy).
  • The block size is fixed to 4 kiB.

The obvious way around this is to stack a loop device on-top the zram, using losetup, specifying the desired block size using the -b option and the -P option to process partition tables and automatic creation of the partition loop devices.

# zramctl -f -s NG
/dev/zramx

Copy the disk image to the new /dev/zramx, then create a loop device. If the disk image has a partition table, the block size of the loop device must match the block size used by the partition table, which is typically 512 or 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
  • The zram device numbering depends on pre-existing zram devices and its size should be enough to hold the disk image.
  • The output from ls /dev/loop* depends on the contents of the disk image.

Véase también