zram (Español)
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.
- 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.
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
- 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.