Un comando de recorte (conocido como TRIM en el conjunto de comandos ATA y UNMAP en el conjunto de comandos SCSI ) permite que un sistema operativo informe a una unidad de estado sólido (SSD) qué bloques de datos ya no se consideran "en uso" y, por lo tanto, se pueden borrar internamente. [1]
El recorte se introdujo poco después de que se introdujeran los SSD. Debido a que el funcionamiento de bajo nivel de los SSD difiere significativamente del de los discos duros, la forma convencional en que los sistemas operativos manejan las operaciones de almacenamiento (como las eliminaciones y el formateo) resultó en una degradación progresiva e imprevista del rendimiento de las operaciones de escritura en los SSD. [2] El recorte permite que el SSD maneje de manera más eficiente la recolección de basura , que de otro modo ralentizaría las futuras operaciones de escritura en los bloques involucrados. [3]
Aunque las herramientas para "restablecer" algunas unidades a un estado nuevo ya estaban disponibles antes de la introducción del recorte, también eliminan todos los datos de la unidad, lo que las hace poco prácticas para su uso en la optimización continua. [4] A partir de 2024, muchas unidades SSD tenían mecanismos internos de recolección de basura para ciertos sistemas de archivos (como FAT32 , NTFS , APFS ) que funcionaban independientemente del recorte. Aunque esto mantuvo con éxito su vida útil y rendimiento incluso en sistemas operativos que no admitían el recorte, tenía los inconvenientes asociados de una mayor amplificación de escritura y desgaste de las celdas flash. [5]
TRIM también se utiliza en algunos discos duros de grabación magnética (SMR). [6]
Debido a la forma en que muchos sistemas de archivos manejan las operaciones de eliminación, al marcar los bloques de datos como "no en uso", [7] [8] los medios de almacenamiento (SSD, pero también discos duros tradicionales) generalmente no saben qué sectores/páginas están realmente en uso y cuáles pueden considerarse espacio libre. A diferencia de (por ejemplo) una operación de sobrescritura, una eliminación no implicará una escritura física en los sectores que contienen los datos. Dado que un SSD común no tiene conocimiento de las estructuras del sistema de archivos, incluida la lista de bloques/sectores no utilizados, el medio de almacenamiento sigue sin saber que los bloques se han vuelto disponibles. Si bien esto a menudo permite que las herramientas de recuperación recuperen archivos de discos duros electromecánicos , [8] [9] a pesar de que el sistema operativo informa que los archivos son "eliminados", también significa que cuando el sistema operativo realiza más tarde una operación de escritura en uno de los sectores, que considera espacio libre, se convierte efectivamente en una operación de sobrescritura desde el punto de vista del medio de almacenamiento. En el caso de los discos magnéticos, sobrescribir datos existentes no es diferente a escribir en un sector vacío, pero debido a la forma en que algunos SSD funcionan en el nivel más bajo, una sobrescritura produce una sobrecarga significativa en comparación con escribir datos en una página vacía, lo que puede afectar el rendimiento de escritura. [8] [10]
Los SSD almacenan datos en celdas de memoria flash que se agrupan en páginas de entre 4 y 16 kiB , agrupadas en bloques de entre 128 y 512 páginas. Ejemplo: bloques de 512 kiB que agrupan 128 páginas de 4 kiB cada una. [7] [11] Las celdas de memoria flash NAND solo se pueden escribir directamente cuando están vacías. Si contienen datos, el contenido debe borrarse antes de una operación de escritura. Una operación de escritura SSD se puede realizar en una sola página pero, debido a las limitaciones del hardware, los comandos de borrado siempre afectan a bloques enteros; [11] en consecuencia, escribir datos en páginas vacías en un SSD es muy rápido, pero se ralentiza considerablemente una vez que es necesario sobrescribir páginas escritas previamente. Dado que es necesario borrar las celdas de la página antes de poder escribirla nuevamente, pero solo se pueden borrar bloques completos, una sobrescritura iniciará un ciclo de lectura-borrado-modificación-escritura: [7] [12] el contenido de todo el bloque se almacena en caché, luego se borra todo el bloque del SSD, luego la(s) página(s) sobrescrita(s) se escribe(n) en el bloque almacenado en caché y solo entonces se puede escribir todo el bloque actualizado en el medio flash. Este fenómeno se conoce como amplificación de escritura . [13] [14]
El comando TRIM permite que un sistema operativo notifique al SSD las páginas que ya no contienen datos válidos. Para una operación de eliminación de archivo , el sistema operativo marcará los sectores del archivo como libres para nuevos datos y luego enviará un comando TRIM al SSD. Después del recorte, el SSD no conservará ningún contenido del bloque al escribir nuevos datos en una página de memoria flash, lo que da como resultado una menor amplificación de escritura (menos escrituras), un mayor rendimiento de escritura (sin necesidad de una secuencia de lectura-borrado-modificación), lo que aumenta la vida útil de la unidad.
Los distintos SSD implementan el comando de forma ligeramente diferente, por lo que el rendimiento puede variar. [3] [9]
TRIM le indica al SSD que marque una región LBA como no válida y las lecturas posteriores en la región no devolverán ningún dato significativo. Durante un breve período de tiempo, los datos podrían permanecer en la memoria flash internamente. Sin embargo, después de que se emite el comando TRIM y se realiza la recolección de basura, la recuperación de datos puede volverse difícil o imposible, según la implementación del comando en el firmware de la unidad. [15]
El comando TRIM es útil solo si la unidad lo implementa y el sistema operativo lo solicita. La siguiente tabla identifica cada sistema operativo importante y la primera versión que admitió el comando. Además, las unidades de estado sólido más antiguas diseñadas antes de la incorporación del comando TRIM al estándar ATA necesitarán actualizaciones de firmware; de lo contrario, se ignorará el nuevo comando. Sin embargo, no todas las unidades se pueden actualizar para admitir el recorte.
El soporte para TRIM también varía según lo que el controlador del sistema de archivos en particular del sistema operativo es capaz de hacer, ya que solo un programa con comprensión de qué partes del disco son espacio libre puede emitir el comando de manera segura y, a nivel del sistema, esta capacidad tiende a residir en el controlador del sistema de archivos en sí.
A partir de enero de 2017 [actualizar], la compatibilidad con el comando TRIM no está implementada en la mayoría de las tecnologías RAID basadas en hardware . Sin embargo, las implementaciones RAID de software a menudo incluyen compatibilidad con TRIM.
Windows 10 ofrece soporte para TRIM en volúmenes de ID SSD usando la opción "optimizar unidades" al configurar un volumen RAID.
El controlador RAID de macOS no es compatible con TRIM. Esto es así para todas las versiones de Mac OS X desde la 10.7 hasta la 10.12.x.
TRIM es compatible con volúmenes RAID (0, 1, 4, 5 y 10) cuando se utiliza la aplicación SoftRAID® de terceros, incluida la compatibilidad con TRIM con dispositivos SSD que no sean de Apple. (Nota: TRIM para dispositivos SSD que no sean de Apple debe habilitarse específicamente mediante el comando de terminal "sudo trimforce enable").
TRIM está disponible con volúmenes RAID en versiones posteriores a enero de 2011 del dmraid del kernel de Linux , que implementa soporte para "RAID de hardware falso" asistido por BIOS, y que ahora pasa a través de cualquier solicitud TRIM del sistema de archivos que se encuentra en la matriz RAID. [51]
No debe confundirse con dmraid, el sistema RAID de software de propósito general de Linux, mdraid , tiene soporte experimental para TRIM basado en lotes (en lugar de en vivo, al eliminar un archivo ) en matrices RAID 1 cuando los sistemas están configurados para ejecutar periódicamente la utilidad mdtrim en sistemas de archivos (incluso aquellos como ext3 sin soporte nativo para TRIM). [52] En versiones posteriores de Linux, por ejemplo Red Hat Enterprise Linux 6.5 y posteriores, mdraid admite el paso de comandos TRIM en tiempo real, en lugar de solo como un trabajo por lotes. [53]
Sin embargo, Red Hat recomienda no utilizar los niveles RAID de software 1, 4, 5 y 6 en SSD con la mayoría de las tecnologías RAID, porque durante la inicialización, la mayoría de las utilidades de administración RAID (por ejemplo, mdadm de Linux ) escriben en todos los bloques de los dispositivos para garantizar que las sumas de comprobación (o verificaciones de unidad a unidad, en el caso de RAID 1 y 10) funcionen correctamente, lo que hace que el SSD crea que todos los bloques que no están en el área de repuesto están en uso, lo que degrada significativamente el rendimiento. [54]
Por otro lado, Red Hat recomienda el uso de RAID 1 o RAID 10 para RAID LVM en SSD, ya que estos niveles admiten TRIM ("descartar" en la terminología de Linux) y las utilidades LVM no escriben en todos los bloques al crear un volumen RAID 1 o RAID 10. [53]
Durante un breve período en marzo de 2010, se hizo creer a los usuarios que los controladores Intel Rapid Storage Technology (RST) 9.6 (y posteriores) en Windows 7 admitían TRIM en volúmenes RAID, pero Intel luego aclaró que TRIM era compatible con las configuraciones del BIOS del modo AHCI y el modo RAID, pero no si la unidad era parte de un volumen RAID. [55]
A partir de agosto de 2012, Intel confirma que los chipsets de la serie 7 con controladores Rapid Storage Technology (RST) 11.2 admiten TRIM para RAID 0 en Microsoft Windows 7. [56] Si bien Intel no confirmó la compatibilidad con los chipsets de la serie 6, los entusiastas del hardware han demostrado que TRIM en volúmenes RAID 0 funciona en chipsets Z68, P67 y X79 con una ROM de opción RAID modificada . [57] Se especula que la falta de compatibilidad oficial con los chipsets de la serie 6 se debe a los costos de validación [58] o un intento de alentar a los consumidores a actualizar, [59] en lugar de razones técnicas.
Una excepción a la necesidad de una ROM opcional modificada en placas base con un chipset X79 es si el fabricante ha añadido un interruptor de ROM; esto implica que tanto la ROM RST como la RST-E estén dentro del BIOS/UEFI. Esto permite utilizar la ROM RST en lugar de la ROM RST-E, lo que permite que funcione TRIM. [60] Intel señala que se puede lograr un mejor rendimiento utilizando un controlador con la misma versión que la ROM; por ejemplo, si el BIOS/UEFI tiene una ROM opcional 11.0.0.0m, se debe utilizar un controlador de la versión 11.x. [61]
Cuando el sistema de archivos no admite TRIM automáticamente, algunas utilidades pueden enviar comandos de recorte manualmente. Por lo general, determinan qué bloques están libres y luego pasan esta lista como una serie de comandos de recorte a la unidad. Estas utilidades están disponibles de varios fabricantes (por ejemplo, Intel, [62] G.Skill [63] ), o como utilidades generales (por ejemplo, hdparm "wiper" de Linux desde v9.17, [64] [65] o mdtrim, como se mencionó anteriormente). Tanto hdparm como mdtrim encuentran bloques libres asignando un archivo grande en el sistema de archivos y resolviendo a qué ubicación física fue asignado.
Independientemente del sistema operativo, la unidad puede detectar cuándo el ordenador escribe todos los ceros en un bloque y desasignar (recortar) ese bloque en lugar de registrar el bloque de ceros. Si la lectura de un bloque desasignado siempre devuelve ceros, este atajo es transparente para el usuario, excepto para la escritura (y lectura) más rápida de bloques que contengan todos los ceros, además del beneficio habitual de una escritura más rápida en áreas no utilizadas. Los sistemas operativos no escriben todos los ceros para "borrar" archivos o espacio libre, pero algunas utilidades sí lo hacen.
La especificación del comando TRIM [66] ha sido estandarizada como parte del estándar de interfaz AT Attachment (ATA), liderado por el Comité Técnico T13 del Comité Internacional de Estándares de Tecnología de la Información (INCITS). [67] TRIM se implementa bajo el comando DATA SET MANAGEMENT (código de operación 06h) del borrador de la especificación ACS-2. [68] El estándar ATA es compatible con hardware ATA paralelo (IDE, PATA) y serial (SATA).
Una desventaja del comando ATA TRIM original es que se definió como un comando no en cola y, por lo tanto, no se podía combinar fácilmente con una carga de trabajo normal de operaciones de lectura y escritura en cola. SATA 3.1 introdujo un comando TRIM en cola para remediar esto. [69]
Hay diferentes tipos de TRIM definidos por las palabras SATA 69 y 169 devueltas desde un comando ATA IDENTIFY DEVICE:
Hay información adicional en SATA Word 105 que describe la cantidad máxima de bloques de 512 bytes por comando DATA SET MANAGEMENT que una unidad puede admitir. Por lo general, el valor predeterminado es 8 (o 4 kB), pero muchas unidades lo reducen a 1 para cumplir con los requisitos de hardware de Microsoft Windows para TRIM, que establecen que el tiempo de finalización del comando no debe superar los 20 ms u 8 ms × (número de entradas de rango LBA), lo que sea mayor, y siempre debe ser inferior a 600 ms. [70]
Un rango LBA individual se denomina entrada de rango LBA y se representa mediante ocho bytes. El LBA se expresa mediante los primeros seis bytes de la entrada de rango LBA y la longitud de rango es un contador basado en cero (por ejemplo, 0=0 y 1=1) representado por los dos bytes restantes. Si la longitud de rango de dos bytes es cero, entonces la entrada de rango LBA se descartará como relleno. [71] Esto significa que para cada bloque de 512 bytes de rangos TRIM que un dispositivo admite, el máximo es 64 rangos de 32 MB o 2 GB. Si un dispositivo admite SATA Word 105 a 8, entonces debería poder recortar 16 GB en un solo comando TRIM (ADMINISTRACIÓN DE CONJUNTO DE DATOS).
SCSI proporciona el comando UNMAP (un análogo completo de TRIM) y el comando WRITE SAME (variantes 10 y 16) con el indicador UNMAP establecido. [72]
El comando MultiMediaCard and SD ERASE (CMD38) proporciona una funcionalidad similar al comando ATA TRIM, aunque requiere que los bloques borrados se sobrescriban con ceros o unos. En eMMC 4.5 y, opcionalmente, en tarjetas SDHC y SDXC, se define una suboperación DISCARD que se asemeja más a ATA TRIM en el sentido de que el contenido de los bloques descartados se puede considerar indeterminado (es decir, "no importa").
El conjunto de comandos NVM Express tiene un conjunto de comandos de administración de conjuntos de datos genéricos para indicar la intención del host al dispositivo de almacenamiento en un conjunto de rangos de bloques. Una de sus operaciones, DEALLOCATE, realiza un recorte. También tiene un comando WRITE ZEROES que proporciona una indicación DEALLOCATE y permite que el disco recorte y devuelva ceros.
Estos dispositivos están en la lista negra del archivo libata-core.c del kernel de Linux para forzar el envío de comandos TRIM no en cola ( ATA_HORKAGE_NO_NCQ_TRIM ) a estas unidades en lugar de comandos TRIM en cola: [80]
Este archivo también incluye en la lista negra al SuperSSpeed S238 contra TRIM en general debido a que provoca que los bloques incorrectos pierdan datos cuando se emite TRIM. [80] [81]
libata-core.c también tiene una lista blanca para incluir los SSD que los encargados del mantenimiento del subsistema saben de manera confiable que implementan correctamente los indicadores DRAT y RZAT ( ATA_HORKAGE_ZERO_AFTER_TRIM
), en lugar de ignorarlos, como hacen muchas unidades. Las unidades incluidas en la lista blanca son las siguientes: [80]
Microsoft agregó la función en una actualización de Windows 7 conocida como KB2990941