Linux Adictos Pablinux  

OpenZFS 2.4.1: novedades más destacadas y cambios clave

OpenZFS 2.4.1

Cuando sale una nueva versión de OpenZFS siempre surge la misma duda entre administradores y entusiastas: ¿actualizar cuanto antes o esperar a que todo esté más rodado? Con la rama 2.4 la pregunta es aún más jugosa, porque no se trata de un simple parche de mantenimiento, sino de un salto importante en rendimiento, gestión del espacio y funciones avanzadas para pools híbridos. Además, alrededor de los candidates (RC) ha habido cierto debate en la comunidad, especialmente en su integración con sistemas como FreeBSD.

En este artículo vamos a repasar con calma las novedades más destacadas de OpenZFS 2.4.1, incluyendo los cambios específicos en Windows y macOS, el estado de los release candidates, y todas esas mejoras internas que, aunque no se vean a simple vista, marcan la diferencia en un entorno de producción. Si administras servidores Linux, FreeBSD, TrueNAS, o te estás peleando con ports para Windows u OSX, aquí vas a encontrar todo lo que necesitas saber para valorar el salto.

OpenZFS 2.4.1 y cambios específicos en Windows

La etiqueta zfswin-2.4.1rc1 recoge la adaptación de la rama 2.4.1 al entorno Windows, con foco muy claro en pools híbridos y vdevs especiales. Aquí se da un paso adelante al convertir los special vdev en piezas clave del rendimiento.

En esta versión, un vdev especial puede actuar como SLOG (ZFS Intent Log) para las escrituras síncronas. Esto permite aprovechar SSD o NVMe rápidos no solo para metadatos o bloques pequeños, sino también para centralizar las operaciones sync, algo especialmente útil en cargas de trabajo como bases de datos o sistemas de mensajería que dependen de confirmaciones de escritura inmediatas.

Además, los pools híbridos pueden diseñarse de forma que se aproveche al máximo la combinación de flash y discos mecánicos, incrementando la eficiencia en entornos Windows con necesidades de IOPS elevadas.

Otro cambio relevante es la capacidad de que el vdev especial guarde metadatos del filesystem, los archivos pequeños o incluso todos los archivos del dataset, en función de cómo se configure el tamaño de bloque pequeño (special_small_blocks). Si el bloque es 0, solo se guardan metadatos; si el tamaño es inferior al del archivo, los ficheros pequeños terminan en el vdev especial; y si recsize es menor o igual que ese umbral, es posible que prácticamente todos los archivos del filesystem terminen en la parte rápida del pool.

Combinando esa flexibilidad con herramientas como zfs rewrite, es posible mover datos entre discos mecánicos y flash sin tener que copiar a espacio de usuario. En entornos Windows, donde el rendimiento aleatorio de pequeñas escrituras puede ser crítico, esta combinación de zvol en special vdev + SLOG sobre flash + reubicar datos con rewrite permite diseñar arquitecturas híbridas muy afinadas.

El equipo de OpenZFS on Windows insiste en que, debido a la idiosincrasia del sistema operativo (montajes, bloqueo de archivos, integración con drivers de terceros, antivirus, etc.), se necesitan muchas más pruebas en hardware variado que en Linux u OSX. Por eso, en cada release candidate animan a reportar tanto problemas nuevos como los que se arrastran desde la rama 2.3 en GitHub, con la meta de que el port para Windows alcance el mismo nivel de madurez que en macOS lo antes posible.

Cuotas por defecto y nuevas capacidades de gestión de espacio

Uno de los cambios más agradecidos de cara al día a día es la posibilidad de definir cuotas predeterminadas para usuarios, grupos y proyectos. Hasta ahora, asignar límites de uso en entornos multiusuario requería ir caso a caso; con OpenZFS 2.4 se pueden establecer políticas por defecto en cada dataset.

Esto permite fijar, por ejemplo, una cuota base para todos los usuarios que se creen dentro de un filesystem concreto, o un límite estándar de proyecto que se aplicará automáticamente cuando se asignen nuevos recursos. El objetivo es evitar que un solo usuario despistado o un servicio mal configurado llene un pool completo por sorpresa.

Estas cuotas por defecto no sustituyen a las reglas específicas existentes, sino que las complementan como política global. A partir de la configuración base, se pueden definir excepciones para usuarios o grupos concretos, afinando hasta donde haga falta. Todo ello se gestiona con las propiedades habituales de ZFS, de modo que quien ya controle el modelo de propiedades no tiene que aprender una interfaz radicalmente nueva.

Direct I/O, IO sin caché y escrituras desalineadas

En el terreno del rendimiento, OpenZFS 2.4 introduce un cambio muy interesante en la gestión de la entrada/salida directa (Direct I/O). En escenarios donde se usan escrituras desalineadas, el uso de O_DIRECT podía activar rutas de código poco eficientes.

Para solucionarlo, ahora se incorpora un mecanismo por el cual, cuando el Direct I/O no puede aplicarse de forma ideal, se produce un fallback a un modo de IO sin caché ligero. Este camino alternativo está pensado específicamente para manejar esas escrituras problemáticas sin castigar el rendimiento más de lo necesario.

¿Qué implica esto en la práctica? Que las aplicaciones que mezclan accesos alineados y no alineados dejan de convertirse en un caso patológico que dispara cuellos de botella en el stack de E/S. El comportamiento pasa a ser más predecible y estable, especialmente en sistemas que sirven bases de datos, motores de virtualización o servicios con I/O directo intensivo.

Unified allocation throttling y reducción de fragmentación

Otro cambio profundo, aunque menos vistoso, es el nuevo algoritmo de unified allocation throttling. Su meta es gestionar mejor la asignación de bloques cuando el sistema está sometido a alta presión de escritura, reduciendo la fragmentación de los vdev y manteniendo un reparto de espacio más ordenado.

Hasta ahora, en determinadas cargas era relativamente fácil acabar con patrones de escritura que dejaban los vdev muy fragmentados y difíciles de gestionar a largo plazo. Con este algoritmo unificado se armoniza el ritmo de asignación, lo que se traduce en un comportamiento más estable cuando el pool se va llenando o cuando se mezclan muchos tamaños de bloque diferentes.

Esta optimización es especialmente relevante en pools de larga duración, donde a lo largo de los años se amplían vdevs, se reequilibra el espacio, se hacen scrubs, se añaden dispositivos y se soportan cargas de trabajo cambiantes. Tener un mecanismo más inteligente de asignación ayuda a que ZFS mantenga buenos tiempos de respuesta incluso cuando el pool ya no está “limpio” como el primer día.

Mejoras de cifrado con AVX2 y AES-GCM

En seguridad y rendimiento, OpenZFS 2.4 mejora la implementación de cifrado al aprovechar mejor las instrucciones AVX2 para AES-GCM. El proyecto ha tomado como referencia la implementación de BoringSSL para optimizar este código en CPUs modernas, especialmente en arquitecturas como AMD Zen 3.

El resultado son incrementos de rendimiento significativos (se han mencionado mejoras de hasta un 80% en ciertos escenarios), lo que reduce el impacto del cifrado sobre la CPU. En sistemas que almacenan grandes volúmenes de datos cifrados o que realizan muchas operaciones simultáneas sobre datasets encriptados, esta optimización se nota de manera muy clara.

En la práctica, esto hace que el cifrado nativo de ZFS sea más “barato”. No se convierte en gratuito, pero deja de ser un cuello de botella tan acusado como en versiones anteriores, facilitando su adopción en entornos donde, hasta ahora, se dudaba entre seguridad y rendimiento.

ZIL en vdevs especiales y special_small_blocks ampliado

La gestión de los vdevs especiales es otra de las áreas donde OpenZFS 2.4 da un salto interesante. Tradicionalmente, estos dispositivos se han usado para metadatos, bloques pequeños o tablas de deduplicación, normalmente sobre SSD o NVMe.

Con esta versión, el sistema permite que el ZIL (ZFS Intent Log) se aloje en vdevs especiales si están disponibles. Eso quiere decir que las escrituras síncronas pueden aterrizar en medios de muy baja latencia sin necesidad de dedicar un dispositivo separado exclusivamente como SLOG, lo que abre diseños de pool híbrido más flexibles.

La propiedad special_small_blocks se amplía para que las escrituras de ZVOL también puedan caer en estos vdev especiales, no solo ciertos bloques de archivos regulares. Además, deja de ser obligatorio que el valor de esta propiedad sea una potencia de dos, lo que da más margen a la hora de ajustar el umbral de “bloque pequeño” a la realidad de cada carga.

Al combinar ZIL en vdevs especiales, ZVOL sobre flash y thresholds ajustables, se pueden diseñar arquitecturas donde metadatos, bloques pequeños, tablas de deduplicación, clones y escrituras síncronas se concentran en los dispositivos más rápidos, dejando los discos giratorios para el almacenamiento masivo menos sensible a la latencia.

zfs rewrite y zfs rewrite -P: reubicar datos sin romper nada

La serie 2.3 introdujo zfs rewrite como una de las funciones más potentes de los últimos tiempos, y OpenZFS 2.4 da una vuelta de tuerca añadiendo la opción zfs rewrite -P. Esta herramienta permite reescribir datos dentro del pool manteniendo su significado lógico intacto.

Con zfs rewrite se puede, por ejemplo, cambiar algoritmo de compresión, checksum, deduplicación o número de copias, reequilibrar datos después de añadir vdevs o forzar que determinados archivos se desplacen hacia los vdev especiales, todo ello sin tener que copiarlos a espacio de usuario y sin alterar metadatos como el mtime.

La variante -P intenta preservar el tiempo de nacimiento lógico de los bloques siempre que se pueda. Esto tiene un impacto directo en la eficiencia de send/receive incremental, porque al mantener estables esos valores, las replicaciones posteriores pueden detectar mejor qué ha cambiado realmente y reducir el volumen de datos que viaja entre sistemas.

Otro detalle importante es que el proceso de reescritura se protege con range locks estándar, lo que permite ejecutarlo en paralelo a cargas reales sin bloquear el dataset en exceso. En entornos con sync=always, la ventaja es doble, porque la operación no provoca escrituras adicionales en el ZIL al no haber cambios lógicos de contenido, reduciendo el impacto en dispositivos dedicados a escrituras síncronas.

Nuevas opciones de administración: -a, scrub por rangos y prefetch BRT

OpenZFS 2.4 también mejora la vida del administrador con pequeños cambios en las herramientas de línea de comandos. Uno de los más prácticos es la incorporación de la opción -a|--all en operaciones como scrub, trim o inicialización.

Gracias a esta opción, es posible lanzar un scrub, trim o init sobre todos los pools importados de una sola pasada, sin tener que ir recorriendo manualmente cada uno. Esto reduce errores humanos y simplifica los scripts de mantenimiento en servidores con múltiples pools.

Otra novedad es la posibilidad de ejecutar zpool scrub limitado a rangos temporales concretos mediante las opciones -S y -E. Este enfoque por ventanas de tiempo viene de perlas cuando se sospecha de problemas en un periodo específico, o cuando se desea trocear el coste de un scrub grande en varias ejecuciones parciales menos intrusivas.

Además se introduce zpool prefetch -t brt, que permite precargar en memoria la Block Reference Table (BRT), es decir, la tabla interna que se utiliza para la clonación de bloques. Al hacer prefetch de esta estructura, se reducen latencias en operaciones que dependen de la clonación, lo que beneficia a workloads que tiran con fuerza de los clones.

Permisos, herramientas renombradas, dedup y block cloning

En el área de seguridad y gestión de permisos, OpenZFS 2.4 introduce un nuevo permiso llamado send:encrypted. Con él se puede controlar de forma más fina quién está autorizado a realizar envíos de datasets cifrados, separando responsabilidades entre quienes gestionan snapshots, replicación y acceso a claves.

Al mismo tiempo, utilidades conocidas como arc_summary y arcstat pasan a llamarse zarcsummary y zarcstat. Este renombrado ayuda a evitar conflictos de nombres con otras herramientas del sistema y deja más claro que se trata de utilidades ligadas al ARC de ZFS, algo útil en entornos con muchos componentes.

Internamente, la rama 2.4 acumula optimizaciones y correcciones en deduplicación y clonación de bloques. Se afinan estructuras de datos, se corrigen casos límite y se busca reducir el impacto en memoria y CPU. No es algo que el usuario note directamente como una nueva opción, pero se traduce en menos sorpresas cuando se activan dedup o block cloning bajo cargas pesadas.

Gang blocks, ashift, vdevs lentos y topologías especiales

La nueva versión incluye un conjunto amplio de mejoras y arreglos relacionados con los gang blocks, esos bloques especiales que ZFS utiliza cuando no puede ubicar datos de forma convencional. Cualquier fallo en esa zona del código puede ser serio, así que las múltiples correcciones que se han ido introduciendo son un plus de robustez.

También se ha seguido puliendo la gestión de ashift, el parámetro que marca el tamaño mínimo de asignación alineado con el tamaño físico de sector del dispositivo. Un tratamiento más inteligente de ashift reduce la sobreescritura innecesaria en discos con sectores grandes y contribuye a mantener el rendimiento durante toda la vida útil del pool.

Otra aportación muy práctica es la capacidad de “sentar en el banquillo” vdevs hijos que se comportan de forma anormalmente lenta. En lugar de dejar que una unidad problemática arrastre el rendimiento de todo el conjunto, el sistema puede dejar de apoyarse en ella temporalmente, algo muy útil con discos que empiezan a fallar de forma intermitente o en configuraciones con hardware heterogéneo.

Por último, se relajan las restricciones de topología en vdevs especiales y de deduplicación, lo que abre más posibilidades a la hora de diseñar pools avanzados. Ahora es más sencillo combinar dispositivos rápidos para metadatos, dedup tables, ZIL y otros elementos sensibles sin chocar constantemente con limitaciones demasiado estrictas en la definición de la topología.

OpenZFS 2.3.4 como base del salto a 2.4

Para entender bien la magnitud del salto, conviene recordar que OpenZFS 2.3.4 fue una versión de mantenimiento clave que amplió el soporte de kernel Linux hasta la versión 6.16, manteniendo el mínimo en 4.18, y confirmó compatibilidad con FreeBSD desde 13.3 hasta las ramas 15.0 en preparación.

En esa revisión se estrenó la versión inicial de zfs rewrite, diseñada precisamente para reubicar datos sin cambiar su contenido lógico y sin tener que recurrir a send/receive con renombrados de datasets o copias manuales. La idea era ofrecer una herramienta capaz de reequilibrar pools después de añadir vdevs, reducir la fragmentación generada por escrituras aleatorias o aplicar nuevas propiedades de almacenamiento a datos ya existentes.

Frente a las estrategias clásicas, zfs rewrite resultó ser más rápido y menos intrusivo porque evita sacar los datos al espacio de usuario y no fuerza escrituras extra en el ZIL en datasets con sync=always. Además, respeta mtime y otros metadatos visibles, con lo que las aplicaciones que viven encima del filesystem apenas se enteran de que algo ha pasado.

En conjunto, OpenZFS 2.4 y su evolución 2.4.1 suponen un salto notable en rendimiento, flexibilidad y herramientas de administración, especialmente para quienes apuestan por pools híbridos con vdevs especiales, cifrado intensivo y entornos multiusuario con cuotas estrictas. Las mejoras en cifrado con AVX2, el unified allocation throttling, el ZIL en vdev especiales, la ampliación de special_small_blocks, zfs rewrite y sus variantes, junto con todo el trabajo en gang blocks, ashift, deduplicación y block cloning, consolidan a OpenZFS como uno de los sistemas de archivos más avanzados del ecosistema libre, listo para exprimir tanto en Linux y FreeBSD como en macOS y, poco a poco, también en Windows.

Leave A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.