Блокировка клонирования

Операция клонирования блока указывает файловой системе копировать диапазон байтов файлов от имени приложения. Целевой файл может совпадать с исходным файлом или отличаться от нее.

Файловая система управляет сопоставлениями кластеров и экстентов и может выполнять копирование, изменив номер виртуального кластера (VCN) на логические сопоставления номеров кластера (LCN), а не чтение и запись базовых данных файлов. Это позволяет копировать быстрее и создает меньше операций ввода-вывода в базовое хранилище. Кроме того, несколько файлов теперь могут совместно использовать логические кластеры после клонирования блока, сохраняя емкость, не сохраняя одинаковые кластеры несколько раз на диске.

Операция клонирования блока не нарушает изоляцию, предоставляемую между файлами. После завершения клона блока запись в исходный файл не отображается в назначении или наоборот.

Блокировка клонирования доступна только в типе файловой системы ReFS, начиная с Windows Server 2016. Начиная с обновления Windows 11 Moment 5 (KB5034848) и более поздних выпусков сборок клиента Windows и Windows Server, блокировка клонирования происходит изначально в поддерживаемых операциях копирования Windows.

Блокировка клонирования в ReFS

Начиная с Windows Server 2016, ReFS реализует клонирование данных на уровне блоков путем повторного сопоставления логических кластеров (то есть физических позиций на томе) из исходного региона в целевой регион. Затем он использует механизм выделения по записи для обеспечения изоляции между этими регионами. Исходные и целевые регионы могут находиться в одном или другом файле.

Эта реализация требует выравнивания смещения начального и конечного файлов с границами кластера. В ReFS начиная с Windows Server 2016 кластеры имеют размер 4 КБ по умолчанию, но при необходимости можно задать значение 64 КБ. Размер кластера — это набор параметров на уровне томов во время форматирования.

Последствия для размера кластера и производительности

Размер кластера тома ReFS напрямую влияет на поведение клонирования блоков и характеристики производительности:

  • Размер кластера по умолчанию: 4 КБ (рекомендуется для большинства рабочих нагрузок)
  • Альтернативный размер кластера: 64 КБ (подходящий для больших последовательных рабочих нагрузок ввода-вывода)

Размер кластера определяет степень детализации, при которой выполняются операции клонирования блоков и операции копирования по записи. Когда запись производится в регион файла, который делит кластеры с другим файлом (после клонирования блока), ReFS использует механизм выделения при записи, который работает на уровне кластера.

  • Только измененный кластер дублируется и записывается в новое физическое расположение.
  • Неизмененные кластеры в одном регионе остаются общими
  • Это поведение применяется независимо от того, было ли инициировано копирование блоков непосредственно с помощью FSCTL_DUPLICATE_EXTENTS_TO_FILE или автоматически системой (начиная с Windows 11 Момента 5 и более поздних версий)

Вопросы, связанные с производительностью

Выбор размера кластера имеет важные последствия для производительности и потребления пространства:

  • Кластеры 4 КБ: обеспечивают улучшенную эффективность использования пространства для рабочих нагрузок с небольшими случайными записями (в диапазоне от КБ до МБ), поскольку на каждый изменённый кластер дублируется только 4 КБ. Однако это может привести к более частым операциям копирования по записи.
  • Кластеры 64 КБ: сокращение затрат на метаданные и повышение производительности последовательного ввода-вывода, но может привести к дублированию до 64 КБ для каждой записи в общий регион, даже если запись меньше 64 КБ.

Размер кластера определяется во время форматирования и не может быть изменен без переформатирования тома. Чтобы проверить текущий размер кластера тома ReFS, выполните следующую команду:

fsutil fsinfo refsinfo <volume>

Для томов, автоматически отформатированных Windows (например, если блочное клонирование включено по умолчанию), система использует стандартный размер кластера 4 КБ, если во время создания тома не была явно выполнена настройка.

Ограничения и примечания

  • Исходные и целевые регионы должны начинаться и заканчиваться границами кластера.
  • Клонированные области должны быть меньше 4 ГБ длины.
  • Целевой регион не должен расширяться до конца файла. Если приложение хочет расширить назначения клонированными данными, оно должно сначала вызвать SetEndOfFile.
  • Если исходные и целевые регионы находятся в одном файле, они не должны перекрываться. (Приложение может продолжить, разделив операцию клонирования блока на несколько клонов блоков, которые больше не перекрываются.)
  • Исходные и целевые файлы должны находиться в одном томе ReFS.
  • Исходные и целевые файлы должны иметь одинаковый параметр " Потоки целостности " (т. е. потоки целостности должны быть включены в обоих файлах или отключены в обоих файлах).
  • Если исходный файл разрежен, целевой файл также должен быть разрежен.
  • Операция клонирования блока разорвит общие оппортунистические блокировки (также известные как блокировки уровня 2).
  • Том ReFS должен быть отформатирован с помощью Windows Server 2016 или более поздней версии, а если используется отказоустойчивая кластеризация Windows, то уровень функциональности кластеризации должен быть Windows Server 2016 или более поздней версии во время форматирования.

Пример

Предположим, у нас есть два файла X и Y, где каждый файл состоит из 3 разных регионов. Каждый регион файла хранится в отдельной области тома. Файловая система сохраняет знания, на которые ссылается каждый из этих регионов томов в одном файловом регионе:

Схема, демонстрирующая состояние областей тома перед клонированием.

Теперь предположим, что приложение выдает операцию клонирования блока из File X, по регионам файлов A и B, в файл Y в смещение, где сейчас находится E. Следующее состояние файловой системы приведет к следующему:

Схема, демонстрирующая состояние областей тома после клонирования.

Данные в регионах A и B были фактически дублируются из File X в File Y путем изменения сопоставления VCN в LCN в томе ReFS. Экстенты резервного копирования областей A и B не были считываны, а также экстенты диска, поддерживаемые старыми регионами E и F, перезаписаны во время операции.

Файлы X и Y теперь совместно используют логические кластеры на диске. Это отражается в счетчиках ссылок, показанных в таблице. Общий доступ приводит к снижению потребления емкости тома, чем если регионы A и B дублируются на базовом томе.

Теперь предположим, что приложение перезаписывает регион A в файле X. ReFS создает дубликат A, который теперь называется G. Затем ReFS сопоставляет G в File X и применяет изменение. Это гарантирует сохранение изоляции между файлами. Счетчики ссылок обновляются соответствующим образом:

Схема, демонстрирующая состояние областей тома после изменения записи.

После изменения записи регион B по-прежнему предоставляется на диске. Обратите внимание, что если регион A был больше кластера, только измененный кластер будет дублирован, а оставшаяся часть останется общей.

Поведение копирования в режиме записи

Механизм кластерного выделения при записи оказывает важное влияние на производительность и потребление пространства.

  • Записывает меньше размера кластера: запись любого размера в общий кластер (даже 1 байт) приводит к дублированию всего кластера. При размере кластера по умолчанию 4 КБ, запись 1 КБ в общий регион приводит к копированию 4 КБ.
  • Запись, охватывающая несколько кластеров: если запись охватывает несколько кластеров, дублируются только измененные кластеры. Например, запись 8 КБ с 4 КБ кластерами дублирует 2 кластера (8 КБ в общей сложности), а та же запись 8 КБ с 64 КБ кластерами дублирует 1 кластер (64 КБ в общей сложности).
  • Большие последовательные записи: для рабочих нагрузок, которые часто изменяют большие смежные регионы после клонирования, большие размеры кластера (64 КБ) могут снизить накладные расходы, свести к минимуму количество операций копирования на запись.

Степень детализации на уровне кластера применяется ко всем записям после клонирования блоков, включая сценарии, в которых Windows 11 обновление 5 и более поздние версии автоматически выполняют клонирование блоков во время операций копирования.

DUPLICATE_EXTENTS_DATA

FSCTL_DUPLICATE_EXTENTS_TO_FILE