如何在 Windows 上禁用 TRIM 的情况下为精简磁盘计划磁盘维护
Summary: 在经常删除和重新创建大型数据集的 Windows 环境中,精简磁盘驱动器可能会受到前面的 TRIM 或 UNMAP 活动的影响,并且可能必须禁用 TRIM(“fsutil behavior set disabledeletenotify 1”)。此作可能会导致在 TRIM 关闭时如何保持存储效率的问题。
Instructions
概览
在 Windows 环境中,如果您经常删除并重新创建大型数据集(例如:备份到磁盘),前面的删除作可能会导致大量 UNMAP 阵列上的命令。如果重写相同的磁盘空间,则写入性能可能会受到影响,因为传入的写入会等待 UNMAPs 待处理。 UNMAPs 将磁盘空间元素返回到阵列端的磁盘池。
驱动此存储效率逻辑的作系统机制称为”TRIM”的输出。如果 TRIM 处于活动状态,如果删除文件系统上的数据块,文件系统 (NTFS) 将生成有关释放空间的元数据,并将其向下传递到 I/O 堆栈。在 I/O 堆栈的磁盘级别,决定目标磁盘是否与 ATA 连接。在这种情况下,是 ATA TRIM 命令将发送到物理磁盘对象。如果磁盘是 SCSI 磁盘, 则 TRIM 会转换为 SCSI UNMAP.
如果再次删除并重写同一数据段,则此返回池机制的存储效率方面会受到限制。在这些情况下,您可能已选择禁用 TRIM 在相应生产作业的持续时间内处于 NTFS 级别,或禁用 TRIM 完全,并在不同时间手动回收任何数据块。
由此产生的问题是,如何确保磁盘长期保持空间利用率?
限制
请注意,在创建解决方案之前,需要考虑一些限制。
1.
若要在设备上触发重新修剪,通常运行带有 /L 选项的碎片整理命令。当您使用以下命令禁用 TRIM 时: "fsutil behavior set disabledeletenotify 1," 您的印象可能是,仅在 删除时禁用 TRIM 或 UNMAP,并且 RETRIM 按预期工作。事实并非如此。碎片整理中的重新修剪作是一种机制,它分配一个空的稀疏文件,然后调用 FSCTL_MOVE_FILE 移动数据。有关详细信息,请参阅“Windows Internals 7”的“Part II”,第 644 页及以后。由此产生的行为意味着后台的删除作。不幸的是,如果 disabledeletenotify is “1”, retrim 命令仍然成功。它不会导致 unmaps。
因此,回收存储的顺序必须包括激活步骤 TRIM 运行碎片整理之前。
2.
此外,如果您已禁用 TRIM 在全局系统上,将其激活、碎片整理,然后再次将其停用,尽管命令已返回到提示符,但停用过程可能会与未完成的重新修剪命令执行冲突。在 Windows 2019 上进行实验室测试时,我们发现必须等待几秒钟才能设置 disabledeletenotify 再次设置为“1”。我们认为,这是 defrag 命令和优化器服务在后台运行。
3.
如果您计划 TRIM 使用 Drive Optimizer 时,默认资源管理器菜单需要一个名为 "ScheduledDefrag" (/Microsoft/Windows/Defrag) 在任务计划程序中。如果修改任务,驱动器优化器会检测到此情况并要求恢复默认值,然后您才能继续。如果禁用该任务,您仍然可以手动运行碎片整理命令,但无法计划它们。
4.
这 ”ScheduledDefrag“任务在系统维护中也称为 (Control Panel\All Control Panel Items\Security and Maintenance\Automatic Maintenance).
5.
如果停用 TRIM、 UNMAP 到 IO 堆栈较低层的命令流立即停止。这是预期的行为。如果随着时间的推移,您观察到分配的空间与已用空间的差异变得过大,您可能需要 (1) 提供 TRIM/UNMAP 来自稀疏文件的命令流处理更多时间,或 (2) 更频繁地运行干预。
解决方案
因此,我们建议您保留这些系统默认设置和任务,而是考虑在任务计划程序中创建 新任务 ,以便:
- 使
TRIM ("fsutil behavior set disabledeletenotify 0") - 运行
defrag /l against all drives ("defrag /C /L") - 等待生成的命令提交到阵列
("timeout /t 60") - 禁用
TRIM again ("fsutil behavior set disabledeletenotify 1")
提醒
步骤 3 中的超时值是实验测试的插值。以此为起点。如果您发现阵列端分配的容量值与文件系统报告的已用容量值之间的差异不断增加,则可能需要使用较大的值,例如 300 秒(5 分钟)甚至更多(3600 秒;1 小时)。或者,您可能需要更频繁地运行任务;即每天而不是每周。这些差异可能累积的原因在上面的限制 (5) 中进行了解释。
XML 任务模板
在下文中,我们提供了一个模板供您导入任务计划程序中,供您用作基础。将以下 xml 代码复制并粘贴到文件中,将该文件放在要配置的服务器系统可访问的位置,然后使用任务导入作导入任务。以下任务模板称为 DellSanDiskMaintenance。它每周在星期六 20:00(晚上 8 点)运行上述四个步骤,并放置在调度程序的根目录中,例如:
<?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>