Hyper-V 线程优先级主机和客户机 - 它们如何对应?

Hyper-V 线程优先级主机和客户机 - 它们如何对应?

是的,有趣的问题。

给定:Hyper-V 虚拟机的主机。HPC 类型集群。

上面有许多虚拟机。它们大多数时候不会占用 CPU。我们还在内部运行 HPC 类型的集群 - 代理拉取作业并进行处理。

有传言说要在我们的 Hyper-V 机器上安装代理。目前,这将为我们带来显著的性能提升 - 直到夏天我们才能真正提升计算集群的硬件。

代理在低优先级线程中运行所有计算。对于普通计算机来说,这意味着代理基本上会最大化 CPU 使用率,但实际上不会干扰计算机操作本身 - 我甚至可以在代理运行时观看 DVD。

现在,Hyper-V 的情况如何?Hyper-V 核心为虚拟 CPU 赋予了什么“线程优先级”?根分区的优先级是否高于虚拟机?我不希望代理干扰正在运行的虚拟机。

答案1

Hyper-V 父分区或管理操作系统在虚拟机管理程序中很特殊。如果其虚拟处理器可运行,它们的优先级将大大高于来宾虚拟机。这是因为,在受支持的 Hyper-V 配置中,管理操作系统所做的唯一事情(从统计上讲)是代表来宾虚拟机进行 I/O。如果您在管理操作系统中安装了其他任何东西,那么您将代表来宾虚拟机抢占工作。

我假设您已经想到了这一点,但您可以采用受支持的方式执行此操作。创建一个与物理机大小基本相同的虚拟机。为其分配非常低的 CPU 和内存权重,并打开动态内存,以便在空闲时不会占用太多内存。在该虚拟机中运行您的计算任务。然后,Hyper-V 将优先为除该虚拟机之外的任何其他客户机工作,但使用空闲周期来执行您的计算任务。

答案2

首先,我要说清楚一点:不建议在 Hyper-V 的父分区(主机操作系统)上运行任何额外的工作负载。它的唯一目的是为系统上的其他来宾虚拟机提供管理和控制功能,并让管理员可以查看系统上的其他来宾虚拟机。话虽如此,你当然可以这样做,而且它可能对你很有帮助。但微软的官方立场是避免在父分区上运行任何额外的工作负载。现在这个问题已经解决了:

开心趣ASCII架构图:

| Parent | Child | Child | Child |
----------------------------------
            Hypervisor
----------------------------------
         Physical Hardware

父分区是您启动的操作系统,也是您创建和控制所有其他子虚拟机的操作系统,它本身实际上只是与子分区处于同一级别的另一个逻辑分区。所有这些分区都并行运行。唯一的区别是根分区被虚拟机管理程序赋予了特殊的权限和责任。您可以通过 Hyper-V 管理控制台为子虚拟机分配 CPU 权重、预留和限制,但我不清楚这些是否或如何映射到我们所知的虚拟机管理程序中的线程优先级。

在您的根分区(或管理操作系统或主机操作系统)上,您将看到每个虚拟机都有一个 vmms.exe 和 1 个 vmwp.exe 实例。VM 管理服务 (vmms.exe) 负责向虚拟机管理程序提供 WMI 接口,以便您可以从 MMC 管理虚拟机。当您在系统上创建新虚拟机时,它还会创建一个新的 vmwp.exe 实例。VM 工作进程 (vmwp.exe) 执行典型的单片虚拟机管理程序将执行的虚拟化工作,例如管理虚拟机的状态。

在子分区执行大量 I/O 或特权操作的系统上,您可能希望大多数 CPU 使用率在父分区中可见:您可以通过名称 Vmwp.exe(每个子分区一个)来识别它们。工作进程还包括负责远程管理虚拟化堆栈的组件...——Russinovich 等人,《Windows Internals》第 6 版。

但不幸的是,vmwp.exe 并不是虚拟机内部发生的所有事情的全部,如果您正在考虑从管理操作系统操纵这些进程的优先级,那么您可能会进入未知的、可能无法支持的领域。还有一些超级调用和启发式调用等,可能不会对 vmwp.exe 进程收费,但仍可视为虚拟机总体工作负载的一部分。

除了可能存在于根分区而不在子分区中的关键 Hyper-V 组件可能会抢占其他子 VM 代码的执行之外,我假设所有分区在线程调度方面都与虚拟机管理程序相同。

不幸的是,微软并没有发表很多深入的技术文章来回答这些问题。如果没有 Russinovich 和他的朋友,我们甚至不会有Windows 内部结构。其中有一小节关于 Hyper-V 的内容,我在撰写这篇文章时参考过它,但它甚至不如这篇文章深入。

相关内容