管理 Hyper-V 虚拟机监控程序调度程序类型

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

本文介绍在 Windows Server 2016 中推出的虚拟处理器调度逻辑的新模式。 这些模式或调度程序类型确定了 Hyper-V 虚拟机监控程序如何跨来宾虚拟处理器分配和管理工作。 Hyper-V 主机管理员可以:

  • 选择最适合来宾虚拟机 (VM) 的虚拟机监控程序调度程序类型。
  • 配置 VM 以利用调度逻辑。

必备条件

必须安装以下更新才能使用本文后面所述的虚拟机监控程序调度程序功能。 这些更新包括为支持新的 hypervisorschedulertype BCD 选项(必须为主机配置使用此选项)而需要做出的更改。

版本 版本 所需的更新 知识库文章
Windows Server 2016 1607 2018.07 C KB4338822
Windows Server 2016 1703 2018.07 C KB4338827
Windows Server 2016 1709 2018.07 C KB4338817
Windows Server 2019 1804

背景

在讨论 Hyper-V 虚拟处理器调度背后的逻辑和控制之前,请务必了解某些概念,例如同时多线程处理以及 Hyper-V 如何虚拟化处理器。

了解 SMT

同时多线程 (SMT) 是现代处理器设计中的一种技术,允许单独独立的执行线程共享处理器资源。 SMT 通常为大多数工作负载提供适度的性能提升。 它会尽可能地并行化计算,增加指令吞吐量。 但是,有时当线程相互争用共享处理器资源时,性能没有明显改善,甚至略有损失。

若要将 SMT 与 Windows Server 配合使用,必须具有兼容的处理器。 例如,具有 Intel 超线程技术或 Advanced Micro Devices (AMD) 多线程 (SMT) 的处理器。

在本文中,对 SMT 的描述以及 Hyper-V 使用它的方式同样适用于 Intel 和 AMD 系统。

了解 Hyper-V 如何虚拟化处理器

在考虑虚拟机监控程序调度程序类型之前,应了解 Hyper-V 体系结构。 可以在 Hyper-V 技术概述中找到有关此体系结构工作原理的更详细摘要,但目前,应记住以下概念:

  • Hyper-V 在虚拟机监控程序的控制下创建和管理 VM 分区,在分区之间分配和共享计算资源。 分区在所有来宾 VM 之间以及来宾 VM 与根分区之间提供强隔离边界。

  • 根分区本身是 VM 分区,尽管它具有独特的属性和相比来宾 VM 更高的特权。 根分区:

    • 提供用于控制所有来宾 VM 的管理服务。
    • 为来宾提供虚拟设备支持。
    • 管理来宾 VM 的所有设备输入和输出。

    建议不要在根分区中运行任何应用程序工作负载。

  • 根分区的每个虚拟处理器 (VP) 以一对一映射到底层逻辑处理器 (LP)。 主机 VP 始终在同一基础 LP 上运行。 根分区的 VP 没有迁移。

  • 默认情况下,托管根分区的 VP 运行的 LP 也可以运行来宾 VP。

  • 虚拟机监控程序可能会调度来宾 VP 在任何可用的逻辑处理器上运行。 虽然虚拟机监控程序调度程序在调度来宾 VP 时会尝试考虑时间缓存局部性、非统一内存访问 (NUMA) 拓扑和许多其他因素,但最终可以在任何主机 LP 上调度 VP。

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

在 Windows Server 2016 中,Hyper-V 虚拟机监控程序支持多种调度程序逻辑模式,这些模式决定了虚拟机监控程序如何在底层逻辑处理器上调度虚拟处理器。 这些调度程序类型为:

经典调度程序

自 Windows Hyper-V 虚拟机监控程序问世以来,经典调度程序一直是所有虚拟机监控程序版本(包括 Windows Server 2016 Hyper-V)的默认设置。 经典调度程序为来宾虚拟处理器提供公平、抢先式的轮循调度模式。

经典调度程序类型最适合大多数传统 Hyper-V 用途,例如私有云、托管服务提供商等。 经典调度程序类型的性能特征最适合用于支持各种虚拟化方案,例如:

  • 将 VP 过度订阅到 LP。
  • 同时运行许多异类 VM 和工作负载。
  • 运行更大规模的高性能 VM。
  • 不受限制地支持 Hyper-V 的完整功能集和其他方案。

核心调度程序

虚拟机监控程序核心调度程序在 Windows Server 2016 和 Windows 10 版本 1607 中引入,是可以取代经典调度程序逻辑的技术。 核心调度程序为来宾工作负载隔离提供了强大的安全边界。 它还减少了在启用 SMT 的虚拟化主机上运行的 VM 内部工作负载的性能可变性。 核心调度程序支持在同一启用 SMT 的虚拟化主机上同时运行 SMT 和非 SMT VM。

核心调度程序:

  • 使用虚拟化主机的 SMT 拓扑。
  • (可选)向来宾 VM 公开 SMT 对。
  • 将同一 VM 中的来宾虚拟处理器组调度到 SMT 逻辑处理器组。

这项工作是对称发生的。 如果 LP 以两个为一组,则以两个为一组的形式调度 VP,并且核心永远不会在 VM 之间共享。 为未启用 SMT 的 VM 调度 VP 时,该 VP 会在运行时消耗整个核心。 核心调度程序的整体结果是:

  • 它为来宾工作负载隔离创建强大的安全边界。 来宾 VP 只能在基础物理核心对上运行,从而减少对对旁通道窃听攻击的漏洞。
  • 它减少了吞吐量的可变性。
  • 这可能会降低性能。 如果组中只有一个 VP 可以运行,则核心中只有一个指令流会启动,而另一个会处于空闲状态。
  • 在来宾 VM 中运行的操作系统和应用程序可以利用 SMT 行为与编程接口 (API) 来控制和跨 SMT 线程分配工作,就像它们在使用物理计算机一样。

从 Windows Server 2019 起,Hyper-V 默认使用核心调度程序。 在早期版本(如 Windows Server 2016)中,调度程序是可选的,经典调度程序是默认选项。

禁用主机 SMT 时的核心调度程序行为

在某些情况下,可以将虚拟机监控程序配置为使用核心调度程序类型,但 SMT 功能已禁用或不存在于虚拟化主机上。 在这些情况下,无论虚拟机监控程序调度程序类型设置如何,都会使用经典调度程序行为。

根调度程序

根调度程序是随 Windows 10 1803 版本而来的。 启用根调度程序类型时,虚拟机监控程序会提供工作调度的根分区控制。 根分区的 OS 实例中的 NT 调度程序管理系统 LP 调度工作的所有方面。

根调度程序解决了支持实用工具分区并提供强工作负载隔离的独特要求,与 Windows Defender 应用程序防护 (WDAG) 一起使用。 在这种情况下,将调度责任留给根 OS 可带来多种优势:

  • 可以使用适用于容器方案的 CPU 资源控制和实用工具分区,从而简化管理和部署。
  • 根 OS 调度程序可以轻松地收集容器中工作负载 CPU 使用情况的指标。 它可以将此数据用作适用于系统中所有其他工作负载的相同调度策略的输入。
  • 这些相同的指标还有助于将应用程序容器中完成的工作归因于主机系统。 对于传统的 VM 工作负载,跟踪这些指标更加困难,其中一些代表所有运行的 VM 的工作在根分区中发生。

在客户端系统上使用根调度程序

从 Windows 10 版本 1803 开始,根调度程序默认仅在客户端系统上使用,这意味着:

  • 可以让虚拟机监控程序支持基于虚拟化的安全性和 WDAG 工作负载隔离。
  • 必须正确运行具有异类核心体系结构的未来系统。

此配置是客户端系统唯一支持的虚拟机监控程序调度程序配置。 管理员不应尝试替代 Windows 客户端系统上的默认虚拟机监控程序调度程序类型。

虚拟机 CPU 资源控制和根调度程序

启用虚拟机监控程序根调度程序时,不支持 Hyper-V 提供的 VM 处理器资源控制。 根操作系统的调度程序逻辑在全局基础上管理主机资源,并且不管理单个 VM 的来宾资源。 仅当虚拟机监控程序直接控制 VP 调度时(例如,使用经典和核心调度程序类型进行控制),Hyper-V 的按 VM 处理器资源控制(例如上限、权重和预留)才适用。

在服务器系统上使用根调度程序

不建议在服务器上将根调度程序与 Hyper-V 配合使用。 其性能特征尚未完全成型和优化,不一定能适应许多服务器虚拟化部署中常见的各种工作负载。

在来宾 VM 中启用 SMT

将虚拟化主机的虚拟机监控程序配置为使用核心调度程序类型后,还可以将来宾 VM 配置为使用 SMT。 公开将 VP 超线程化到来宾 VM 这一事实,可使来宾操作系统中的调度程序以及 VM 中运行的工作负载能够在其自身的工作调度中检测和使用 SMT 拓扑。

  • 在 Windows Server 2016 中,默认情况下未配置来宾 SMT。 Hyper-V 主机管理员必须显式启用它。
  • 从 Windows Server 2019 开始,在主机上创建的新 VM 默认将继承主机 SMT 拓扑。 例如,在每个核心两个 SMT 线程的主机上创建的 9.0 版 VM 也会每个核心有两个 SMT 线程。

必须使用 PowerShell 在来宾 VM 中启用 SMT。 Hyper-V 管理器中不提供任何用户界面。 若要在来宾 VM 中启用 SMT,请执行以下操作:

  1. 使用属于 Hyper-V 管理员组成员的帐户或等效帐户打开 PowerShell 窗口。
  2. 运行 Set-VMProcessor -VMName <VMName> -HwThreadCountPerCore <n>,其中 <n> 是来宾 VM 看到的每核心 SMT 线程数。 <n> = 0 设置 HwThreadCountPerCore 值以匹配主机的每个核心 SMT 线程数值。

注意

在 Windows Server 2019 及更高版本中,你可以设置 HwThreadCountPerCore = 0 而不是匹配主机 SMT 线程计数。

以下屏幕截图显示了从 VM 中运行的来宾操作系统获取的系统信息。 有两个虚拟处理器且 SMT 已启用。 来宾操作系统正在检测属于同一核心的两个逻辑处理器。

Screenshot that shows msinfo32 in a guest VM with SMT enabled.

在 Windows Server 2016 Hyper-V 上配置虚拟机监控程序调度程序类型

Windows Server 2016 Hyper-V 默认使用经典虚拟机监控程序调度程序模型。 可以选择将虚拟机监控程序配置为使用核心调度程序。 核心调度程序通过限制来宾 VP 在相应的物理 SMT 对上运行来提高安全性。 此配置支持对来宾 VP 使用具有 SMT 调度的 VM。

注意

建议所有运行 Windows Server 2016 Hyper-V 的客户选择核心调度程序,以确保其虚拟化主机得到最佳保护,免受潜在恶意来宾 VM 的侵害。

Windows Server 2019 Hyper-V 默认使用核心调度程序

为确保将 Hyper-V 主机部署在最佳安全配置中,Windows Server 2019 Hyper-V 现在默认会使用核心虚拟机监控程序调度程序模式。 主机管理员可以选择将主机配置为使用传统的经典调度程序。 在替代调度程序类型默认设置之前,管理员应仔细阅读、理解并考虑每种调度程序类型对虚拟化主机的安全性和性能影响。 有关详细信息,请参阅关于 Hyper-V 虚拟机监控程序调度程序类型的选择

在 Windows Server 上选择虚拟机监控程序调度程序类型

虚拟机监控程序调度程序配置由 hypervisorschedulertype BCD 条目控制。

选择调度程序类型:

  1. 使用管理员特权打开命令提示符。
  2. 输入 bcdedit /set hypervisorschedulertype type,其中 type 是以下选项之一:
  • Classic
  • Core
  • Root

必须重启系统才能对,对虚拟机监控程序调度程序类型所做的任何更改才能生效。

注意

Windows Server Hyper-V 目前不支持虚拟机监控程序根调度程序。 Hyper-V 管理员不应尝试为服务器虚拟化方案配置根调度程序。

确定当前调度程序类型

可以通过检查事件查看器系统日志来确定 Hyper-V 当前正在使用的虚拟机监控程序调度程序类型。 可以看到最新的虚拟机监控程序启动事件 ID 2,它会报告在虚拟机监控程序启动时配置的虚拟机监控程序调度程序类型。 可以通过 Windows 事件查看器或 PowerShell 获取虚拟机监控程序启动事件。

虚拟机监控程序启动事件 ID 2 表示虚拟机监控程序调度程序类型,其中:

  • 1 = 经典调度程序,已禁用 SMT
  • 2 = 经典调度程序
  • 3 = 核心调度程序
  • 4 = 根调度程序

A screenshot of the hypervisor launch event ID 2 properties window. The user has selected the General tab, showing that the hypervisor scheduler type is 0x2.

A screenshot of the Event Viewer window. The user has selected Hyper-V Hypervisor launch event ID 2 from the list of events, highlighting it in dark blue.

使用 PowerShell 查询 Hyper-V 虚拟机监控程序调度程序类型启动事件

若要使用 PowerShell 查询虚拟机监控程序事件 ID 2,请在 PowerShell 提示符下运行以下命令:

Get-WinEvent -FilterHashTable @{ProviderName="Microsoft-Windows-Hyper-V-Hypervisor"; ID=2} -MaxEvents 1

A screenshot of a query for hypervisor launch event ID 2. The results say hypervisor scheduler type is 0x2.