Поделиться через


Новый API позволяет приложениям отправлять подсказки TRIM и Unmap на носитель хранилища

Платформы

Клиентысерверы Windows 8 — Windows Server 2012

Описание

Подсказки TRIM уведомляют диск о том, что некоторые секторы, которые ранее были выделены, больше не нужны приложению и могут быть удалены. Обычно это используется, когда приложение выделяет большое пространство с помощью файла, а затем самостоятельно управляет выделениями для файла (например, файлами виртуального жесткого диска).

Что такое TRIM?

Твердотельные накопители (SSD) обычно являются устройствами на основе памяти флэш-памяти, стертыми блоками; это означает, что если данные записываются на SSD, они не могут быть перезаписаны на месте и должны быть записаны в другом месте, пока блок не сможет быть собран мусором. Так как SSD не имеет внутреннего механизма для определения того, что некоторые блоки удалены, а другие необходимы. Единственный раз, когда SSD может пометить сектор "грязный", когда он перенаписан. В других случаях, например при удалении файла, SSD сохраняет эти секторы, так как удаление выполняется только как таблица главных файлов (MFT), а не как операция для всех секторов файла. В Windows 7 мы представили стандартный способ взаимодействия с ssd о секторах, которые больше не нужны. Эта команда определена в спецификации T13 в качестве команды TRIM; NTFS отправляет команду TRIM для некоторых обычных встроенных операций, таких как deletefile.

Другие способы использования TRIM в мире хранения

Как и диски SSD, сети хранения (SAN) и новые реализации функций программного пространства Windows 8 используют указания команд TRIM для управления их пространствами в тонко подготовленных средах. Сети SAN и программные пространства выделяют области хранилища размером больше секторов или кластеров (от 1 МБ до 1 ГБ). При получении указаний TRIM для его размера выделения (или больше, чем размер выделения), SAN/SSD может отменять выделение региона, чтобы освободить место для других файлов. Обычно они передают все подсказки TRIM на базовый носитель (SSD или HDD), чтобы они могли потреблять свободное пространство соответствующим образом. Как правило, они не перемещают данные в регионы отмены выделения, а также не отслеживают области TRIM в выделенные регионы (если регион пуст).

Тонко подготовленные сети SAN используют указания TRIM, которые передаются им, чтобы сократить общий объем физического хранилища, тем самым снижая затраты. Спецификация T10 SCSI определяет команду Unmap (аналогичную команде TRIM); здесь команда применима ко всем типам хранилищ, включая жесткие диски, диски SSD и другие. Команда UnMap помогает удалить физические блоки из выделения SAN.

Использование нового API

#define FSCTL_FILE_LEVEL_TRIM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 130, METHOD_BUFFERED, FILE_WRITE_DATA)

Where 
typedef struct _EXTENT_PAIR {
    ULONGLONG Offset;
    ULONGLONG Length;
} EXTENT_PAIR, *PEXTENT_PAIR;

typedef struct _FILE_LEVEL_TRIM {
    //
    // A count of how many Offset:Length pairs are given
    //
    DWORD PairCount;
    //
    // All the pairs.
    //
    EXTENT_PAIR Pairs[1];
} FILE_LEVEL_TRIM, *PFILE_LEVEL_TRIM;

Trim файла передается через буфер, если это возможно или асинхронно (не буферизованно) команде TRIM DSM устройства IOCTL DSM. Это сопоставляется с командой TRIM для устройств ATA и командой UnMap для устройств SCSI. Код TRIM файла отправляет регионы по одному, как указано в указанных выше экстентах.

File TRIM не ожидает возврата с устройства, так как команды TRIM и Unmap определяются как указания на базовый носитель хранения и коды возврата не ожидаются.

Комплексный рабочий процесс:

  1. Обрезка файла вызова

    1. File TRIM проверяет входные данные на наличие ошибок
    2. File TRIM разбивает экстенты на регионы LCN
    3. Операции TRIM файлов округляются вверх и вниз для неправильно выровненных областей, которые передаются в TRIM
    4. Очистка файлов TRIM записей в кэше, связанных с областями TRIM
    5. File TRIM передает IOCTL_DSM (trim) на регион
  2. Функция TRIM файла возвращает или выдает ошибки

    1. Проверка ошибок выполняется при допустимости входных данных
    2. Если допустимы только некоторые из экстентов, возвращается одна ошибка для полного вызова API.

Варианты использования

Виртуальный жесткий диск потребителя (VHD), подключенный на SSD:

Виртуальный жесткий диск изначально подключается к неиспользуемой неиспользуемой носителе. При использовании виртуального жесткого диска виртуальный жесткий диск использует части носителя хранилища для файлов и т. д. При удалении файлов на носителе хранилища эти файлы не удаляются из SSD, так как полный виртуальный жесткий диск хранится в виде одного файла на SSD. Среда Hyper-V вызывает file TRIM для всех регионов, которые удаляются при удалении файла в среде VHD. File_TRIMs претворяются в SSD, чтобы можно было оптимизировать производительность SSD.

Виртуальный жесткий диск потребителя, подключенный к тонко подготовленной сети SAN:

VHD изначально подключается к одной минимальной плите тонко подготовленной среды. Так как файлы хранятся на виртуальном жестком диске, объем хранилища виртуального жесткого диска увеличивается на несколько плит. Когда файлы удаляются на виртуальном жестком диске, Hyper-V вызывает File_TRIM к базовой тонко подготовленной сети SAN. Если triM больше, чем степень детализации SLAB, san теперь может удалить SLAB и, следовательно, уменьшить объем виртуального жесткого диска в этой сети SAN.

Если виртуальный жесткий диск находится на сервере на основе Windows 8, оптимизатор хранилища также будет отправлять TRIM, чтобы уменьшить занимаемую плиту виртуального жесткого диска из подключенного виртуального жесткого диска.

Тесты

В более ранних выпусках операционной системы нет сопоставимых API. Не должно быть влияния на производительность самого API, хотя носитель хранилища (если реализован правильно) может показать лучшую производительность записи. API следует использовать очень тщательно; Следует передавать только те экстенты, которые больше не нужны, так как эти экстенты будут окончательно удалены из носителя хранилища.

Ресурсы