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

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

Y una vez dentro estableceremos los siguiente valores en bytes

Bash
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

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

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

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

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

ColumnaSignificadoExplicación
timeHora del muestreoTimestamp exacto de cuándo se capturó la métrica (formato HH:MM:SS)
readLecturas totales del ARCOperaciones de lectura que acceden al caché ARC (en MB/s)
ddreadLecturas de datos deduplicadosLecturas de bloques que han sido deduplicados (en MB/s). Alto valor = deduplicación activa
ddh%Hit ratio de datos deduplicadosPorcentaje de aciertos en el caché ARC para datos deduplicados (0-100%)
dmreadLecturas de metadataLecturas de metadata del pool (índices, inodos, etc.) en MB/s
dmh%Hit ratio de metadataPorcentaje de aciertos en el caché ARC para metadata (0-100%)
preadLecturas prefetchedLecturas anticipadas/predichas por el prefetcher de ZFS (en MB/s)
ph%Hit ratio de prefetchPorcentaje de aciertos del prefetcher en el caché (0-100%)
sizeTamaño actual del ARCMemoria actual utilizada por el caché ARC (en GB, KB, MB, etc.)
cTarget size del ARCTamaño objetivo/configurado del caché (tu zfs_arc_max)
availMemoria disponible del sistemaRAM 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.