Hyper-V 存储:缓存层和数据一致性的影响

本文概述了虚拟存储堆栈中的缓存,并为软件开发人员和管理员提供指导,以确保满足所需的数据一致性要求。

适用于: Windows Server 2012 R2
原始 KB 编号: 2801713

更多信息

至少,系统中的各个缓存层通常涉及以下内容:

  • 文件系统缓存。 默认情况下,Windows 会缓存从磁盘读取并写入磁盘的文件数据。 这意味着读取操作从系统内存中称为系统文件缓存的区域读取文件数据,而不是从物理磁盘读取文件数据。 相应地,写入操作会将文件数据写入系统文件缓存而不是磁盘,这种缓存称为写回缓存。 应用程序可以使用文件系统无缓冲语义来确保写入不会缓存在系统缓存中。
  • 磁盘驱动器缓存。 磁盘驱动器在固件层实现缓存,以提高磁盘驱动器的性能。 尽管在固件层进行缓存可以提高性能,但在发生电源故障时,磁盘上的数据在写入磁盘之前可能会丢失。 用于控制此缓存行为的选项是标准化驱动器接口(如 SCSI、SATA 和 ATA)的一部分。 这些选项如下所示:
    1. 使用称为强制单元访问的按 I/O 控制机制 (FUA) 。 此标志指定驱动器应在信号完成之前将数据写入稳定的媒体存储。 必须执行此操作的应用程序确保磁盘问题 FUA 上的数据稳定,以确保在发生电源故障时不会丢失数据。

      服务器类磁盘驱动器 (SCSI 和光纤通道) 通常支持 FUA 标志。 在 (ATA、SATA 和 USB) 的商品驱动器上,FUA 可能不受认可。 除非禁用驱动器的写入缓存,否则这可能会使数据处于不一致状态。 如果依赖于此机制,请确保磁盘子系统正确处理 FUA。

    2. 强制磁盘缓存刷新。 向磁盘发送刷新的应用程序或系统将强制磁盘子系统将其缓存中的所有数据写入磁盘。 太频繁地发出刷新会产生性能后果,因为在刷新返回之前,磁盘缓存中的所有信息都必须写入磁盘媒体。

    3. 禁用磁盘缓存。 可以通过向磁盘发出IOCTL_DISK_SET_CACHE_INFORMATION控制代码来禁用磁盘的写入缓存。 在系统重启后,将保留写入缓存 (打开或关闭) 的状态。 发出此控制代码将对颁发给该磁盘的所有 I/O 机制产生非常显著的性能后果。 这些后果很可能包括性能明显下降。 在部署之前,应仔细考虑使用此控制代码。

      注意

      如果无法禁用磁盘缓存,应考虑选项 1 和 2。

因此,如果应用程序或工作负荷在虚拟机 (VM) 内运行,则各种缓存层具有数据一致性影响。

  • 来宾文件系统缓存。 如前所述,可以使用文件系统未缓冲区语义绕过此层。

  • 来宾虚拟磁盘缓存。 虚拟化 IDE (模拟或合成) 或 SCSI 设备将报告由下层堆栈返回的写入缓存状态。 虚拟磁盘将报告其写入缓存已启用,并且拒绝让来宾关闭写入缓存。 禁用缓存将失败,并且始终响应已启用缓存。 出于以下原因,此行为是必需的:

    • Hyper-V 无法假设在同一磁盘上运行的所有 VM 都必须具有相同的磁盘缓存设置。

    • 基础存储可能有一个始终打开的写入缓存,该缓存无法关闭。 虚拟磁盘可能迁移到同一主机上的不同磁盘, (实时存储迁移) ,或者 (实时迁移) 的不同主机,这一点强调了这一点。

      由于应用程序无法关闭磁盘缓存,因此来宾中必须在电源故障期间确保数据完整性的任何应用程序都必须使用选项 1 或选项 2 来确保写入绕过磁盘缓存。

  • 主机文件系统缓存。 Hyper-V 存储堆栈还使用无缓冲区写入来确保来自来宾的写入绕过基础主机文件系统堆栈。

  • 主机磁盘缓存。 如果由来宾设置,则 FUA 将传播到主机和主机存储堆栈。 主机物理磁盘系统必须至少满足以下条件之一,以确保通过电源故障实现虚拟化工作负载数据完整性:

    • 系统使用服务器类磁盘 (SCSI、光纤通道) 。
    • 系统确保磁盘连接到电池备份的缓存主机总线适配器 (HBA) 。
    • 系统使用存储控制器 (例如 RAID 系统) 作为存储设备。
    • 系统确保不间断电源 (UPS) 保护磁盘电源。
    • 系统确保禁用磁盘的写入缓存功能。