Ir al contenido
  1. Posts/

zpool trim en Proxmox: cómo trato los SSD y NVMe en ZFS sin hacer teatro

·1867 palabras·9 mins

zpool trim es una de esas cosas que parecen más misteriosas de lo que son. Si usas ZFS sobre SSD o NVMe en Proxmox, tarde o temprano aparece la pregunta: ¿tengo que activar TRIM, lanzarlo a mano, olvidarme o rezar a algún santo del NAND?

Yo lo trato como mantenimiento de storage, no como ritual. TRIM le dice al disco qué bloques ya no contienen datos útiles desde el punto de vista del sistema de archivos. En un SSD eso importa porque el disco puede preparar mejor sus celdas internas para futuras escrituras. En un pool ZFS con VMs, snapshots, clones, backups y discos que se crean y se destruyen con alegría, no es raro que haya bloques liberados que conviene comunicar al dispositivo.

La parte delicada está en no exagerarlo. TRIM no arregla un pool mal diseñado. No convierte un SSD barato en un dispositivo enterprise. No te salva de usar discos sin PLP para cargas de escritura duras. Y desde luego no sustituye a mirar zpool status, zpool iostat o la salud SMART del disco.

Pero sí es una pieza útil. Pequeña, seca, poco vistosa. Justo el tipo de cosa que acaba importando cuando el homelab deja de ser un juguete y empieza a cargar servicios que usas de verdad.

El comando manual es este.

1
zpool trim pve-zfs

Y para ver el estado del pool incluyendo la información de trim uso:

1
zpool status -t pve-zfs

No lo lanzo a ciegas en medio de una migración o de un backup pesado. Lo hago cuando el nodo está razonablemente tranquilo, o al menos cuando sé qué más está pasando.

la captura de este post
#

La captura está generada a partir de una salida saneada de un nodo Proxmox con ZFS sobre NVMe. He cambiado nombres de discos y pool para no enseñar inventario real. La estructura sí es la que interesa: trim solicitado, estado online y cero errores.

Salida saneada de zpool trim en Proxmox

Esta es la salida usada para la captura:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ zpool trim pve-zfs

$ zpool status -t pve-zfs
  pool: pve-zfs
 state: ONLINE
  scan: scrub repaired 0B in 01:42:10 with 0 errors on Sun Jun 14 04:12:08 2026
  trim: requested 18.6G in 00:03:41 with 0 errors on Tue Jun 16 02:12:44 2026
config:

        NAME        STATE     READ WRITE CKSUM
        pve-zfs     ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            nvme0n1 ONLINE       0     0     0  trimmed 9.4G
            nvme1n1 ONLINE       0     0     0  trimmed 9.2G
          mirror-1  ONLINE       0     0     0
            nvme2n1 ONLINE       0     0     0  trimmed 0B
            nvme3n1 ONLINE       0     0     0  trimmed 0B

errors: No known data errors

$ zpool get autotrim pve-zfs
NAME     PROPERTY  VALUE  SOURCE
pve-zfs  autotrim  off    default

Me gusta esta salida porque no dramatiza. Muestra que se pidió trim, cuánto tardó, si hubo errores y si el pool sigue sano. No necesito más para una comprobación normal.

qué problema intenta resolver TRIM
#

Un SSD no borra y escribe como un disco mecánico. Internamente trabaja con páginas, bloques, wear leveling, garbage collection y una cantidad obscena de lógica que normalmente no ves. Cuando borras un archivo o destruyes un zvol, el sistema operativo deja de necesitar esos bloques, pero el SSD no siempre puede saberlo de forma útil si nadie se lo comunica.

TRIM sirve para eso. Le dice al dispositivo: estos bloques ya no contienen datos válidos para mí. Haz con ellos lo que tengas que hacer.

En Proxmox esto puede aparecer después de tareas muy normales.

  • Borrar una VM grande.
  • Eliminar snapshots antiguos.
  • Mover discos entre storages.
  • Restaurar una VM y borrar la copia anterior.
  • Crear y destruir clones para pruebas.
  • Vaciar datasets temporales.

ZFS ya tiene su propia lógica de asignación y liberación. El SSD tiene la suya. TRIM es una forma de que ambas capas no vivan en mundos completamente separados.

por qué no lo uso como botón mágico de rendimiento
#

He visto a gente hablar de TRIM como si fuera el limpiador milagroso del storage. No lo es.

Si tu VM va lenta porque el pool está casi lleno, TRIM no te va a salvar. Si el problema es que tienes demasiadas escrituras síncronas en SSDs de consumo sin protección de energía, TRIM tampoco va a convertir eso en buena idea. Si hay una tormenta de backups, snapshots retenidos durante meses o una VM escribiendo logs como una cafetera nerviosa, TRIM es una nota al margen.

Lo uso para mantener el dispositivo informado. Punto.

Mi orden mental suele ser este:

  1. zpool status para ver salud.
  2. zpool list para ver capacidad y fragmentación.
  3. zpool iostat si hay lentitud real.
  4. zpool trim si tiene sentido por tipo de disco y por operaciones recientes.
  5. SMART o herramientas del fabricante si sospecho del dispositivo.

TRIM entra bastante abajo en la lista. Eso no significa que sea inútil. Significa que no me gusta empezar la casa por el ambientador cuando huele a quemado.

autotrim: cómodo, pero no siempre lo activo sin pensar
#

ZFS permite activar autotrim en el pool.

1
2
zpool get autotrim pve-zfs
zpool set autotrim=on pve-zfs

Con autotrim=on, ZFS va enviando TRIM de forma automática conforme libera bloques. Suena perfecto. En muchos casos lo es. En otros prefiero ser algo más conservador, sobre todo si no conozco bien los discos, si el nodo tiene mucha carga o si estoy en un pool que ya tiene sus propias rarezas.

En mis nodos no activo cosas por deporte. Primero miro qué discos hay, qué carga soportan y qué comportamiento he visto. Hay SSDs que llevan TRIM de maravilla y otros donde prefiero programar un trim periódico en una ventana tranquila.

La opción manual no es incómoda.

1
zpool trim pve-zfs

Y si quiero convertirlo en mantenimiento periódico, lo haría con un timer de systemd o con una tarea programada controlada. No hace falta lanzar TRIM cada hora como si el pool estuviera sucio. Para un homelab normal, semanal o mensual puede ser más que suficiente, dependiendo de cuánto movimiento haya.

cuándo lo lanzo yo
#

No tengo una regla religiosa. Tengo situaciones.

Lo lanzo después de destruir datasets grandes, después de limpiar snapshots acumulados, después de mover varias VMs fuera de un pool SSD o después de una semana con mucho movimiento de pruebas.

También lo lanzo cuando veo que el pool ha liberado bastante espacio y quiero que el SSD se entere. No porque espere un cambio espectacular al minuto siguiente, sino porque me gusta dejar las capas ordenadas.

Lo que no hago es lanzarlo mientras ocurre todo lo demás.

Si hay backup de Proxmox Backup Server corriendo, migraciones activas, scrubs, resilver o una VM crítica haciendo escritura sostenida, no añado otra operación de mantenimiento porque sí. ZFS puede aguantar muchas cosas, pero yo no tengo necesidad de provocar una orgía de I/O para luego mirar gráficas con cara de sorpresa.

Primero compruebo.

1
2
zpool status pve-zfs
zpool iostat -v pve-zfs 2 5

Si el pool está tranquilo, adelante. Si no, espero.

cómo leo zpool status -t
#

La línea que me interesa es esta.

1
trim: requested 18.6G in 00:03:41 with 0 errors

Hay tres datos.

requested me dice cuánto espacio se pidió recortar. No siempre coincide con una mejora visible de espacio libre, porque estamos hablando de bloques comunicados al dispositivo, no de magia en la contabilidad del pool.

El tiempo me sirve para ver si algo ha ido raro. Si un trim pequeño tarda una eternidad, miro carga, firmware, errores y estado del dispositivo.

Los errores son lo que no quiero ver. Si aparece cualquier cosa rara, dejo de tratarlo como mantenimiento y empiezo diagnóstico. Storage no es una zona para negociar con señales raras.

También miro el estado del pool. Si después del trim el pool sigue ONLINE y los contadores de READ, WRITE y CKSUM están a cero, bien. Si no, el trim deja de ser el tema principal.

cuidado con confundir TRIM con borrar datos de forma segura
#

Este punto conviene decirlo claro: TRIM no es una herramienta de borrado seguro para tus secretos.

Que el sistema le diga al SSD que ciertos bloques ya no se usan no significa que puedas demostrar que los datos son irrecuperables bajo cualquier condición. Los SSD tienen overprovisioning, controladoras internas y comportamiento que no controlas del todo desde el sistema operativo.

Si vas a vender un disco, regalarlo o sacarlo de tu casa con datos sensibles, usa herramientas adecuadas, cifrado desde el principio o destrucción si toca. TRIM ayuda al funcionamiento del dispositivo. No es una trituradora legal ni técnica.

En un homelab esto importa porque acumulamos más credenciales de las que queremos admitir. Backups, bases de datos, volúmenes de contenedores, claves SSH, tokens de servicios. No uses zpool trim como excusa para relajarte con eso.

SSDs de consumo y expectativas realistas
#

Muchos homelabs viven en SSDs y NVMe de consumo. Yo los uso. No pasa nada. Pero hay que saber dónde estás.

Un NVMe rápido puede dar cifras muy bonitas en una ficha técnica y aun así sufrir con escritura sostenida, sync writes o cargas pequeñas aleatorias. ZFS puede amplificar ciertos patrones. Proxmox con varias VMs puede juntar escrituras de formas bastante poco elegantes. Si encima metes snapshots, backups y contenedores charlando con bases de datos, el disco trabaja.

TRIM ayuda a que el SSD gestione mejor espacio liberado, pero no cambia su resistencia, su firmware ni su falta de protección ante pérdida de energía.

Para servicios domésticos, laboratorio y VMs no críticas, perfecto. Para datos importantes, yo priorizo backups, redundancia, scrubs, monitorización y discos decentes antes de obsesionarme con TRIM.

Es una pieza más. No el cimiento.

mi receta práctica
#

Si tuviera que dejarlo en una rutina sencilla para Proxmox con ZFS sobre SSD o NVMe, sería esta:

1
2
3
4
5
zpool status pve-zfs
zpool get autotrim pve-zfs
zpool iostat -v pve-zfs 2 5
zpool trim pve-zfs
zpool status -t pve-zfs

Primero miro salud. Luego veo si autotrim está activo. Después compruebo si el pool está tranquilo. Lanzo trim si procede. Y reviso el resultado.

Si el pool está lleno por encima del 80 por ciento, si hay fragmentación alta, si hay errores, si el hardware es sospechoso o si la VM lenta sigue igual, no culpo ni absuelvo a TRIM. Sigo investigando.

Lo que me gusta de este comando es que encaja bien con una forma de administrar Proxmox que intento mantener: tocar poco, mirar bastante y dejar evidencia. Cuando algo va mal semanas después, agradeces saber qué se hizo y cuándo.

conclusión
#

zpool trim no es emocionante. Eso juega a su favor.

En un pool ZFS con SSD o NVMe, me sirve para comunicar al dispositivo bloques liberados después de movimiento real de datos. Lo uso con calma, lo leo con zpool status -t y no lo convierto en superstición.

Si tu homelab tiene Proxmox sobre ZFS y discos flash, merece la pena entenderlo. No para estar lanzándolo todo el rato, sino para tener una herramienta más cuando limpias VMs, snapshots o datasets grandes.

Storage sano suele ser aburrido. En mi experiencia, aburrido es justo lo que quieres en el sitio donde viven tus máquinas.