WindowsでTRIMが無効になっている場合にシン ディスクのディスク メンテナンスをスケジュールする方法
Summary: 大規模なデータセットが頻繁に削除および再作成されるWindows環境では、シン ディスク ドライブが先行するTRIMまたはUNMAPアクティビティの影響を受け、TRIM(「fsutil behavior set disabledeletenotify 1」)を無効にする必要がある場合があります。このアクションにより、TRIMがオフの場合にストレージ効率を維持する方法の問題が発生する可能性があります。 ...
Instructions
概要
Windows環境で大規模なデータセットを頻繁に削除して再作成する場合(例: ディスクへのバックアップ)、先行する削除アクションにより、多数の UNMAP コマンドをアレイ上で実行します。同じディスク領域を書き換えると、受信書き込みが UNMAPs 処理されます。 UNMAPs ディスク領域の要素をアレイ側のディスク プールに戻します。
このストレージ効率ロジックを駆動するオペレーティング システム メカニズムは、「TRIM」の出力です。「Fusion」 TRIM がアクティブであり、ファイル システム上のブロックを削除すると、ファイル システム (NTFS) は解放された領域に関するメタデータを生成し、それを I/O スタックに渡します。I/O スタックのディスク レベルでは、ターゲット ディスクが ATA に接続されているかどうかが決定されます。その場合、 ATA TRIM コマンドが物理ディスク オブジェクトに送信されます。ディスクがSCSIディスクの場合、 TRIM は SCSI UNMAP.
同じデータ セクションを削除して再度書き換えると、このプールへの復帰メカニズムのストレージ効率面が制限されます。このような状況では、以下のいずれかを TRIM それぞれの本番ジョブの期間中、NTFSレベルで、または無効にします TRIM 別の時間にブロックを手動で再利用します。
そこで問題となるのは、長期間にわたってディスクのスペース効率を維持できるようにするにはどうすればよいかということです。
制限事項
ソリューションを作成する前に、いくつかの制限事項を考慮する必要があることに注意してください。
1.
デバイスで再トリミングをトリガーするには、通常、/L オプションを指定して defrag コマンドを実行します。を使用してTRIMを無効にした場合 "fsutil behavior set disabledeletenotify 1," TRIMまたはUNMAPは 削除時にのみ無効になり 、再トリミングは期待どおりに機能すると思われている可能性があります。しかし、そうではありません。デフラグの再トリミング アクションは、空のスパース ファイルを割り当ててから 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 ドライブ オプティマイザーを使用する場合、デフォルトのエクスプローラー メニューには、 "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の詳細を確認してください。上記の 4 つのステップは、毎週土曜日の 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>