Дефрагментирование файлов
Если файл записывается на диск, иногда файл не может быть записан в смежных кластерах. Неконтентные кластеры замедляют процесс чтения и записи файла. Чем дальше на диске, тем хуже проблема, так как требуется переместить головку чтения и записи жесткого диска. Файл с неконтигированными кластерами фрагментирован. Чтобы оптимизировать файлы для быстрого доступа, том можно дефрагментировать.
Дефрагментация — это процесс перемещения частей файлов вокруг диска в файлы дефрагментации, то есть процесс перемещения кластеров файлов на диске, чтобы сделать их смежными. Дополнительные сведения см. в следующих разделах:
- Дефрагментация файла
- Минимизация взаимодействий между дефрагментацией и теневыми копиями
- Файлы, потоки и типы потоков, поддерживаемые для дефрагментации
Дефрагментация файла
В простой однозадарной операционной системе программное обеспечение дефрагментации является единственной задачей, и другие процессы для чтения или записи на диск отсутствуют. Однако в многозадающей операционной системе некоторые процессы могут считываться с жесткого диска и записывать их на жесткий диск, а другой процесс дефрагментировать этот жесткий диск. Этот способ заключается в том, чтобы избежать записи в файл, который дефрагментирован без остановки процесса записи в течение очень долгого времени. Решение этой проблемы не является тривиальным, но это возможно.
Чтобы разрешить дефрагментацию без подробных знаний о структуре диска файловой системы, предоставляется набор из трех кодов управления. Коды элементов управления предоставляют следующие функциональные возможности:
- Включение приложений для поиска пустых кластеров
- Определение расположения дисков файловых кластеров
- Перемещение кластеров на диске
Коды управления также прозрачно обрабатывают проблему подавления и позволяют другим процессам считывать и записывать файлы во время перемещения.
Эти операции можно выполнять без подавления выполнения других процессов. Однако другие процессы имеют более медленное время отклика во время дефрагментации диска.
Для дефрагментации файла:
- Используйте код элемента управления FSCTL_GET_VOLUME_BITMAP, чтобы найти место на томе, достаточно большом для принятия всего файла.
Примечание.
При необходимости переместите другие файлы, чтобы сделать место достаточно большим. В идеале достаточно нераспределенных кластеров после первого экстента файла, который можно переместить в пространство после первого экстента.
Используйте код элемента управления FSCTL_GET_RETRIEVAL_POINTERS, чтобы получить карту текущего макета файла на диске.
Пошаговые инструкции по структуре RETRIEVAL_POINTERS_BUFFER , возвращаемой FSCTL_GET_RETRIEVAL_POINTERS.
Используйте код элемента управления FSCTL_MOVE_FILE для перемещения каждого кластера при переходе по структуре.
Примечание.
Возможно, потребуется обновить растровое изображение или структуру извлечения или как в разное время, так как другие процессы записывают на диск.
Для двух операций, используемых в процессе дефрагментации, требуется дескриптор тома. Только администраторы могут получить дескриптор тома, поэтому только администраторы могут дефрагментировать том. Приложение должно проверять права пользователя, который пытается запустить программное обеспечение дефрагментации, и он не должен разрешать пользователю дефрагментировать том, если у пользователя нет соответствующих прав.
При использовании CreateFile для открытия каталога во время дефрагментации тома файловой системы FAT или FAT32 укажите значение маски доступа GENERIC_READ . Не указывайте значение маски доступа MAXIMUM_ALLOWED . Если это сделано, доступ к каталогу запрещен.
Не пытайтесь переместить выделенные кластеры в файловой системе NTFS, которая выходит за рамки округленного размера файла кластера, так как результатом является ошибка.
Повторное синтаксический анализ точек, растровых изображений и списков атрибутов в томах файловой системы NTFS можно дефрагментировать, открывать для чтения и синхронизации и называть их с помощью синтаксиса file:name:type, например dirname:$i 30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT и mrp::$ATTRIBUTE_LIST.
При дефрагментации томов файловой системы NTFS дефрагментирование виртуального кластера за пределами размера выделения файла допускается.
Минимизация взаимодействий между дефрагментацией и теневыми копиями
По возможности перемещайте данные в блоках, выровненных по отношению друг к другу в 16 килобайтах (КБ). Это снижает затраты на копирование во время включения теневых копий, так как теневое пространство копирования увеличивается и производительность снижается при возникновении следующих условий:
- Размер блока запроса перемещения меньше 16 КБ.
- Разность перемещения не увеличивается в 16 КБ.
Разность перемещения — это количество байтов между началом исходного блока и началом целевого блока. Другими словами, блок, начинающийся с смещения X (на диске), можно переместить в начальное смещение Y, если абсолютное значение X минус Y является даже 16 КБ. Таким образом, при условии, что кластеры размером 4 КБ оптимизированы для перехода из кластера 3 в кластер 27, но переход от кластера 18 к кластеру 24 не будет. Обратите внимание, что mod(3,4) = 3 = mod(27,4). Мод 4 выбран, так как четыре кластера в 4 КБ каждый из них эквивалентен 16 КБ. Таким образом, размер тома, отформатированного до 16 КБ, приведет к оптимизации всех файлов перемещения.
Дополнительные сведения о теневых копиях см. в разделе "Служба теневого копирования томов".
Файлы, потоки и типы потоков, поддерживаемые для дефрагментации
Хотя большинство файлов можно переместить с помощью кода элемента управления FSCTL_MOVE_FILE , не все можно переместить. Ниже приведен список файлов, потоков и типов потоков (также называемых кодами типов атрибутов), поддерживаемых FSCTL_MOVE_FILE. Другие файлы, потоки и типы потоков не поддерживаются FSCTL_MOVE_FILE.
Типы потоков, поддерживаемые для любого файла или каталога.
- ::$DATA
- ::$ATTRIBUTE_LIST
- ::$REPARSE_POINT
- ::$EA
- ::$LOGGED_UTILITY_STREAM
Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: ::$EA и ::$LOGGED_UTILITY_STREAM не поддерживаются до Windows 8 и Windows Server 2012
Типы потоков, поддерживаемые для любого каталога.
- ::$BITMAP
- ::$INDEX_ALLOCATION
Ниже приведены системные файлы, потоки и типы потоков, поддерживаемые FSCTL_MOVE_FILE в формате filename:streamname:$typename.
- $MFT::$DATA
- $MFT::$ATTRIBUTE_LIST
- $MFT::$BITMAP
- $AttrDef::$DATA
- $AttrDef::$ATTRIBUTE_LIST
- $Secure:$SDS:$DATA
- $Secure::$ATTRIBUTE_LIST
- $Secure:$SDH:$INDEX_ALLOCATION
- $Secure:$SDH:$BITMAP
- $Secure:$SII:$INDEX_ALLOCATION
- $Secure:$SII:$BITMAP
- $UpCase::$DATA
- $UpCase::$ATTRIBUTE_LIST
- $Extend:$I 30:$INDEX_ALLOCATION
- $Extend::$ATTRIBUTE_LIST
- $Extend:$I 30:$BITMAP
- $Extend\$UsnJrnl:$J:$DATA
- $Extend\$UsnJrnl::$ATTRIBUTE_LIST
- $Extend\$UsnJrnl:$Max:$DATA
- $Extend\$Quota:$Q:$INDEX_ALLOCATION
- $Extend\$Quota::$ATTRIBUTE_LIST
- $Extend\$Quota:$Q:$BITMAP
- $Extend\$Quota:$O:$INDEX_ALLOCATION
- $Extend\$Quota:$O:$BITMAP
- $Extend\$ObjId:$O:$INDEX_ALLOCATION
- $Extend\$ObjId::$ATTRIBUTE_LIST
- $Extend\$ObjId:$O:$BITMAP
- $Extend\$Reparse:$R:$INDEX_ALLOCATION
- $Extend\$Reparse:::$ATTRIBUTE_LIST
- $Extend\$Reparse:$R:$BITMAP
- $Extend\$RmMetadata:$I 30:$INDEX_ALLOCATION
- $Extend\$RmMetadata:$I 30:$BITMAP
- $Extend\$RmMetadata::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair::$DATA
- $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair:$Config:$DATA
- $Extend\$RmMetadata\$Txf:$I 30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Txf:$I 30:$BITMAP
- $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
- $Extend\$RmMetadata\$TxfLog:$I 30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$TxfLog:$I 30:$BITMAP
- $Extend\$RmMetadata\$TxfLog\$Tops::$DATA
- $Extend\$RmMetadata\$TxfLog\$Tops::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$TxfLog\\$Tops:$T:$DATA
- $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$DATA
- $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$ATTRIBUTE_LIST