新 API 允许应用将“TRIM 和取消映射”提示发送到存储媒体

平台

客户端 – Windows 8
Server – 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 和 Software Spaces 以大于扇区或群集的大小分配存储区域(从 1MB 到 1GB)。 当它们收到其分配大小(或大于分配大小)的 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 代码按上述盘区指定的逐个发送区域。

文件 TRIM 不会等待设备返回,因为 TRIM 和 Unmap 命令被定义为基础存储介质的提示,并且不需要返回代码。

端到端工作流:

  1. 调用文件剪裁
    1. 文件 TRIM 检查输入是否出错
    2. 文件 TRIM 将盘区分解为 LCN 区域
    3. 文件 TRIM 向上和向下舍入传入 TRIM 的不对齐区域
    4. 文件 TRIM 清除缓存中与 TRIM 区域相关的条目
    5. 文件 TRIM 按区域传递IOCTL_DSM(剪裁)
  2. 文件 TRIM 返回或错误
    1. 对输入有效性执行错误检查
    2. 如果只有一些盘区有效,则会为完整的 API 调用返回一个错误

用例

装载在 SSD 上的 使用者虚拟硬盘(VHD):

VHD 最初装载在“clean”未使用的媒体上。 使用 VHD 时,VHD 会为文件使用存储介质的一部分,等等。删除存储介质中的文件时,不会从 SSD 中删除这些文件,因为完整的 VHD 作为一个文件存储在 SSD 上。 Hyper-V 环境针对 VHD 环境中发生删除文件时删除的所有区域调用 File TRIM。 File_TRIMs将转换为 SSD,以便可以优化 SSD 性能。

在精简预配的 SAN 上装载的使用者 VHD

VHD 最初安装在精简预配环境的一个最小板上。 由于文件存储在 VHD 中,VHD 的存储占用量在多个板块中增长。 在 VHD 中删除文件时,Hyper-V 调用基础精简预配的 SAN File_TRIM。 如果 TRIM 大于 SLAB 粒度,则 SAN 现在可以删除 SLAB,从而减少该 SAN 上的 VHD 占用量。

如果 VHD 驻留在基于 Windows 8 的服务器上,存储优化器还会发送 TRIM,以减少 VHD 在已装载的 VHD 中的板占用。

测试

早期作系统版本中没有可比的 API。 实际 API 本身不应产生性能影响,但存储介质(如果正确实现)可以显示更好的写入性能。 应非常小心地使用 API;应仅传递不再需要的盘区,因为这些盘区将从存储介质中永久删除。

资源