ZFS ARC consume mucha RAM en Proxmox: Cómo limitarlo en 5 minutos

Por Jose FYS

Hoy vamos a hablar a raiz de un problema con la memoria RAM de mi Homelab.

Basicamente lo que pasaba es que cada vez que conectaba al dashbloard de Proxmox, desde Summary veia que la RAM estaba ocupando casi por completo los 16gb de RAM del servidor.

Echando cálculos de la memoria RAM que tenían asignados todos los contenedores LXC y maquinas virtuales quemu vi que ni de broma llegaban a consumir los 16GB de RAM que tenía mi sistema.

¿Qué narices pasaba? Nuestro querido ZFS ARC.

En este guía doy los pasos necesarios y rápidos para establecer este límite de memoria RAM.

Si no te apetece leer también está la opción de ver el ejemplo practico en el siguiente video de 2 minutos

¿Cómo sé cuánto poner? La recomendación oficial de Proxmox es:

2 GB base + 1 GB por cada TB de almacenamiento disponible en el pool

En mi caso, tengo 10TB de almacenamiento, así que: 2 + 10 = 12 GB. En este caso una barbaridad de RAM teniendo en cuenta que la memoria RAM de la que dispongo es de 16GB

Aquí tenemos que ver la mejor opción para el servidor y poder disponer de RAM tanto para Proxmox PVE, máquinas virtuales (quemu) y los contenedores lxc.

Modificar ZFS ARM en nuestro Proxmox

Bien, en este caso querremos establecer un minimo y un maximo de uso de memoria RAM en nuestro proxmox.

Para este caso como estamos con un HP Microserver Gen8 el cual tiene de máximo 16GB de RAM, por lo que le estableceremos un minimo de 2GB y un maximo de 6GB. Que le establezamos el maximo de 6GB no quiere decir que vaya a estar siempre gastando 6GB.

Para ello tendremos que acceder al siguiente fichero

Bash

nano /etc/modprobe.d/zfs.conf

nano /etc/modprobe.d/zfs.conf

Y una vez dentro estableceremos los siguiente valores en bytes

Bash

options zfs zfs_arc_min=2147483648 options zfs zfs_arc_max=6442450944

options zfs zfs_arc_min=2147483648
options zfs zfs_arc_max=6442450944

Una vez establecido, tendremos que actualizar initramfs para que nos aplique los nuevos valores mínimos y máximos de RAM.

Bash

update-initramfs -u -k all

update-initramfs -u -k all

Dependiende de nuestra instalación de Proxmox ya haya sido EUFI o no es posibles que nos salgan unos mensajes como los siguientes. Estos errores no hay que hacerles caso ya que es normal.

Despues reiniciamos nuestra máquina física de Proxmox. Aunque en Linux supuesamente no es necesario reiniciar, hay para determinados procesos como puede ser este que necesita el reinicio de la máquina física.

Verificar los cambios de ZFS arc

Bash

cat /sys/module/zfs/parameters/zfs_arc_min cat /sys/module/zfs/parameters/zfs_arc_max

cat /sys/module/zfs/parameters/zfs_arc_min
cat /sys/module/zfs/parameters/zfs_arc_max

Nos tienen que aparecer los valores asignados en el punto anterior.

Otra forma de comprobarlo es con un comando más detallado. Nos enseñará el status actual de ARC y aparte el mínimo y máximo que establecimos.

Bash

arc_summary | head -20

arc_summary | head -20

Mostrar consumo actual de RAM en ARC

Este comando que voy a enseñar me parece buenísimo ya que vamos a ver en tiempo real el consumo que está haciendo ARC.

Con este comando durante los próximos 10 segundos nos mostrará

Bash

arcstat 1 10

arcstat 1 10

Una vez lanzado nos mostrará algo como esto:

Vemos que tenemos el size de 6GB, que es lo que está utilizando en este momento; nuestro máximo.

Igualmente para entender lo que significa cada columna de este comando dejo por aquí esta tabla explicativa

Columna

Significado

Explicación

time

Hora del muestreo

Timestamp exacto de cuándo se capturó la métrica (formato HH:MM:SS)

read

Lecturas totales del ARC

Operaciones de lectura que acceden al caché ARC (en MB/s)

ddread

Lecturas de datos deduplicados

Lecturas de bloques que han sido deduplicados (en MB/s). Alto valor = deduplicación activa

ddh%

Hit ratio de datos deduplicados

Porcentaje de aciertos en el caché ARC para datos deduplicados (0-100%)

dmread

Lecturas de metadata

Lecturas de metadata del pool (índices, inodos, etc.) en MB/s

dmh%

Hit ratio de metadata

Porcentaje de aciertos en el caché ARC para metadata (0-100%)

pread

Lecturas prefetched

Lecturas anticipadas/predichas por el prefetcher de ZFS (en MB/s)

ph%

Hit ratio de prefetch

Porcentaje de aciertos del prefetcher en el caché (0-100%)

size

Tamaño actual del ARC

Memoria actual utilizada por el caché ARC (en GB, KB, MB, etc.)

c

Target size del ARC

Tamaño objetivo/configurado del caché (tu zfs_arc_max)

avail

Memoria disponible del sistema

RAM disponible libre en el sistema (no usada por nada)


Con esta guía rápida ya tendremos limitada la memoria RAM para ARC y no nos llevaremos disgustos con los consumos. Y como siempre, ya es costumbre decir: Si este post te ha ayudado, compártelo con otros administradores que puedan beneficiarse. Y sígueme para más experiencias reales desde las trincheras del homelab.