关于 Hyper-V 虚拟机监控程序调度程序类型的选择

适用于:Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows Server 版本 1709、Windows Server 版本 1803

本文档介绍 Hyper-V 的默认和建议使用的虚拟机监控程序调度程序类型的重要更改。 这些更改会影响系统安全性和虚拟化性能。 虚拟化主机管理员应查看并了解本文档中所述的更改和影响,并认真评估影响、建议的部署指导和风险因素,以便最充分地了解如何在快速变化的安全环境中部署和管理 Hyper-V 主机。

重要

在启用了同时多线程 (SMT) 的主机上运行时,恶意来宾 VM 可以通过传统虚拟机监控程序经典调度程序类型的调度行为来利用多处理器体系结构中存在的当前已知旁道安全漏洞。 如果成功利用,则恶意工作负载可以观察其分区边界之外的数据。 通过将 Hyper-V 虚拟机监控程序配置为利用虚拟机监控程序核心调度程序类型并重新配置来宾 VM,可以缓解此类攻击。 使用核心调度程序,虚拟机监控程序可以限制来宾 VM 的 VP 在同一物理处理器核心上运行,因此能够可靠地将 VM 访问数据的能力与它运行所在的物理核心的边界相隔离。 这是针对这些旁道攻击的非常有效的缓解措施,可以防止 VM 观察其他分区(无论是根分区还是另一个来宾分区)中的任何项目。 因此,Microsoft 正在更改虚拟化主机和来宾 VM 的默认和建议的配置设置。

背景

从 Windows Server 2016 开始,Hyper-V 支持多种调度和管理虚拟处理器的方法,称为虚拟机监控程序调度程序类型。 有关所有虚拟机监控程序调度程序类型的详细说明,请参阅了解和使用 Hyper-V 虚拟机监控程序调度程序类型

注意

新的虚拟机监控程序调度程序类型最初在 Windows Server 2016 中引入,而在以前的版本中并不提供。 Windows Server 2016 之前的所有 Hyper-V 版本仅支持经典调度程序。 对核心调度程序的支持是最近才发布的。

关于虚拟机监控程序调度程序类型

本文专门重点介绍新的虚拟机监控程序核心调度程序类型与传统“经典”调度程序的用法差别,以及这些调度程序类型与对称多线程 (SMT) 的重合之处。 必须了解核心和经典调度程序之间的差异,以及每种类型如何在底层系统处理器上施加来宾 VM 的工作。

经典调度程序

经典调度程序是指在整个系统中的虚拟处理器 (VP)(包括根 VP 以及属于来宾 VM 的 VP)上按公平分配原则以轮循方法调度工作。 一直以来,经典调度程序都是所有 Hyper-V 版本上使用的默认调度程序类型(从 Windows Server 2019 开始不是如此,具体请参阅本文)。 经典调度程序的性能特征众所周知,它已证实能够很好地支持工作负载的超额订阅 – 即超额订阅主机 VP:LP 比率的一个合理余量(取决于要虚拟化的工作负载类型、整体资源利用率等)。

在启用了 SMT 的虚拟化主机上运行时,经典调度程序将在属于核心的每个 SMT 线程上独立调度任何 VM 的来宾 VP。 因此,不同的 VM 可以同时在同一个核心上运行(一个 VM 在核心的一个线程上运行,另一个 VM 在另一个线程上运行)。

核心调度程序

核心调度程序利用 SMT 的属性来隔离来宾工作负载,这会影响安全性和系统性能。 核心调度程序确保在同级 SMT 线程上调度 VM 的 VP。 这是以对称方式实现的,因此如果 LP 以两个为一组,则以两个为一组的形式调度 VP,并且系统 CPU 核心永远不会在 VM 之间共享。

通过在底层 SMT 对上调度来宾 VP,核心调度程序为工作负载隔离提供可靠的安全边界,并且还可用于降低延迟敏感型工作负载的性能可变性。

请注意,为未启用 SMT 的虚拟机调度 VP 时,该 VP 将在运行时占用整个核心,并且核心的同级 SMT 线程将保持空闲状态。 这对于提供正确的工作负载隔离是必要的,但会影响整体系统性能,尤其是当系统 LP 超额订阅时 - 即,当总 VP:LP 比率超过 1:1 时。 因此,运行未配置每个核心有多个线程的来宾 VM 是欠佳的配置。

使用核心调度程序可获得的优势

核心调度程序提供以下优势:

  • 可靠隔离来宾工作负载的安全边界 – 来宾 VP 被限制为在底层物理核心对上运行,从而提高了旁道窥探攻击的难度。

  • 降低工作负载可变性 - 来宾工作负载吞吐量可变性显著降低,从而提供更好的工作负载一致性。

  • 在来宾 VM 中使用 SMT - 在来宾虚拟机中运行的操作系统和应用程序可以利用 SMT 行为与编程接口 (API) 来控制和跨 SMT 线程分配工作,就如同它们以非虚拟化方式运行时一样。

核心调度程序当前在 Azure 虚拟化主机上使用,专门利用可靠安全边界和低工作负载可变性的优势。 Microsoft 认为,核心调度程序类型应该且将会持续成为大多数虚拟化方案的默认虚拟机监控程序调度类型。 因此,为了确保客户在默认情况下是安全的,Microsoft 目前正在对 Windows Server 2019 做出这项更改。

核心调度程序性能对来宾工作负载的影响

虽然我们有必要有效缓解某些类别的漏洞,但核心调度程序也可能会降低性能。 客户可能会发现其 VM 的性能特征出现差异,并且其虚拟化主机的整体工作负载容量受到了影响。 在核心调度程序必须运行非 SMT VP 的情况下,底层逻辑核心中只有一个指令流会执行,而另一个必须保持空闲状态。 这会限制来宾工作负载的总主机容量。

遵循本文档中的部署指导可将这些性能影响降至最低。 主机管理员必须认真考虑他们的具体虚拟化部署方案,并在对安全风险的容许度与最大工作负载密度、虚拟化主机的过度整合等需求之间做出平衡。

部署安全状况最佳的 Hyper-V 主机需要使用虚拟机监控程序核心调度程序类型。 为确保客户在默认情况下是安全的,Microsoft 正在更改以下默认和建议设置。

注意

虽然虚拟机监控程序对调度程序类型的内部支持已包含在 Windows Server 2016、Windows Server 1709 和 Windows Server 1803 的初始版本中,但需要进行更新才能访问允许选择虚拟机监控程序调度程序类型的配置控件。 有关这些更新的详细信息,请参阅了解和使用 Hyper-V 虚拟机监控程序调度程序类型

虚拟化主机更改

  • 从 Windows Server 2019 开始,虚拟机监控程序默认将使用核心调度程序。

  • Microsoft 建议在 Windows Server 2016 上配置核心调度程序。 Windows Server 2016 支持虚拟机监控程序核心调度程序类型,但默认使用经典调度程序。 核心调度程序是可选的,必须由 Hyper-V 主机管理员显式启用。

虚拟机配置更改

  • 在 Windows Server 2019 上,使用默认 VM 版本 9.0 创建的新虚拟机将自动继承虚拟化主机的 SMT 属性(已启用或已禁用)。 也就是说,如果在物理主机上启用了 SMT,则新建的 VM 也将启用 SMT,并且默认会继承主机的 SMT 拓扑,VM 的每核心硬件线程数与底层系统相同。 VM 的配置中反映了这一点:HwThreadCountPerCore = 0,其中 0 表示 VM 应继承主机的 SMT 设置。

  • VM 版本为 8.2 或更低版本的现有虚拟机将保留其原始 VM 处理器 HwThreadCountPerCore 设置,而 VM 版本为 8.2 的来宾的默认设置为 HwThreadCountPerCore = 1。 当这些来宾在 Windows Server 2019 主机上运行时,将按如下所述对待它们:

    1. 如果 VM 的 VP 计数小于或等于 LP 核心计数,则该 VM 将被核心调度程序视为非 SMT VM。 当来宾 VP 在单个 SMT 线程上运行时,核心的同级 SMT 线程将处于空闲状态。 这是配置不是最佳的,并会导致整体性能损失。

    2. 如果 VM 的 VP 计数大于 LP 核心计数,则 VM 将被核心调度程序视为 SMT VM。 但是,VM 不会表露出它是 SMT VM 的其他迹象。 例如,OS 或应用程序使用 CPUID 指令或 Windows API 来查询 CPU 拓扑并不表明启用了 SMT。

  • 当通过 Update-VM 操作将现有 VM 从较低 VM 版本显式更新到版本 9.0 时,VM 将保留其当前 HwThreadCountPerCore 值。 不会为 VM 强制启用 SMT。

  • 在 Windows Server 2016 上,Microsoft 建议为来宾 VM 启用 SMT。 默认情况下,除非显式更改,否则在 Windows Server 2016 上创建的 VM 将禁用 SMT,即 HwThreadCountPerCore 设置为 1。

注意

Windows Server 2016 不支持将 HwThreadCountPerCore 设置为 0。

管理虚拟机 SMT 配置

来宾虚拟机 SMT 配置是基于每个 VM 设置的。 主机管理员可以检查和配置 VM 的 SMT 配置,以从以下选项中进行选择:

  1. 将 VM 配置为以启用 SMT 的形式运行,并选择性地自动继承主机 SMT 拓扑

  2. 将 VM 配置为以非 SMT 运行

VM 的 SMT 配置显示在 Hyper-V 管理器控制台的摘要窗格中。 可以使用 VM 设置或 PowerShell 来配置 VM 的 SMT 设置。

使用 PowerShell 配置 VM SMT 设置

若要为来宾虚拟机配置 SMT 设置,请使用足够的权限打开 PowerShell 窗口,然后键入:

Set-VMProcessor -VMName <VMName> -HwThreadCountPerCore <0, 1, 2>

其中:

  • 0 = 从主机继承 SMT 拓扑(Windows Server 2016 不支持 HwThreadCountPerCore=0 设置)

  • 1 = 非 SMT

  • > 1 的值 = 每个核心所需的 SMT 线程数。 不能超过每个核心的物理 SMT 线程数。

若要读取来宾虚拟机的 SMT 设置,请使用足够的权限打开 PowerShell 窗口,然后键入:

(Get-VMProcessor -VMName <VMName>).HwThreadCountPerCore

请注意,配置了 HwThreadCountPerCore = 0 的来宾 VM 表示将为来宾启用 SMT,并向来宾公开与底层虚拟化主机上相同数量的 SMT 线程,通常为 2。

在 VM 移动方案中,来宾 VM 可能会观察到 CPU 拓扑的更改

VM 中的 OS 和应用程序可能会在 VM 生命周期事件(例如实时迁移或保存和还原操作)之前和之后看到主机和 VM 设置的更改。 在执行保存和还原 VM 状态的操作期间,VM 的 HwThreadCountPerCore 设置和实现的值(即 VM 设置和源主机配置的计算组合)都将被迁移。 VM 将继续在目标主机上使用这些设置运行。 在 VM 关闭和重启时,VM 观察到的已实现值可能会更改。 这应该是良性的,因为 OS 和应用程序层软件应该在执行其正常启动和初始化代码流过程中查找 CPU 拓扑信息。 但是,由于这些启动时初始化序列在实时迁移或保存/还原操作期间将被跳过,因此经历这些状态转换的 VM 可以观察到最初计算出的已实现值,直到将其关闭并重启。

有关非最佳 VM 配置的警报

配置的 VP 数比主机上物理核心数更多的虚拟机会导致非最佳配置。 虚拟机监控程序调度程序会将这些 VM 视为 SMT 感知 VM。 但是,VM 中的 OS 和应用程序软件将呈现一个 CPU 拓扑,其中显示 SMT 已禁用。 检测到此状态时,Hyper-V 工作进程将在虚拟化主机上记录一个事件,向主机管理员警告 VM 的配置不是最佳的,并建议为 VM 启用 SMT。

如何识别以非最佳方式配置的 VM

可以通过在事件查看器的系统日志中检查 Hyper-V 工作进程事件 ID 3498 来识别非 SMT VM,只要 VM 中的 VP 数大于物理核心计数,就会针对 VM 触发该事件。 可以通过事件查看器或 PowerShell 获取工作进程事件。

使用 PowerShell 查询 Hyper-V 工作进程 VM 事件

若要使用 PowerShell 查询 Hyper-V 工作进程事件 ID 3498,请在 PowerShell 提示符下输入以下命令。

Get-WinEvent -FilterHashTable @{ProviderName="Microsoft-Windows-Hyper-V-Worker"; ID=3498}

来宾 SMT 配置对使用来宾操作系统虚拟机监控程序启发的影响

Microsoft 虚拟机监控程序提供多种启发或提示,来宾 VM 中运行的 OS 可以查询并使用它们来触发优化,例如那些有益于性能或以其他方式改进以虚拟化方式运行时对各种状态的处理的优化措施。 最近引入的一种启发涉及到虚拟处理器调度的处理,以及针对利用 SMT 的旁道攻击使用 OS 缓解措施。

注意

Microsoft 建议主机管理员为来宾 VM 启用 SMT 以优化工作负载性能。

下面提供了此来宾启发的详细信息,但对于虚拟化主机管理员而言,重点是虚拟机的 HwThreadCountPerCore 应配置为与主机的物理 SMT 配置相匹配。 这样,虚拟机监控程序就可以报告不存在非体系结构核心共享的情况。 因此,可以启用任何支持优化的、且这些启发需要优化的来宾 OS。 在 Windows Server 2019 上,创建新的 VM 并保留默认值 HwThreadCountPerCore (0)。 从 Windows Server 2016 主机迁移的旧 VM 可以更新到 Windows Server 2019 配置版本。 执行此操作后,Microsoft 建议设置 HwThreadCountPerCore = 0。 在 Windows Server 2016 上,Microsoft 建议设置 HwThreadCountPerCore 以便与主机配置(通常设置为 = 2)相匹配。

NoNonArchitecturalCoreSharing 启发详细信息

从 Windows Server 2016 开始,虚拟机监控程序定义了一个新的启发来描述它如何在来宾 OS 中处理 VP 的调度和放置。 虚拟机监控程序顶级功能规范 v5.0c 中定义了此启发。

虚拟机监控程序合成 CPUID 叶 CPUID.0x40000004.EAX:18[NoNonArchitecturalCoreSharing = 1] 表示虚拟处理器永远不会与另一个虚拟处理器共享物理核心,但报告为同级 SMT 线程的虚拟处理器除外。 例如,当根 VP 在同一处理器核心的同级 SMT 线程上运行时,来宾 VP 永远不会在 SMT 线程上与该根 VP 一起运行。 这种状态只有在以虚拟化方式运行时才有可能出现,因此代表了一种非体系结构 SMT 行为,它也会造成严重的安全隐患。 来宾 OS 可以使用 NoNonArchitecturalCoreSharing = 1 来指示启用优化是安全的,这可能有助于避免设置 STIBP 所带来的性能开销。

在某些配置中,虚拟机监控程序不会指示 NoNonArchitecturalCoreSharing = 1。 例如,如果主机启用了 SMT 并配置为使用虚拟机监控程序经典调度程序,则 NoNonArchitecturalCoreSharing 为 0。 这可能会阻止受启发的来宾启用某些优化。 因此,Microsoft 建议使用 SMT 的主机管理员依赖于虚拟机监控程序核心调度程序,并确保虚拟机配置为从主机继承其 SMT 配置,从而确保最佳的工作负载性能。

总结

安全威胁格局不断演变。 为确保客户在默认情况下是安全的,从 Windows Server 2019 Hyper-V 开始,Microsoft 将更改虚拟机监控程序和虚拟机的默认配置,并为运行 Windows Server 2016 Hyper-V 的客户提供更新的指导和建议。 虚拟化主机管理员应该:

  • 阅读并理解本文档中提供的指导

  • 认真评估并整他们的虚拟化部署,以确保满足安全性、性能、虚拟化密度和工作负载响应能力方面的目标和独特要求

  • 考虑重新配置现有的 Windows Server 2016 Hyper-V 主机,以利用虚拟机监控程序核心调度程序提供的强大安全优势

  • 更新现有的非 SMT 虚拟机,以减轻 VP 隔离(可解决硬件安全漏洞)所施加的调度约束对性能造成的影响