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