如果 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 選項運行碎片整理命令。當您使用 "fsutil behavior set disabledeletenotify 1," 您可能認為修剪或取消映射 僅在刪除時禁用 ,並且重新修剪按預期工作。事實並非如此。碎片整理中的重新修剪操作是一種機制,用於分配一個空的稀疏檔,然後調用 FSCTL_MOVE_FILE 以移動數據。有關更多詳細資訊,請參閱“Windows Internals 7”,“Part II”,p. 644 ff。生成的行為意味著引擎蓋下的刪除操作。不幸的是,如果 disabledeletenotify is “1,” retrim 命令仍然成功。它不會導致 unmaps。
因此,回收存儲的序列必須包括啟動步驟 TRIM 在運行碎片整理之前。
2.
此外,如果您已禁用 TRIM 在全域系統上,啟動它,對它進行碎片整理,然後再次停用它,儘管命令已返回到提示符,但停用過程可能會與未完成的 retrim 命令執行衝突。在 Windows 2019 上進行實驗室測試時,我們發現我們必須等待幾秒鐘才能設定 disabledeletenotify 再次轉換為“1”。我們認為這是 defrag 命令和後台的優化器服務。
3.
如果您排程 TRIM 使用Drive Optimizer時,預設的「資源管理器」功能表需要名為 "ScheduledDefrag" (/Microsoft/windows/碎片整理) 以建立工作排程器。如果您修改任務,驅動器優化器會檢測到這一事實,並要求恢復預設值,然後才能繼續。如果禁用該任務,您仍然可以手動運行碎片整理命令,但無法計劃它們。
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:00h(晚上 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>