是否有 Windows 相当于 Unix 的“CPU 窃取时间”?

Ste*_*pel 26 windows monitoring metrics amazon-ec2 cpu-usage

为了评估虚拟化平台上的性能监控准确性,CPU 窃取时间已成为一个越来越重要的指标 - 请参阅EC2 监控:CPU 窃取案例,了解Amazon EC2上下文中的指导性摘要和 IBM 关于CPU 时间占一个该概念的更深入的技术解释(包括插图):

窃取时间是虚拟机管理程序为另一个虚拟处理器提供服务时虚拟 CPU 等待实际 CPU 的时间百分比。

因此,它在当今大多数相关的 Unix/Linux 监控工具中都暴露了 - 参见例如列%stealst insartop

st -- 窃取时间
管理程序从该虚拟机“窃取”的 CPU 数量,用于其他任务(例如运行另一个虚拟机)。

我一直无法弄清楚如何在 Windows 上捕获相同的指标,这已经可能了吗?(对于EC2 上的Windows 2008 Server R2 AMI和通过相应的Windows 性能计数器当然是理想的。)

Rya*_*ies 33

编辑:2013 年 10 月 1 日更新 - 我的一些原始答案已经过时了。

我不确定你是否仍然活跃在这个网站上,或者你会看到这个,但我想让你知道我今天读了这个问题,它让我着迷,所以我花了一整天(当我应该一直在工作)研究 Hyper-V 和 Windows 内部,甚至深入研究虚拟化本身的概念,希望我能准备好回答您的问题。

首先让我说我是从 Hyper-V 作为虚拟化平台的角度来看的,因为这是我最有经验的地方。尽管可能存在某些不可违背的虚拟化原则,但微软、VMware 和 Xen 在设计虚拟机管理程序方面都有不同的策略。

这是使您的问题具有挑战性的第一件事。您提出的问题好像与管理程序无关,但实际上并非如此。例如,Amazon EC2 使用 Xen 管理程序,您在top从运行在该管理程序上的 Linux VM 发出的命令的输出中看到的“CPU 窃取时间”指标是安装在该来宾操作系统上的集成服务的结果(或来宾上的虚拟化感知工具)与该特定管理程序提供的数据相结合。

首先让我直接回答你的问题:没有办法从运行 Windows 的虚拟机内部看到属于运行管理程序的物理机的处理器花多少时间做其他事情,除非特定的虚拟工具/特定虚拟机管理程序的服务或虚拟化感知工具安装在来宾 VM 中,并且运行来宾的特定管理程序向来宾公开该数据。即使是在 Hyper-V 管理程序上运行的 Windows 来宾也无法立即访问有关管理程序上的物理处理器在做其他事情上所花费的时间的信息。(引用 voretaq7,“打破第四面墙”的东西。)即使 Windows 客户端和服务器操作系统作为 Hyper-V 中的虚拟化来宾运行并安装了正确的集成服务/工具利用了“启示”(实际上是内核密码的改变尤其是对于虚拟机)是显著增加使用物理主机的资源,他们的表现让,底线是管理程序不具有向客户操作系统提供比它想要的更多的信息。这意味着管理程序不具有告诉客户VM还有什么它除了服务该VM ...除非它想干什么。并且有关物理处理器正在执行的其他操作的信息对于从 VM 的角度推导出指标是必要的,例如“CPU 窃取时间:vCPU 等待物理 CPU 的时间百分比”。

如果来宾操作系统甚至没有意识到它实际上是虚拟化的,它又怎么会知道呢?

换句话说,如果没有在来宾上安装正确的集成工具,来宾操作系统甚至不会知道它的 CPU 实际上是v CPU。它甚至不知道自身之外还有另一种力量“窃取”了它的 CPU 周期,因此来宾 VM 上将不存在该指标。

VMware 已开始向 Windows 客户机以及 ESXi 5.0 公开这些数据。VMware 集成工具也需要在来宾上更新。这是一个参考;他们将其称为“CPU Stolen Time”。

Hyper-V 等虚拟机管理程序不会让来宾直接访问物理资源,例如物理处理器或处理器内核。相反,管理程序为它们提供 vDevs - 虚拟设备 - 例如 vCPU。

原因的一个主要示例:假设虚拟机来宾操作系统调用刷新 TLB(转换后备缓冲区),这是物理 CPU 的物理组件。如果允许来宾操作系统清除物理处理器上的整个TLB,这将对所有其他共享相同物理 TLB 的 VM 产生负面性能影响。在 Windows 的情况下,来宾操作系统中的该调用被转换为“hypercall”或“enlightened”调用,由管理程序解释,以便仅刷新与该虚拟机相关的 TLB 部分。


(有趣的是,这暗示我没有适当的集成工具和/或服务的来宾 VM 可能会影响同一主机上所有其他 VM 的性能,但这完全超出了本主题的范围.)


所有这一切说,你可以在Hyper-V主机仍然检测到一个虚拟处理器花在等待一个真正的处理器可用,以便它可以调度运行的时间。但是您只能在 Windows Hyper-V 管理程序上查看该数据。如果可以在其他管理程序中看到这一点,我敦促其他人告诉我们如何在该管理程序中看到这一点,以及它是否暴露给客人。 (编辑 10/1/2013 感谢 evilensky 这样做!)

我的测试机是Hyper-V Server 2012,它是Server 2012的免费版,只运行Core和Hyper-V角色。它实际上与任何运行 Hyper-V 的 Windows Server 2012 相同。

在您的父分区(也就是物理主机)上启动 Perfmon。加载这个计数器:

Hyper-V Hypervisor Virtual Processor\CPU Wait Time Per Dispatch\*
Run Code Online (Sandbox Code Playgroud)

您会注意到该管理程序上的每个虚拟机都有一个该计数器的实例,以及 _Total。该 Perfmon 计数器的 Microsoft 定义是:

等待将虚拟处理器分派到逻辑处理器上所花费的平均时间(以纳秒为单位)。

显然,您希望该数字尽可能低。对于计算机来说,等待几乎从来都不是一件好事。

在管理程序的其他性能计数器,你将要调查的Hyper-V Hypervisor Root Virtual Processor\% Guest Run Time% Hypervisor Run Time% Total Run Time。这些计数器为您提供了可用于确定事实的百分比,例如“真实”处理器在处理VM 或所有 VM之外的其他事情上花费的时间。

因此,总而言之,您在来宾虚拟机中寻找的指标取决于它运行的管理程序,该管理程序是否选择提供有关其在服务该 VM 之外的时间的数据,以及来宾是否操作系统具有正确的虚拟化集成工具/服务/驱动程序,足以意识到虚拟机管理程序正在使该数据可用。

我不知道在 Windows 客户机上,是否安装了集成工具,以查看虚拟机的主机在总物理处理器时间上花费了多少时间(以秒或百分比计)为它提供服务或不为它提供服务。 (编辑 10/1/2013:ESXi 5.0 或更高版本通过集成工具将此数据公开给来宾 VM。不过,Hyper-V 上仍然没有。)

  • 理论上可以,但不要屏住呼吸。就像我说的那样,它要求特定于供应商的虚拟机管理程序和特定于供应商的来宾操作系统协同努力,使有关物理主机的数据在来宾 VM 中可用和访问。http://wiki.xen.org/wiki/Xen_Kernel_Feature_Matrix (2认同)
  • 切线:VMware 管理程序将窃取团队称为 [就绪时间](http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/cpu_counters.html)——虚拟 CPU 的时间量正在等待由物理资源提供服务。 (2认同)