Cómo programar el mantenimiento de discos para discos delgados si TRIM en Windows está deshabilitado
Summary: En un entorno de Windows, donde los conjuntos de datos grandes se eliminan y se vuelven a crear con frecuencia, las unidades de disco delgado pueden sufrir una actividad TRIM o UNMAP anterior, y es posible que TRIM ("fsutil behavior set disabledeletenotify 1") deba deshabilitarse. Esta acción puede llevar a la pregunta de cómo mantener la eficiencia del almacenamiento si TRIM está desactivado. ...
Instructions
Descripción general
En un entorno de Windows, si elimina y vuelve a crear conjuntos de datos grandes con frecuencia (por ejemplo: Respaldar en disco), una acción de eliminación anterior puede dar lugar a un gran número de UNMAP comandos en el arreglo. Si vuelve a escribir el mismo espacio de disco, el rendimiento de escritura puede verse afectado, ya que las escrituras entrantes esperan el UNMAPs para ser procesado. UNMAPs Devuelve los elementos de espacio de disco al pool de discos en el lado del arreglo.
El mecanismo del sistema operativo que impulsa esta lógica de eficiencia del almacenamiento se denomina "TRIM”. Si la solicitud en TRIM está activo y, si elimina un bloque en el sistema de archivos, el sistema de archivos (NTFS) genera metadatos sobre el espacio liberado y los transmite a la pila de I/O. En el nivel de disco de la pila de I/O, se toma una decisión sobre si el disco de destino está conectado a ATA. En ese caso, un ATA TRIM El comando se envía al objeto del disco físico. Si el disco es un disco SCSI, el TRIM se convierte en un SCSI UNMAP.
Si elimina y vuelve a escribir la misma sección de datos, el aspecto de eficiencia del almacenamiento de este mecanismo de retorno al pool es limitado. En estas circunstancias, es posible que haya optado por deshabilitar TRIM en el nivel NTFS durante el trabajo de producción respectivo, o deshabilite TRIM y recupere los bloques en un momento diferente manualmente.
La pregunta resultante es: ¿cómo puede garantizar que los discos sigan ahorrando espacio a largo plazo?
Limitaciones
Tenga en cuenta que hay algunas limitaciones que se deben considerar antes de crear una solución.
1.
Para desencadenar el recorte en un dispositivo, normalmente se ejecuta el comando de desfragmentación con la opción /L. Cuando deshabilitó TRIM mediante "fsutil behavior set disabledeletenotify 1," Es posible que tenga la impresión de que el recorte o la anulación de mapeo solo están deshabilitados al eliminar y que el recorte funciona según lo esperado. Este no es el caso. La acción retrim en defrag es un mecanismo que asigna un archivo disperso vacío y, a continuación, llama a FSCTL_MOVE_FILE para transferir los datos. Véase "Windows Internals 7", "Part II", p. 644 y ss. para más detalles. El comportamiento resultante implica una acción de eliminación bajo el capó. Desgraciadamente, si disabledeletenotify is "1", el retrim El comando aún se realiza correctamente. Esto no produce unmaps.
Como resultado, la secuencia para recuperar el almacenamiento debe incluir un paso para la activación TRIM antes de ejecutar la desfragmentación.
2.
Además, si deshabilitó TRIM En el sistema globalmente, actívelo, desfragmente y vuelva a desactivarlo, el proceso de desactivación puede colisionar con la ejecución incompleta del comando retrim, aunque el comando haya vuelto al símbolo del sistema. Cuando realizamos pruebas de laboratorio en Windows 2019, descubrimos que tuvimos que esperar un par de segundos antes de configurar disabledeletenotify a "1" de nuevo. Creemos que esto es el resultado de una interacción entre los defrag y el servicio Optimizer en segundo plano.
3.
Si programa la TRIM con el Optimizador de unidades, el menú predeterminado del Explorador requiere una tarea programada denominada "ScheduledDefrag" (/Microsoft/Windows/Defrag) en el Programador de tareas. Si modifica la tarea, el optimizador de unidades detecta este hecho y le solicita restaurar los valores predeterminados antes de que pueda continuar. Si deshabilita la tarea, aún puede ejecutar los comandos de desfragmentación manualmente, pero no puede programarlos.
4.
Este "ScheduledDefrag" también se llama en Mantenimiento del sistema (Control Panel\All Control Panel Items\Security and Maintenance\Automatic Maintenance).
5.
Si desactiva TRIMel UNMAP El flujo de comandos a las capas inferiores de la pila de I/O se detiene inmediatamente. Este es un comportamiento esperado. Si, con el tiempo, observa que el espacio asignado frente a la diferencia de espacio utilizado crece demasiado, es posible que (1) deba proporcionar el TRIM/UNMAP flujo de comandos del archivo disperso que procesa más tiempo, o (2) ejecute la intervención con más frecuencia.
Solución
Como resultado, le recomendamos que deje estos ajustes y tareas predeterminados del sistema tal como están y, en su lugar, considere la posibilidad de crear una nueva tarea en el programador de tareas, que:
- Permite
TRIM ("fsutil behavior set disabledeletenotify 0") - Funciona
defrag /l against all drives ("defrag /C /L") - Espera hasta que los comandos resultantes se envíen al arreglo
("timeout /t 60") - Deshabilita
TRIM again ("fsutil behavior set disabledeletenotify 1")
NOTA
El valor de tiempo de espera agotado en el paso 3 es una interpolación de pruebas de laboratorio. Utilízalo como punto de partida. Si observa que se acumulan discrepancias entre los valores de capacidad asignada en el arreglo y los valores de capacidad utilizada informados por el sistema de archivos, es posible que deba usar valores mayores, como 300 segundos (5 minutos) e incluso más (3600; 1 hora). Alternativamente, es posible que deba ejecutar la tarea con más frecuencia; es decir, diariamente en lugar de semanalmente. La razón por la que estas discrepancias pueden acumularse se explica en las limitaciones (5) anteriores.
Plantilla de tareas XML
A continuación, proporcionamos una plantilla para que la importe a un programador de tareas para que la utilice como base. Copie y pegue el siguiente código xml en un archivo, coloque el archivo al alcance del sistema servidor que desea configurar y utilice la acción de importación de tareas para importar la tarea. La siguiente plantilla de tareas se llama DellSanDiskMaintenance. Ejecuta los cuatro pasos anteriores semanalmente, un sábado a las 20:00h (8 pm), y se coloca en la raíz del programador, por ejemplo:
<?xml version="1.0" encoding="UTF-16"?> <Task version="1.6" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <Source>Dell Technologies</Source> <Date>2023-07-07T09:21:50.4883878</Date> <Author>Dell Technologies</Author> <Description>This task is an example of how to optimize thin SAN drives, if TRIM is globally disabled on the system.</Description> <URI>\DellSanDiskMaintenance</URI> <SecurityDescriptor>D:AI(A;;FA;;;BA)(A;;FA;;;SY)(A;;FRFX;;;LS)(A;;FR;;;AU)</SecurityDescriptor> </RegistrationInfo> <Triggers> <CalendarTrigger> <StartBoundary>2023-07-01T20:00:00</StartBoundary> <ExecutionTimeLimit>PT2H</ExecutionTimeLimit> <Enabled>true</Enabled> <ScheduleByWeek> <DaysOfWeek> <Saturday /> </DaysOfWeek> <WeeksInterval>1</WeeksInterval> </ScheduleByWeek> </CalendarTrigger> </Triggers> <Principals> <Principal id="LocalSystem"> <UserId>S-1-5-18</UserId> <RunLevel>HighestAvailable</RunLevel> </Principal> </Principals> <Settings> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> <AllowHardTerminate>true</AllowHardTerminate> <StartWhenAvailable>false</StartWhenAvailable> <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> <IdleSettings> <StopOnIdleEnd>false</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <AllowStartOnDemand>true</AllowStartOnDemand> <Enabled>true</Enabled> <Hidden>false</Hidden> <RunOnlyIfIdle>false</RunOnlyIfIdle> <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession> <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> <MaintenanceSettings> <Period>P1D</Period> <Deadline>P4D</Deadline> <Exclusive>false</Exclusive> </MaintenanceSettings> <WakeToRun>false</WakeToRun> <ExecutionTimeLimit>PT4H</ExecutionTimeLimit> <Priority>7</Priority> </Settings> <Actions Context="LocalSystem"> <Exec> <Command>%windir%\system32\fsutil.exe</Command> <Arguments>behavior set disabledeletenotify 0</Arguments> </Exec> <Exec> <Command>%windir%\system32\defrag.exe</Command> <Arguments>/C /L /U</Arguments> </Exec> <Exec> <Command>timeout</Command> <Arguments>/t 60</Arguments> </Exec> <Exec> <Command>%windir%\system32\fsutil.exe</Command> <Arguments>behavior set disabledeletenotify 1</Arguments> </Exec> </Actions> </Task>