1) Creación del pool (alineación y layout)
-
Usa bloques de 4 KiB (ashift=12). Si tus NVMe anuncian 8 KiB nativos, ashift=13.
-
Evita RAID-Z para PG de alta escritura; prefiere mirror (o striped mirrors) por latencia/IOPS.
-
No habilites dedup (caro en RAM/CPU).
Opcionales de alto rendimiento (si tienes discos extra):
-
SLOG (ZIL dedicado) en mirror con SSD enterprise con PLP (latencia muy baja). Mejora commits/WAL sync.
-
special vdev (mirror) para metadatos y bloques pequeños; acelera catálogos e índices.
2) Datasets separados y propiedades clave
Separa datos (PGDATA) y WAL (pg_wal) para tunear de forma distinta.
Propiedades comunes (ambos datasets)
Datos (tablas/índices): alinea a páginas de PG (8 KiB)
WAL (pg_wal): latencia de fsync y evitar contaminar ARC
No uses
sync=disableden producción: arriesga corrupción tras cortes de luz. Manténsync=standard. Si tienes SLOG con PLP, ya tendrás commits rápidos.
3) Memoria: ARC vs PostgreSQL
Deja RAM suficiente a PostgreSQL (shared_buffers, work_mem, etc.). Limita ARC.
Ejemplo con 256 GB RAM:
-
PostgreSQL
shared_buffers: 32–64 GB (según tu carga). -
ARC (zfs_arc_max): ~64–96 GB. Ajusta para que el sistema no swapee.
Otros ajustes ZFS razonables (por defecto modernos ya están bien):
4) Montaje, permisos y journal de sistema
-
Asegúrate de que el servicio de PostgreSQL arranque después de importar el pool ZFS (systemd units suelen manejarlo, pero revísalo).
-
Propietario de rutas:
5) Snapshots/replicación (sin penalizar)
-
Usa snapshots frecuentes (p. ej., cada hora/día) del dataset data. Evita snapshot muy frecuentes del wal (crece mucho).
-
Para réplicas,
zfs send | ssh zfs receivesobredata; WAL ya viaja con la replicación nativa de PG (streaming) si la usas.
6) Verificación rápida
7) Notas prácticas y matices
-
LZ4 vs ZSTD: en cargas muy write-heavy de PG, LZ4 suele rendir mejor (menos CPU y latencia). Tú ya lo has observado: mantén lz4.
-
SLOG: aporta más si tu pool de datos no es ultra-rápido o si tienes muchas transacciones con
synchronous_commit=on. Si tus NVMe ya son de baja latencia, la ganancia puede ser moderada; con SLOG dedicado y PLP, los commits bajan notablemente su p99. -
special vdev: marca diferencia en catálogos/índices y pequeñas lecturas aleatorias. Requiere SSD rápido y mirror (es crítico para la integridad).
-
copies=: deja
copies=1(eleva mucho la escritura). Metadata ya va duplicada en mirrors/special. -
Dedup=off: PostgreSQL no se beneficia; costaría mucha RAM.
Comentarios