Mr.PlanB Logo
    Volver al blog
    Almacenamiento
    ZFS
    Rendimiento

    Guía de configuración de ZFS para un rendimiento óptimo

    5 de enero de 2024
    10 min de lectura

    ZFS (Zettabyte File System) combina las funciones de un sistema de archivos tradicional y un gestor de volúmenes en una sola solución. Esta guía explica cómo instalar, configurar, optimizar y mantener ZFS para lograr un rendimiento sólido en tu homelab.

    Why ZFS Hates Hardware RAID

    ¿Qué hace diferente a ZFS?

    El cálculo integrado de sumas de comprobación detecta y corrige la corrupción silenciosa de datos, mientras que las instantáneas proporcionan copias inmediatas y eficientes en espacio de un punto temporal concreto. RAID-Z es un RAID por software que ofrece mejor rendimiento que un RAID por hardware convencional. ZFS también incluye compresión transparente para ahorrar espacio, deduplicación para eliminar bloques de datos duplicados y la caché ARC, un sistema de almacenamiento en memoria inteligente pensado para acelerar el acceso a los datos.

    Requisitos del sistema

    Requisitos mínimos

    Como mínimo necesitas 8GB de RAM (se recomiendan 16GB o más), cualquier procesador de 64 bits y al menos 2 unidades para tener redundancia.

    Configuración recomendada

    Calcula 1GB de RAM por cada TB de almacenamiento, o 5GB por cada TB si utilizas deduplicación. Un procesador multinúcleo mejora el rendimiento, y los discos deben ser unidades para empresas con protección frente a cortes de alimentación.

    Instalación de ZFS

    Ubuntu y Debian

    sudo apt update
    sudo apt install zfsutils-linux
    

    Proxmox

    ZFS viene incluido de serie en Proxmox, así que puedes comprobar la versión instalada al instante:

    zfs version
    

    Creación de pools de ZFS

    Disco único (sin redundancia)

    Un pool con un único disco carece de redundancia, por lo que no se recomienda para datos en producción.

    sudo zpool create tank /dev/sdb
    

    Espejo o Mirror (RAID-1)

    Un espejo utiliza dos discos y cada uno almacena una copia íntegra de la información:

    sudo zpool create tank mirror /dev/sdb /dev/sdc
    

    RAID-Z1 (similar a RAID-5)

    RAID-Z1 necesita un mínimo de 3 discos y soporta el fallo de 1 disco:

    sudo zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd
    

    RAID-Z2 (similar a RAID-6)

    RAID-Z2 necesita un mínimo de 4 discos y soporta el fallo simultáneo de 2 discos:

    sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
    

    RAID-Z3

    RAID-Z3 necesita un mínimo de 5 discos y soporta el fallo simultáneo de 3 discos:

    sudo zpool create tank raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf
    

    Recomendaciones para pools de ZFS

    Entornos domésticos y oficinas pequeñas

    Con 3 o 4 discos, utiliza RAID-Z1. Con entre 5 y 8 unidades, emplea RAID-Z2. Con 9 o más discos, contempla RAID-Z3 o varios vdevs en RAID-Z2.

    Entornos empresariales y datos críticos

    Utiliza siempre RAID-Z2 o RAID-Z3, añade discos de repuesto en caliente (hot spares) y emplea unidades para empresas.

    Optimización del rendimiento de ZFS

    Ajuste de la caché ARC

    Para limitar el tamaño de la caché ARC, define los valores máximo y mínimo en /etc/modprobe.d/zfs.conf:

    # Limit ARC to 8GB
    options zfs zfs_arc_max=8589934592
    
    # Minimum ARC size
    options zfs zfs_arc_min=4294967296
    

    A continuación, regenera el initramfs y reinicia el equipo para aplicar los cambios:

    sudo update-initramfs -u
    sudo reboot
    

    Habilitar la compresión

    La compresión LZ4 es rápida y ahorra espacio de forma transparente. Actívala en el pool con:

    sudo zfs set compression=lz4 tank
    

    Configuración del tamaño de registro (recordsize)

    Para bases de datos con operaciones de E/S aleatorias pequeñas, utiliza un tamaño de registro reducido:

    sudo zfs set recordsize=16K tank/database
    

    Para archivos multimedia con lecturas y escrituras secuenciales grandes, define un bloque mayor:

    sudo zfs set recordsize=1M tank/media
    

    Desactivar la actualización de fecha de acceso (atime)

    Desactivar las actualizaciones de fecha de acceso mejora el rendimiento general. Aplica este cambio en el pool con:

    sudo zfs set atime=off tank
    

    Habilitar el trim automático

    Si el pool está configurado sobre unidades SSD, activa la opción autotrim:

    sudo zpool set autotrim=on tank
    

    Gestión de datasets

    Crear datasets

    sudo zfs create tank/documents
    sudo zfs create tank/photos
    sudo zfs create tank/videos
    

    Establecer cuotas

    sudo zfs set quota=100G tank/documents
    

    Establecer reservas de espacio

    sudo zfs set reservation=50G tank/database
    

    Listar datasets

    zfs list
    

    Instantáneas (Snapshots)

    Crear una instantánea

    sudo zfs snapshot tank/documents@backup-2024-01-15
    

    Listar instantáneas

    zfs list -t snapshot
    

    Revertir a una instantánea

    sudo zfs rollback tank/documents@backup-2024-01-15
    

    Eliminar una instantánea

    sudo zfs destroy tank/documents@backup-2024-01-15
    

    Instantáneas automatizadas

    Instala Sanoid para la gestión automatizada de instantáneas en tus datasets:

    sudo apt install sanoid
    

    A continuación, define tus datasets y una plantilla de retención en /etc/sanoid/sanoid.conf:

    [tank/documents]
        use_template = production
        recursive = yes
    
    [template_production]
        frequently = 0
        hourly = 24
        daily = 7
        monthly = 12
        yearly = 0
        autosnap = yes
        autoprune = yes
    

    Envío y recepción de datos (Replicación)

    Enviar una instantánea a un archivo

    sudo zfs send tank/documents@backup | gzip > backup.gz
    

    Recibir una instantánea desde un archivo

    gunzip -c backup.gz | sudo zfs receive tank/restore
    

    Replicación incremental

    Comienza enviando una réplica inicial completa del dataset hacia el servidor de backup:

    sudo zfs send tank/documents@initial | ssh user@backup-server \
      sudo zfs receive backup/documents
    

    Los envíos incrementales posteriores transferirán únicamente las modificaciones realizadas desde la instantánea previa:

    sudo zfs send -i @initial tank/documents@today | ssh user@backup-server \
      sudo zfs receive backup/documents
    

    Monitorización de ZFS

    Estado del pool

    sudo zpool status
    

    Estadísticas de E/S del pool

    sudo zpool iostat -v 2
    

    Estadísticas de la caché ARC

    cat /proc/spl/kstat/zfs/arcstats
    

    También puedes utilizar arc_summary para obtener un informe formateado y fácil de interpretar:

    sudo arc_summary
    

    Uso del dataset

    zfs list -o name,used,avail,refer,mountpoint
    

    Comprobación de errores

    sudo zpool status -v
    

    Mantenimiento

    Comprobación de integridad del pool (Scrub)

    Las operaciones periódicas de scrub comprueban la integridad de cada bloque. Lanza una revisión manual en el pool con:

    sudo zpool scrub tank
    

    Mientras la tarea se ejecuta, puedes seguir su evolución con el comando de estado:

    sudo zpool status
    

    Para planificar revisiones mensuales de forma automática, añade esta línea en tu crontab:

    # Run on the first Sunday of each month at 2 AM
    0 2 1-7 * * [ "$(date +\%u)" = "7" ] && /sbin/zpool scrub tank
    

    Sustitución de un disco averiado

    sudo zpool replace tank /dev/sdb /dev/sdf
    

    Tras cambiar la unidad, vigila el proceso de reconstrucción (resilver) hasta que concluya:

    watch -n 5 zpool status
    

    Añadir un repuesto en caliente

    sudo zpool add tank spare /dev/sdg
    

    Resolución de incidencias

    El pool no se importa

    Si un pool no se importa de la manera habitual, puedes forzar la importación:

    sudo zpool import -f tank
    

    Pool en estado degradado

    Si el pool está degradado, empieza revisando el informe detallado de estado:

    sudo zpool status -v
    

    Si los fallos fueron puntuales, restablece los contadores de errores del pool con:

    sudo zpool clear tank
    

    Espacio agotado

    Cuando el pool se queda sin espacio, comprueba el almacenamiento consumido por datasets e instantáneas:

    zfs list -o name,used,avail,refer
    zfs list -t snapshot
    

    Después, borra las instantáneas antiguas que ya no necesites para liberar bloques:

    sudo zfs destroy tank/documents@old-snapshot
    

    Problemas de rendimiento

    Ante caídas de velocidad, revisa primero el porcentaje de aciertos en la caché ARC:

    sudo arc_summary | grep "Hit Rate"
    

    A continuación, comprueba el nivel de fragmentación del pool con el comando de listado:

    sudo zpool list -o name,fragmentation
    

    Buenas prácticas

    Qué debes hacer

    • Utiliza memoria RAM con ECC para proteger la integridad de los datos.
    • Ejecuta tareas de scrub periódicas (una vez al mes).
    • Habilita la compresión (lz4).
    • Realiza instantáneas con regularidad.
    • Pon a prueba tus backups con restauraciones reales.
    • Supervisa la salud del pool de forma continua.
    • Asigna discos enteros en lugar de particiones sueltas.

    Qué debes evitar

    • No superes nunca el 80% de capacidad del pool.
    • No construyas un RAID-Z mezclando discos de distintos tamaños.
    • Evita la deduplicación a menos que dispongas de 5GB de RAM por cada TB.
    • No intentes ampliar vdevs RAID-Z añadiendo discos sueltos (operación no soportada).
    • Nunca utilices discos de gama doméstica sin pruebas rigurosas previas.
    • No ignores jamás los avisos o errores reportados por un scrub.

    Características avanzadas

    Cifrado

    Para crear un dataset cifrado y protegido por una frase de paso, ejecuta:

    sudo zfs create -o encryption=aes-256-gcm \
      -o keyformat=passphrase tank/secure
    

    Deduplicación

    La deduplicación exige una cantidad sustancial de memoria RAM. Puedes activarla en un dataset con:

    sudo zfs set dedup=on tank/vms
    

    Recursos compartidos NFS

    sudo zfs set sharenfs=on tank/share
    sudo zfs set sharenfs="rw=@192.168.1.0/24" tank/share
    

    Recursos compartidos SMB

    sudo zfs set sharesmb=on tank/share
    

    Pruebas de rendimiento

    Evalúa la velocidad de escritura secuencial generando un archivo de prueba grande mediante dd:

    dd if=/dev/zero of=/tank/testfile bs=1M count=10000
    

    Prueba la lectura secuencial volviendo a leer ese mismo archivo:

    dd if=/tank/testfile of=/dev/null bs=1M
    

    Para evaluaciones más completas y representativas, instala fio y ejecuta una prueba de escritura secuencial:

    sudo apt install fio
    fio --name=seqwrite --rw=write --bs=1M --size=10G \
      --filename=/tank/testfile
    

    Conclusión

    ZFS traslada funciones de almacenamiento empresarial a tu homelab. Con una configuración acertada y el mantenimiento adecuado, proporciona una integridad de datos sobresaliente y un rendimiento muy sólido. Recuerda emplear RAID-Z2 para la información crítica, activar la compresión LZ4, programar scrubs regulares, crear instantáneas con frecuencia, monitorizar la salud del pool y no superar nunca el 80% de su capacidad.

    Recursos adicionales