精简预配

概述

精简预配是一项存储管理技术,可优化物理存储资源的分配。 它允许管理员为应用程序分配比实际可用存储空间更大的虚拟存储空间,但预计不会同时使用所有分配的存储空间。

精简预配是一种端到端存储配置解决方案,可提供实时的分配。 这需要对主机和客户端应用程序的存储部署和执行进行计划。

Windows Server 精简预配功能是支持精简预配的存储和主机服务器之间的接口。 精简预配功能包括:

  • 精简预配逻辑单元 (LUN) 标识
  • 阈值通知
  • 资源耗尽的句柄
  • 空间回收,为最终用户提供高可用性和可扩展的存储预配服务

精简预配 LUN 标识

Windows Server 从 Windows Server 2012 开始采用 T10 SCSI Block Command 3 (SBC3) 标准规范来识别精简预配逻辑单元 (LUN)。

在初始目标设备枚举过程中,Windows Server 会收集目标设备的所有属性参数,并识别供应类型以及 UNMAP 和 TRIM 功能。 存储设备根据 SBC3 规范来报告其预配类型以及 UNMAP 和 TRIM 功能。

如果存储设备无法准确报告其当前能力,可能会出现设备兼容性问题。 例如,如果存储设备报告支持 UNMAP 命令,但不支持 UNMAP 命令,则可能出现磁盘格式挂起问题。 如果预配类型信息准确,存储堆栈就能根据存储预配类型提供更好的 I/O 处理。

运行时预配类型或 LUN 容量更改

存储管理员可以更改 LUN 的预配类型或容量。 当预配类型或 LUN 容量发生变化时,存储阵列会引发 UNIT ATTENTION 感知条件,并在请求感知数据时返回正确信息。 Windows Server 会记录系统事件,提醒系统管理员注意预配类型或 LUN 容量的变化。

阈值和资源耗尽句柄

创建精简预配 LUN 时的物理磁盘空间通常小于 LUN 的大小。 阈值通知是提醒主机和客户端应用程序注意存储空间消耗状态的必要功能。

大多数精简预配存储阵列在达到阈值时不会报告事件。 这些精简预配存储解决方案通过其专有的存储管理实用程序来解决阈值通知问题。 因此,对于主机和客户端应用程序来说,此类存储阵列报告的唯一事件就是永久资源耗尽。 当存储空间消耗接近饱和时,精简预配存储设备可使用以下任何一种处理方式来提醒系统管理员或客户端应用程序:

  • 阈值通知句柄。
  • 临时资源耗尽句柄。
  • 永久资源耗尽句柄

精简预配阈值通知

存储管理实用程序会设置精简预配阈值。 Windows Server 不会覆盖存储管理实用工具设置的阈值。 对于精简预配 LUN,存储管理员必须根据平均存储消耗率来指定阈值。 当写入命令超过存储目标设备设置的阈值时,目标设备会使用感知数据终止命令,并发送“已达到精简预配软阈值”消息。 当 Windows Server 收到匹配的感知数据时,会发生以下情况:

  • 系统事件会被记录下来,提醒主机管理员 LUN 设备上的资源使用情况或可用性已达到阈值。
  • 有关已使用和可用映射资源的信息会在目标设备日志页面的系统事件日志中报告。 要生成此报告,存储阵列必须支持逻辑块预配的日志页规范,以便 Windows Server 生成系统事件。
  • 已终止的命令将重试。

如果未设置 FILE_FLAG_WRITE_THROUGH,则在记录此错误后发送的写入命令可能会丢失,因为它们可能会触发永久资源耗尽条件。

临时资源耗尽

当存储阵列在 LUN 上启用自动增长功能时,管理员可以使用临时资源耗尽通知,以确保存储设备能在四秒内为 LUN 分配更多空间。 当写入命令导致临时资源耗尽时,存储设备会使用感知数据终止请求操作的命令,并返回“空间分配正在进行”消息。 临时资源耗尽的处理方法如下:

  • 重试原始请求四次,重试间隔设为 1 秒。
  • 如果所有重试都失败,请求将失败返回应用程序。
  • 如果存储设备无法处理临时资源耗尽,Windows Server 就会通过返回永久资源耗尽状态来阻止下一个写入请求。

永久资源耗尽

永久资源耗尽条件表明精简预配 LUN 已达到最大存储空间限制。 当写入命令期间出现永久资源耗尽时,存储设备会使用感知数据终止操作,并发送“空间分配失败写入保护”消息。 永久耗尽的处理方法如下:

  • 如果命令设置了 FILE_FLAG_WRITE_THROUGH,则写入命令会失败返回应用程序。
  • 如果写入命令没有设置 FILE_FLAG_WRITE_THROUGH,应用程序可能会收到成功响应,但请求没有完成,也没有刷新到物理介质。
  • 系统会记录一个系统事件,其中包含“永久资源耗尽”错误消息。
  • 错误代码会传回分区管理器,而 LUN 会处于脱机状态。

使用 UNMAP 命令回收存储空间

以下情况会触发空间回收:

  • 删除文件。
  • 文件系统级剪裁。
  • 存储优化操作。

文件系统级剪裁为存储设备启用,旨在执行剪裁或取消映射操作后的“读取返回零”。

存储堆栈中的空间回收操作

Windows Server 会将文件删除或剪裁通知转换为相应的 UNMAP 请求:

  • 从文件系统中删除大文件时。
  • 当触发文件系统级剪裁时。

存储端口驱动程序堆栈会根据存储设备的协议类型,将 UNMAP 请求转换为 SCSI UNMAP 命令或 ATA TRIM 命令。 在存储设备枚举过程中,Windows 存储堆栈会收集有关存储设备是否支持 UNMAP 或 TRIM 命令的信息。 如果存储设备具有 SCSI UNMAP 或 ATA TRIM 功能,则只会向存储设备发送 UNMAP 请求。 Windows Server 还提供了在存储目标设备上取消 LBA 映射的 API 实现。 Windows Server 不采用 T10 SCSI WRITE SAME 命令集。

来自 Hyper-V 来宾操作系统的 UNMAP 请求

在创建虚拟机 (VM) 的过程中,Hyper-V 主机会询问虚拟硬盘 (VHD) 所在的存储设备是否支持 UNMAP 或 TRIM 命令。 从 VM 来宾 OS 的文件系统中删除大文件时,来宾 OS 会向虚拟机的虚拟硬盘 (VHD) 或 VHD 文件(或 VHDX 文件)发送文件删除请求。 VM 的 VHD 或 VHDX 文件将 SCSI UNMAP 请求通过隧道传输到 Windows Hyper-V 主机的类驱动程序栈,如下所示:

  • 如果 VM 具有 VHD 文件,VHD 会将 SCSI UNMAP 或 ATA TRIM 命令转换为 数据集管理 I/O 控制代码 TRIM 请求,然后将请求发送到主机存储设备。
  • 如果 VM 具有 VHDX 文件,则 VHD 文件系统会将 SCSI UNMAP 或 ATA TRIM 命令转换为文件系统级的剪裁请求,然后将请求发送到主机操作系统。

Windows Hyper-V 还支持从来宾操作系统调用 IOCTL DSM TRIM。

Windows 优化驱动器实用工具

最终用户或系统管理员可以使用“优化驱动器”实用工具,通过创建手动请求或优化计划配置来回收空间。 如果磁盘驱动器是精简预配 LUN,则磁盘驱动器的介质类型将显示为“精简预配驱动器”。

系统管理员可使用“优化驱动器”实用工具来计划存储空间合并。 如果系统连续三次错过了计划运行,该实用工具还可以通知系统管理员。

检索板映射状态

在精简预配 LUN 中,所有逻辑块都按板(群集)分组。 存储设备报告的 OPTIMAL UNMAP GRANULARITY 参数设置板大小。 所有板都分为已映射、已解除分配或已锚定状态。 Windows Server 将已解除分配和已锚定状态都视为未映射状态。 Windows Server 提供了 API 实现或 IOCTL DSM 分配,用于从精简预配 LUN 检索 LBA 配置状态,以进行存储管理操作。 应用程序可调用 IOCTL DSM 分配例程来发送 SCSI 命令,并检索特定范围内每个板的映射或未映射状态。 如果返回的 LBA 预配状态没有描述整个分配范围,应用程序将发送另一条 SCSI 命令,以检索剩余 LBA 范围的预配状态。

存储设备不需要在一次返回中处理整个 LBA 范围。 如果返回了原始请求的部分 LBA 范围,则发送另一条命令以检索剩余 LBA 范围的映射状态。