次の方法で共有


新しい API を使用すると、アプリは "TRIM とマップ解除" のヒントをストレージ メディアに送信できます

プラットフォーム

クライアント – Windows 8
サーバー – Windows Server 2012

形容

TRIM ヒントは、以前に割り当てられていた特定のセクターがアプリで不要になり、消去できることをドライブに通知します。 これは通常、アプリがファイルを介して大きな領域の割り当てを行い、ファイル (仮想ハード ディスク ファイルなど) への割り当てを自己管理する場合に使用されます。

TRIM とは

ソリッド ステート ドライブ (SSD) は、通常、フラッシュ メモリ ベースのブロック消去デバイスです。これは、SSD にデータが書き込まれるときに、そのデータを所定の場所に過剰に書き込むことができず、ブロックをガベージ コレクションできるようになるまで他の場所に書き込む必要があることを意味します。 SSD には、特定のブロックが削除され、他のブロックが必要であることを判断するための内部メカニズムがないためです。 SSD がセクターを "ダーティ" とマークできるのは、過剰に書き込まれた場合だけです。 ファイルが削除された場合など、SSD はこれらのセクターを保持します。これは、削除がマスター ファイル テーブル (MFT) の変更としてのみ実行され、ファイルのすべてのセクターに対する操作として実行されないためです。 Windows 7 では、不要なセクターに関する SSD との標準的な通信方法を導入しました。 このコマンドは、T13 仕様で TRIM コマンドとして定義されています。NTFS は、"deletefile" などの一部の通常のインライン操作に対して TRIM コマンドを送信します。

ストレージの世界での TRIM のその他の用途

SSD と同様に、記憶域ネットワーク (SAN) や新しい Windows 8 機能ソフトウェア スペースの実装では、TRIM コマンド ヒントを使用して、薄くプロビジョニングされた環境でスペースを管理します。 SAN とソフトウェア スペースは、セクターまたはクラスター (1 MB から 1 GB の任意の場所) より大きいサイズで記憶域の領域を割り当てます。 割り当てサイズ (または割り当てサイズより大きい) の 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 は、可能な場合はバッファーを介して渡されるか、デバイス IOCTL DSM コマンド TRIM に非同期 (バッファーなし) で渡されます。 これは、ATA デバイスの TRIM コマンドと SCSI デバイスの UnMap コマンドにマップされます。 ファイル TRIM コードは、上記のエクステントで指定されたリージョンを 1 つずつ送信します。

TRIM コマンドと Unmap コマンドは基になるストレージ メディアへのヒントとして定義され、リターン コードは予期されないため、ファイル TRIM はデバイスからのリターンを待機しません。

エンド ツー エンド ワークフロー:

  1. ファイルのトリミングを呼び出す
    1. ファイル TRIM が入力でエラーを調べる
    2. ファイル TRIM によってエクステントが LCN 領域に分割される
    3. ファイル TRIM は、TRIM に渡される正しく整列されていないリージョンに対して切り上げと切り下げを行います
    4. ファイル TRIM は、TRIM 領域に関連するキャッシュ内のエントリを消去します
    5. ファイル TRIM はリージョンごとに IOCTL_DSM (Trim) を渡します
  2. ファイル TRIM の戻り値またはエラー
    1. 入力の有効性に関するエラー チェックが行われる
    2. 一部のエクステントのみが有効な場合は、完全な API 呼び出しに対して 1 つのエラーが返されます

ユース ケース

SSD にマウントされたコンシューマー仮想ハード ディスク (VHD):

VHD は、最初は未使用のメディア "クリーン" にマウントされます。 VHD が使用されると、VHD はファイルなどの記憶域メディアの一部を消費します。ストレージ メディア内のファイルを削除すると、完全な VHD が SSD 上の 1 つのファイルとして格納されるため、これらのファイルは SSD から削除されません。 Hyper-V 環境は、VHD 環境で delete-file が発生したときに削除されるすべてのリージョンに対して File TRIM を呼び出します。 File_TRIMsは、SSD のパフォーマンスを最適化できるように SSD に変換されます。

シン プロビジョニングされた SAN にマウントされたコンシューマー VHD の :

VHD は、最初は、薄くプロビジョニングされた環境の 1 つの最小スラブにマウントされます。 ファイルが VHD に格納されると、VHD の記憶域フットプリントは複数のスラブで増加します。 VHD でファイルが削除されると、Hyper-V は、基になるシン プロビジョニングされた SAN にFile_TRIMを呼び出します。 TRIM が SLAB の粒度よりも大きい場合、SAN は SLAB を削除できるため、その SAN 上の VHD のフットプリントを減らすことができます。

VHD が Windows 8 ベースのサーバーに常駐している場合、ストレージ オプティマイザーは TRIM を送信して、マウントされた VHD 内から VHD のスラブ フットプリントを減らします。

テスト

以前のオペレーティング システム リリースには、同等の API はありません。 ストレージ メディア (正しく実装されている場合) は書き込みパフォーマンスを向上させることができますが、実際の API 自体からのパフォーマンスへの影響はありません。 API は非常に慎重に使用する必要があります。これらのエクステントは記憶域メディアから完全に削除されるため、不要になったエクステントのみを受け渡す必要があります。

リソース