在 Windows 环境中,如果您经常删除并重新创建大型数据集(例如:备份到磁盘),之前的删除操作可能会导致阵列上出现大量 UNMAP 命令。如果重写相同的磁盘空间,则写入性能可能会受到影响,因为传入写入会等待 UNMAP 被处理,UNMAP 会将磁盘空间元素返回到阵列端的磁盘池。
推动此存储效率逻辑的操作系统机制称为“TRIM”。如果 TRIM 处于活动状态,并且如果您删除文件系统上的一个数据块,则文件系统 (NTFS) 将生成有关已释放空间的元数据,并将其传递到 I/O 堆栈。在 I/O 堆栈中的磁盘级别,将决定目标磁盘是否已连接 ATA。在这种情况下,ATA TRIM 命令将发送到物理磁盘对象。如果磁盘是 SCSI 磁盘,则 TRIM 将转换为 SCSI UNMAP。
如果再次删除并重写同一数据部分,则此返回池机制的存储效率方面是有限的。在这些情况下,您可能已选择在相应生产作业的持续时间内禁用 NTFS 级别的 TRIM,或完全禁用 TRIM。
由此产生的问题是,您如何确保磁盘长期保持空间高效?
要在设备上触发重试,通常使用 /L 选项运行碎片整理命令。当您使用“fsutil behavior set disabledeletenotify 1”禁用 TRIM 时,您可能会认为仅 在删除时 禁用修剪或取消映射,并且重试按预期工作。情况并非如此。碎片整理中的检索操作是一种分配空稀疏文件,然后调用FSCTL_MOVE_FILE来移动数据的机制。有关更多详细信息,请参阅“Windows Internals 7”、“Part II”(第二部分),第 644 页。由此产生的行为意味着在后台执行删除操作。遗憾的是,如果 disabledeletenotify 为“1”,则 retrim 命令仍会成功。它不会导致取消映射。
因此,回收存储的顺序必须包括在运行碎片整理之前激活 TRIM 的步骤。
此外,如果您已全局禁用系统上的 TRIM,请将其激活、碎片整理,然后再次停用,则停用过程可能会与不完整的 retrim 命令执行冲突,尽管该命令已返回到提示符处。在 Windows 2019 上进行实验测试时,我们发现必须等待几秒钟,然后再将 disabledeletenotify 设置为“1”。我们认为,这是碎片整理命令与后台优化器服务之间交互的结果。
如果您使用 Drive Optimizer 计划 TRIM,则默认资源管理器菜单需要任务调度程序中名为“ScheduledDefrag”(/Microsoft/Windows/碎片整理)的计划任务。如果修改任务,Drive Optimizer 会检测到此事实,并要求恢复默认值,然后才能继续。如果禁用任务,您仍然可以手动运行碎片整理命令,但不能计划它们。
此“ScheduledDefrag”任务也称为系统维护(控制面板\所有控制面板项目\安全和维护\自动维护)。
因此,我们建议您将这些系统默认设置保留为原样,而是考虑在任务调度程序中创建新任务,即:
步骤 3 中的超时值是实验测试的推断。我们从未需要超过 10 秒的时间才能成功进行碎片整理,并认为 60 秒是合理的起点。如果您发现阵列端分配的容量值与文件系统报告的已用容量值之间存在差异,请尝试使用更大的值,如 300 秒(5 分钟)。
在下面,我们提供了一个模板,供您导入到任务计划程序中,供您作为基础使用。将以下 xml 代码复制并粘贴到文件中,将文件置于您想要配置的服务器系统范围内,并使用任务导入操作导入任务。以下任务模板称为 DellSanDiskMaintenance。它每周运行上述四个步骤,在星期六的 20:00h(晚上 8 点)运行,并放置在调度程序的根目录中,例如:
Dell Technologies 2023-07-07T09:21:50.4883878 Dell Technologies This task is an example of how to optimize thin SAN drives, if TRIM is globally disabled on the system. \DellSanDiskMaintenance D:AI(A;;FA;;;BA)(A;;FA;;;SY)(A;;FRFX;;;LS)(A;;FR;;;AU) 2023-07-01T20:00:00 PT2H true 1 S-1-5-18 HighestAvailable IgnoreNew true true true false false false false true true false false false true P1D P4D false false PT4H 7 %windir%\system32\fsutil.exe behavior set disabledeletenotify 0 %windir%\system32\defrag.exe /C /L /U timeout /t 60 %windir%\system32\fsutil.exe behavior set disabledeletenotify 1