为了评估虚拟化平台上的性能监控准确性,CPU 窃取时间已成为一个越来越重要的指标 - 请参阅EC2 监控:在Amazon EC2和 IBM 关于CPU时间占概念的更深入的技术解释(包括插图):
窃取时间是虚拟 CPU 在管理程序为另一个虚拟处理器提供服务时等待真实 CPU 的时间百分比。
因此,它在当今大多数相关的 Unix/Linux 监控工具中都有公开——参见例如列%steal或st insar
或top
:
st -- Steal Time
管理程序从该虚拟机“窃取”的 CPU 数量用于其他任务(例如运行另一个虚拟机)。
我一直无法弄清楚如何在 Windows 上捕获相同的指标,这可能吗?(理想情况下,对于EC2 上的Windows 2008 Server R2 AMI ,当然是通过相应的Windows 性能计数器。)
编辑:2013 年 10 月 1 日更新 - 我原来的一些答案已经过时了。
我不确定你是否仍然活跃在这个网站上或者你会看到这个,但我想让你知道我今天读了这个问题并且它让我着迷,所以我花了一整天(当我应该一直在工作)研究 Hyper-V 和 Windows 内部结构,甚至深入研究虚拟化本身的概念,希望我可以准备好回答您的问题。
首先让我说,我是从 Hyper-V 作为虚拟化平台的角度出发的,因为这是我最有经验的地方。尽管可能有某些虚拟化原则,正如我们所知,不能偏离,但 Microsoft 和 VMware 以及 Xen 在如何设计他们的虚拟机管理程序方面都有不同的策略。
这是使您的问题具有挑战性的第一件事。你提出你的问题,就好像它是与管理程序无关的,而实际上它不是。例如,Amazon EC2 使用 Xen 管理程序,您在
top
该管理程序上运行的 Linux VM 中发出的命令输出中看到的“CPU 窃取时间”指标是安装在该来宾操作系统上的集成服务的结果(或来宾上的虚拟化感知工具)与该特定管理程序提供的数据结合使用。首先,让我直接回答你的问题:没有办法从运行 Windows 的虚拟机内部看到属于运行管理程序的物理机的处理器花费了多少时间做其他事情,除非特定的虚拟工具/您的特定管理程序的服务或虚拟化感知工具安装在来宾 VM 中,并且来宾运行的特定虚拟机管理程序将该数据公开给来宾。即使是在 Hyper-V 虚拟机管理程序上运行的 Windows 客户机也无法立即访问有关虚拟机管理程序上的物理处理器执行其他操作所花费时间的信息。(引用 voretaq7,“打破第四面墙”的东西。)即使 Windows 客户端和服务器操作系统在 Hyper-V 中作为虚拟化来宾运行,并安装了正确的集成服务/工具,也会使用“启蒙”(字面意思是内核专门针对 VM 进行的代码更改)显着提高了它们在使用物理主机资源方面的性能,底线是管理程序没有向客户操作系统提供比它想要的更多的信息。这意味着管理程序不必告诉访客 VM 除了为该 VM 提供服务之外它还在做什么……除非它愿意。关于物理处理器正在做什么的信息对于从 VM 的角度得出一个指标是必要的,例如“CPU 窃取时间:vCPU 等待物理 CPU 的时间百分比”。
如果来宾操作系统甚至没有意识到它实际上是虚拟化的,它怎么会知道呢?
换句话说,如果来宾没有安装正确的集成工具,来宾操作系统甚至不知道它的 CPU 实际上是一个v CPU。它甚至不知道在自身之外还有另一种力量从它那里“窃取”CPU 周期,因此该指标不会存在于来宾 VM 上。
VMware 已开始将此数据公开给 Windows 来宾以及 ESXi 5.0。还需要在来宾上更新 VMware 集成工具。这是一个参考;他们将其称为“CPU 被盗时间”。
诸如 Hyper-V 之类的虚拟机管理程序不会让来宾直接访问物理资源,例如物理处理器或处理器内核。相反,管理程序为他们提供 vDevs——虚拟设备——比如 vCPU。
原因的一个主要示例:假设虚拟机来宾操作系统调用刷新 TLB(转换后备缓冲区),它是物理 CPU 的物理组件。如果来宾操作系统被允许清除物理处理器上的整个TLB,这将对所有其他也共享同一物理 TLB 的 VM 产生负面性能影响。在 Windows 的情况下,来宾操作系统中的该调用被翻译成由管理程序解释的“hypercall”或“启发式”调用,以便仅刷新与该虚拟机相关的 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。加载这个计数器:
您会注意到该管理程序上的每个虚拟机都有一个该计数器的实例,以及 _Total。该 Perfmon 计数器的 Microsoft 定义是:
显然,您希望该数字尽可能低。对于计算机来说,等待几乎从来都不是一件好事。
您想要调查的管理程序上的其他性能计数器是
Hyper-V Hypervisor Root Virtual Processor\% Guest Run Time
、% Hypervisor Run Time
和% Total Run Time
。这些计数器为您提供可用于确定事实的百分比,例如“真实”处理器花费多少时间来处理除服务 VM 或所有 VM 之外的其他事情。因此,总而言之,您在来宾虚拟机中寻找的指标取决于它运行的虚拟机管理程序,该虚拟机管理程序是否选择提供有关它在服务该 VM 之外如何花费时间的数据,以及来宾是否操作系统具有正确的虚拟化集成工具/服务/驱动程序,足以意识到管理程序正在使该数据可用。
我不知道在 Windows 客户机上,无论是否安装了集成工具,都无法查看 VM 的主机花费了多少时间(以秒或百分比表示)为它提供服务或不为它提供服务相对于总物理处理器时间。(编辑 2013 年 10 月 1 日:ESXi 5.0 或更高版本通过集成工具将此数据公开给来宾 VM。不过在 Hyper-V 上仍然没有任何内容。)FWIW,我只是查看了在 Hyper-V 下运行的 Windows 2008r2 服务器的 Perfmon 计数器,没有看到任何与窃取时间相关的信息(或与虚拟化相关的任何信息)。