Планирование обслуживания «тонких» дисков, если функция TRIM в Windows отключена
Summary: В среде Windows, где большие наборы данных часто удаляются и создаются повторно, на «тонких» дисках может произойти страдание от предшествующей операции TRIM или UNMAP, и может потребоваться отключить TRIM («fsutil behavior set disabledeletenotify 1»). В связи с этим может возникнуть вопрос о том, как сохранить эффективность хранения данных, если функция TRIM выключена. ...
Instructions
Обзор
Если в среде Windows вы часто удаляете и повторно создаете большие наборы данных (например: Резервное копирование на диск), предыдущее удаление может привести к возникновению большого количества ошибок UNMAP команд для массива. Если вы перезапишете то же дисковое пространство, производительность записи может снизиться, так как входящие операции записи ожидают UNMAPs подлежит обработке. UNMAPs Возврат элементов дискового пространства в дисковый пул на стороне массива.
Механизм операционной системы, который управляет этой логикой эффективности хранения, называется «TRIM». Если TRIM активна, и при удалении блока в файловой системе файловая система (NTFS) создает метаданные об освобожденном пространстве и передает их в стек ввода-вывода. На уровне диска в стеке ввода-вывода принимается решение о том, подключен ли целевой диск к ATA. В этом случае ATA TRIM Команда отправляется объекту физического диска. Если диск является диском SCSI, то TRIM преобразуется в SCSI UNMAP.
При повторном удалении и переписывании того же раздела данных аспект эффективности хранения этого механизма возврата в пул будет ограничен. В этих обстоятельствах можно выбрать один из двух отключенных параметров. TRIM на уровне NTFS в течение времени выполнения соответствующего производственного задания или отключить TRIM и освобождать любые блоки в другое время вручную.
В результате возникает вопрос: как гарантировать, что диски по-прежнему эффективно используют пространство в долгосрочной перспективе?
Ограничения
Имейте в виду, что существуют некоторые ограничения, которые необходимо учитывать перед созданием решения.
1.
Чтобы активировать перестройку на устройстве, обычно выполняется команда дефрагментации с параметром /L. При отключении TRIM с помощью "fsutil behavior set disabledeletenotify 1," У вас может сложиться впечатление, что обрезка или отмена сопоставления отключаются только при удалении и что повторная обрезка работает должным образом. Это не так. Действие retrim в дефрагментации — это механизм, который выделяет пустой разреженный файл, а затем вызывает FSCTL_MOVE_FILE , чтобы переместить данные. Дополнительные сведения см. в статье «Windows Internals 7», «Part II», стр. 644 и далее. Результирующее поведение подразумевает действие удаления под капотом. К сожалению, если disabledeletenotify iВ то же время, если мы говорим о том, что мы не можем быть retrim Команда по-прежнему выполняется успешно. Это не приводит к unmaps.
Поэтому последовательность освобождения ресурсов хранения должна включать этап активации TRIM перед запуском дефрагментации.
2.
Кроме того, если вы отключили TRIM В глобальной системе активируйте ее, дефрагментируйте, а затем снова деактивируйте — процесс деактивации может столкнуться с неполным выполнением команды retrim, хотя команда вернулась в командную строку. Во время лабораторного тестирования в Windows 2019 мы обнаружили, что нам нужно подождать пару секунд, прежде чем настраивать disabledeletenotify снова на "1". Мы считаем, что это результат взаимодействия между defrag и служба оптимизатора в фоновом режиме.
3.
Если вы запланировали TRIM При использовании Drive Optimizer в меню проводника по умолчанию требуется запланированная задача, называемая "ScheduledDefrag" (/Microsoft/Windows/Defrag) в планировщике задач. Если вы измените задачу, Drive Optimizer обнаружит этот факт и попросит восстановить настройки по умолчанию, прежде чем вы сможете продолжить. Если отключить эту задачу, вы по-прежнему сможете выполнять команды дефрагментации вручную, но не сможете запланировать их.
4.
Этот "ScheduledDefrag" также вызывается в System Maintenance (Control Panel\All Control Panel Items\Security and Maintenance\Automatic Maintenance).
5.
Если вы деактивируете TRIMTeh UNMAP Поток команд на нижние уровни стека ввода-вывода немедленно прекращается. Такое поведение является ожидаемым. Если с течением времени вы заметите, что разница между выделенным пространством и используемым пространством становится слишком большой, вам может потребоваться (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>