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


Новый 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 и Software Spaces выделяют регионы хранилища в размерах, превышающих секторы или кластеры (в любом месте от 1 МБ до 1 ГБ). Когда они получают указания TRIM для его размера выделения (или больше размера выделения), SAN/SSD может раздеть регион, чтобы освободить место для других файлов. Обычно они передают все подсказки TRIM на базовый носитель (SSD или HDD), чтобы они могли использовать свободное пространство в соответствии с соответствующим образом. Обычно они не перемещают данные в регионы без выделения, а также не отслеживают области TRIM в де-выделенные регионы (если регион пуст).

Тонко подготовленные saN используют подсказки TRIM, передаваемые им, чтобы сократить общий объем физического хранилища, следовательно, сократить затраты. Спецификация T10 SCSI определяет команду Unmap (аналогичную команде TRIM); здесь команда применима ко всем типам хранилища, включая HDD, 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 IOCTL DSM устройства. Это сопоставляется с командой TRIM для устройств ATA и командой UnMap для устройств SCSI. Код TRIM файла отправляет регионы по одному, как указано в приведенных выше экстентах.

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

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

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

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

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

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

VHD потребителя, подключенного к тонко подготовленной сети SAN:

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

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

Тесты

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

Ресурсы