为了评估在虚拟化平台上的性能监控的准确性, CPU的窃取时间已经成为越来越相关的指标 – 参见EC2监控:被盗的CPU案例在亚马逊EC2和IBM的CPU时间会计更深入的技术解释(包括插图)的概念:
窃取时间是虚拟CPU等待真实CPU的时间百分比,而pipe理程序正在维护另一个虚拟处理器。
因此,它现在暴露在大多数相关的Unix / Linux监控工具中 – 例如,请参阅sar或top %stal或st列:
st – 偷窃时间
其他任务(例如运行其他虚拟机)时,虚拟机pipe理程序从该虚拟机中“盗取”的CPU数量。
我一直无法弄清楚如何在Windows上捕获相同的指标,这是可能的吗? (理想情况下,EC2上的Windows 2008 Server R2 AMI以及当然通过各自的Windows性能计数器 。)
编辑:2013年10月1日更新 – 我的一些原来的答案已经过时了。
我不知道你是否仍然活跃在这个网站上,或者你会看到这个,但是我想让你知道我今天读到这个问题,并且让我着迷,所以我花了一整天一直在研究Hyper-V和Windows内部,甚至深入研究虚拟化本身的概念,希望我可以随时准备回答你的问题。
让我先说我是从Hyper-V的angular度来看虚拟化平台,因为那是我最有经验的地方。 就我们所知,尽pipe可能存在某些虚拟化的原理,但是微软,VMware和Xen对于如何devise虚拟机pipe理程序都有不同的策略。
这是第一件让你的问题具有挑战性的事情。 你提出你的问题,好像它是pipe理程序不可知论的,事实上它不是。 例如,Amazon EC2使用Xen虚拟机pipe理程序,并且在该虚拟机pipe理程序上运行的Linux VM中发出的top命令的输出中看到的“CPU窃取时间”度量标准是安装在该guest虚拟机上的集成服务的结果操作系统(或guest虚拟机上的虚拟化感知工具)以及特定虚拟机pipe理程序提供的数据。
首先让我直接回答你的问题:从运行Windows的虚拟机内部无法看到属于pipe理程序运行的物理机的处理器花了多less时间去做别的事情, 除非特定的虚拟工具/为特定虚拟机pipe理程序提供的服务或虚拟化感知工具安装在虚拟机虚拟机中, 并且虚拟机所在的特定虚拟机pipe理程序将该数据公开给来宾。 即使在Hyper-Vpipe理程序上运行的Windows客户机也不能立即访问有关pipe理程序上的物理处理器在其他事情上花费的时间的信息。 (引用voretaq7,这是“打破了第四道墙”)。尽pipe安装了正确集成服务/工具的Hyper-V中作为虚拟客户端运行的Windows客户端和服务器操作系统使用了“启示”(实际上是内核代码更改尤其是虚拟机),这大大提高了它们在使用物理主机资源方面的性能,但底线是pipe理程序不必向客户机操作系统提供比想要的更多的信息。 这意味着虚拟机pipe理程序不必告诉虚拟机除了为虚拟机提供服务之外还有什么其他的function呢。 而且,从虚拟机angular度推导出一个度量标准,例如“CPU窃取时间:vCPU等待物理CPU的时间百分比”,还需要有关物理处理器的其他信息。
来宾操作系统如何知道,如果它甚至没有意识到它实际上是虚拟化?
换句话说,如果guest虚拟机上没有安装正确的集成工具,guest虚拟机操作系统甚至不会知道它的CPU实际上是一个v CPU。 它甚至不知道自己之外还有另外一个“偷”它的CPU周期的力量,因此这个度量将不存在于访客VM上。
VMware已经开始将这些数据公开给Windows来宾以及ESXi 5.0。 VMware集成工具也需要在客户端进行更新。 这是一个参考 ; 他们称之为“CPU被盗时间”。
Hyper-V等pipe理程序不会直接访问物理处理器或处理器内核等物理资源。 相反,pipe理程序会为他们提供vDevs – 虚拟设备(如vCPU)。
下面是一个很好的例子:假设一个虚拟机客户操作系统调用来刷新作为物理CPU物理组件的TLB(转换后备缓冲区)。 如果客户操作系统被允许清除物理处理器上的整个 TLB,那么对所有其他共享相同物理TLB的其他VM也会产生负面的性能影响。 在Windows的情况下,来宾操作系统中的这个调用被转换成由系统pipe理程序解释的“hypercall”或“enlightened”调用,以便只刷新与该虚拟机相关的TLB部分。
(有趣的是,对我来说,没有合适的集成工具和/或服务的访客虚拟机能够影响同一主机上所有其他虚拟机的性能,但这完全超出了本主题的范围。)
所有这一切都可以说,你仍然可以在Hyper-V主机中检测到虚拟处理器等待真实处理器可用的时间,以便它可以计划运行。 但是,您只能在Windows Hyper-Vpipe理程序上看到这些数据。 如果可以在其他虚拟机pipe理程序中看到这一点,我敦促其他人告诉我们如何在虚拟机pipe理程序中看到这一点,以及是否暴露给客户。 (编辑10/1/2013谢谢evilensky做这个!)
我的testing机器是Hyper-V Server 2012,它是Server 2012的免费版本,仅运行Core和Hyper-Vangular色。 它与任何运行Hyper-V的Windows Server 2012都是一样的。
启动父分区上的Perfmon,即物理主机。 加载这个计数器:
Hyper-V Hypervisor Virtual Processor\CPU Wait Time Per Dispatch\*
您会注意到该虚拟机pipe理程序中的每个虚拟机都会有该计数器的实例,以及_Total。 该Perfmon计数器的Microsoft定义是:
等待虚拟处理器分配到逻辑处理器上的平均时间(以纳秒为单位)。
显然,你希望这个数字尽可能低。 对于电脑来说,等待几乎不是一件好事。
Hyper-V Hypervisor Root Virtual Processor\% Guest Run Time % Hypervisor Run Time % Total Run Time和% Total Run Time 。 这些计数器为您提供可用于确定事实的百分比,例如“实际”处理器花费多less时间来处理虚拟机或所有虚拟机。
因此,总结而言,您在访客虚拟机中查找的指标取决于正在运行的虚拟机pipe理程序,虚拟机pipe理程序是否select提供关于如何花费其时间的数据,而不是为该虚拟机提供服务,以及客户机OS具有正确的虚拟化集成工具/服务/驱动程序,足以意识到pipe理程序正在使这些数据可用。
我知道Windows客户机上无法安装集成工具,以查看虚拟机主机花费的时间(以秒或百分比表示),或者根据物理处理器的总时间花费多less时间。 (编辑10/1/2013:ESXi 5.0或更高版本通过集成工具将此数据公开给来宾虚拟机。尽pipe如此,Hyper-V仍然没有。
FWIW,我只是查看了在Hyper-V下运行的Windows 2008r2服务器的Perfmon计数器,并没有看到任何相关的窃取时间(或根本就没有涉及到虚拟化)。