Tenemos un dispositivo zram de 80 GB definido en nuestro host, y dentro de este un sistema de archivos ext4 de 170 GB:
echo 170G > /sys/block/zram0/disksize
echo 80G > /sys/block/zram0/mem_limit
/usr/sbin/mkfs.ext4 -q -m 0 /dev/zram0
/usr/bin/mount /dev/zram0 /var/zram
Nuestra aplicación utiliza este sistema de archivos para acceder rápidamente a grandes cantidades de datos efímeros.
El tamaño del sistema de archivos que se muestra en df
coincide con el tamaño de zram como se informa en/sys/block/zram0/disksize
Al copiar los datos de prueba en un sistema de archivos vacío, verificamos que se logra una relación de compresión de 2,2: 1, por lo que el sistema de archivos se llena antes de alcanzar el límite de memoria de zramfs. El /sys/block/zram0/orig_data_size
valor coincide con el uso informado por el sistema de archivos:
# expr `cat orig_data_size` / 1024 ; df -k /dev/zram0
112779188
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/zram0 175329308 112956600 62356324 65% /var/zram
Sin embargo, cuando la aplicación se ejecuta con datos en vivo durante un período más largo, descubrimos que ya no coincide.
# expr `cat orig_data_size` / 1024 ; df -k /dev/zram0
173130200
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/zram0 175329308 112999496 62313428 65% /var/zram
Ahora, el sistema de archivos informa un uso de aproximadamente 110 GB, pero el dispositivo zramfs informa 165 GB. Al mismo tiempo, la memoria de zramfs se agota y el sistema de archivos pasa a ser de sólo lectura.
Las cifras de zram confirman que estamos obteniendo una relación de compresión de 2,2: 1 entre orig_data_size y compr_data_size; sin embargo,¿Por qué el sistema de archivos muestra mucho más espacio libre que el dispositivo zram? Incluso si se trata de espacio ya asignado para su reutilización por el sistema de archivos, ¿no debería reutilizarse en lugar de asignar espacio nuevo?
Los datos constan de una gran cantidad de archivos pequeños que se agregan y eliminan a intervalos irregulares.
Respuesta1
La causa de esto resulta ser que cuando se eliminan archivos del sistema de archivos ext4 que se encuentra en el dispositivo zram0, la memoria no se libera nuevamente al sistema. Esto significa que, aunque el espacio está disponible para que lo use el sistema de archivos (la salida de df
), todavía se le asigna memoria (las estadísticas en /sys/block/zram0
). Como resultado, el uso de memoria alcanza el 100% de la asignación, aunque el sistema de archivos todavía se encuentra medio lleno debido a las eliminaciones.
Esto significa que aún puede llenar el sistema de archivos y los archivos nuevos no utilizarán tanto espacio de memoria nuevo; sin embargo, afecta negativamente la relación de compresión.
La solución es montar el sistema de archivos con las opciones discard
y noatime
. Los discard
lanzamientos liberaron espacio de archivos en el dispositivo de memoria y, como resultado, el uso en las dos coincidencias volvió a ser posible.