Hyper-V PowerShell获取磁盘使用情况和CPU使用情况(如客户操作系统所见)

我正在为Hyper-V编写一个控制面板(新的,请原谅)。 以此作为参考: [link]

问题1:我只能得到主机操作系统看到的CPU使用率,在单核客户机上可能最大为11-12%。 (我可以把这个分成1/8的8核心服务器,这是近似的)。 就客人而言,比如说“100%”。 我怎样才能得到客人的CPU使用率的解释?

问题2:如何从服务器的PowerShell中获取guest-OS所看到的磁盘? 我可以看到主机看到的VHD文件的大小,但这通常与访客报告不一样。

问题3:如果网卡是桥接的,是否有办法findguest-OS的IP地址?

我会尝试一下,我会尝试在这里提供一些Hyper-V的具体信息。 我以Hyper-V Server 2012为例。

问题1:我只能得到主机操作系统看到的CPU使用率

不,你可以得到CPU使用率,但是你想得到它。 如果您希望获取guest虚拟机操作系统的整体CPU使用情况(guest虚拟机自身可以看到它(所有vCPU的平均值)),请执行以下操作

$(Get-WMIObject -Computername $VM Win32_Processor).LoadPercentage 

(处理凭据,如果该虚拟机恰好在另一个域是一个单独的问题,但仍然是完全可能的。如果它是在机器相同的领域,你正在测量,上述命令将“工作”通过魔术Kerberos域身份validation。)这不是唯一的计数器,可以让你到同一个地方,但是这是一个很好的例子。

如果您愿意,您当然可以在来宾操作系统上单独获取每个“核心”或vCPU的负载百分比。 或者如果它是一个Linux虚拟机,只要做一些事情。 请注意,虚拟机在计算自己的处理器使用率方面不是很好。 他们没有物理机器做一件事的精确时钟。 更糟糕的是,如果虚拟机没有安装虚拟化工具,因为集成工具是对内核代码(称为Windows中的启示)的实际修改,因为guest虚拟机现在意识到它是虚拟机,所以可以为guest虚拟机提供更好的function和兼容性。

另外请注意,安装有Hyper-V的主机操作系统(也称为根分区)实际上只是另一个访客虚拟机本身,尽pipe它是特权访问虚拟机pipe理程序的特殊访客。

 | Host OS | Guest VM | Guest VM | Guest VM | -------------------------------------------- HYPERVISOR -------------------------------------------- Physical Hardware 

有一些特殊的计数器只能通过虚拟机pipe理程序暴露给主机操作系统,关于虚拟机以及系统上运行的所有其他虚拟机。

这些Hyper-V特定的性能计数器有很多,他们可以让你以几乎所有可能的方式分割数据。

以下列计数器为例: \\HYPERVSERVER\Hyper-V Hypervisor Logical Processor\% Guest Run Time% Hypervisor Run Time% Total Run Time等。对于每个计数器,您将为每个VMfind一个单独的实例目前在系统上,当然还有_Total 。 您将在根分区(主机操作系统)上看到系统上的每个虚拟机都有自己的用户模式VM工作进程。 (每个虚拟机1个vmmp.exe,主机1个vmms.exe)。事实上,如果你是一个虚拟机pipe理程序,你可以把系统上的每个虚拟机想象成一个单独的执行线程,就像在Windows系统上运行了10个Skifree.exe实例一样。 但是vmwp.exe只是图片的一部分,所以不要以为可以在主机操作系统上测量该用户模式进程的CPU使用率,并称其为好。

请注意,还有一个\\HYPERVSERVER\Hyper-V Hypervisor Root Virtual Processor\* ,它提供了逻辑处理器对象,因为pipe理程序已经从关联的物理处理器中抽象出它们,并将它们呈现给主机操作系统。 有更多的柜台; 对我来说太多了。 但是你可以在Perfmon中读取所有计数器的描述。

根\ Virtualization命名空间中有一些计数器,并且在root \ CIMv2命名空间中也有一些Hyper-V计数器。 这里有一些我刚刚挖出来的:

 PS C:\> Get-WmiObject -List | Where Name -Match Hyper | Select Name Name ---- Win32_PerfFormattedData_BalancerStats_HyperVDynamicMemoryBalancer Win32_PerfRawData_BalancerStats_HyperVDynamicMemoryBalancer Win32_PerfFormattedData_BalancerStats_HyperVDynamicMemoryVM Win32_PerfRawData_BalancerStats_HyperVDynamicMemoryVM Win32_PerfFormattedData_Counters_HyperVDynamicMemoryIntegrationService Win32_PerfRawData_Counters_HyperVDynamicMemoryIntegrationService Win32_PerfFormattedData_EthernetPerfProvider_HyperVLegacyNetworkAdapter Win32_PerfRawData_EthernetPerfProvider_HyperVLegacyNetworkAdapter Win32_PerfFormattedData_GmoPerfProvider_HyperVVMSaveSnapshotandRestore Win32_PerfRawData_GmoPerfProvider_HyperVVMSaveSnapshotandRestore Win32_PerfFormattedData_HvStats_HyperVHypervisor Win32_PerfRawData_HvStats_HyperVHypervisor Win32_PerfFormattedData_HvStats_HyperVHypervisorLogicalProcessor Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor Win32_PerfFormattedData_HvStats_HyperVHypervisorPartition Win32_PerfRawData_HvStats_HyperVHypervisorPartition Win32_PerfFormattedData_HvStats_HyperVHypervisorRootPartition Win32_PerfRawData_HvStats_HyperVHypervisorRootPartition Win32_PerfFormattedData_HvStats_HyperVHypervisorRootVirtualProcessor Win32_PerfRawData_HvStats_HyperVHypervisorRootVirtualProcessor Win32_PerfFormattedData_HvStats_HyperVHypervisorVirtualProcessor Win32_PerfRawData_HvStats_HyperVHypervisorVirtualProcessor Win32_PerfFormattedData_HyperVReplicaStats_HyperVReplicaVM Win32_PerfRawData_HyperVReplicaStats_HyperVReplicaVM Win32_PerfFormattedData_IdePerfProvider_HyperVVirtualIDEControllerEmulated Win32_PerfRawData_IdePerfProvider_HyperVVirtualIDEControllerEmulated Win32_PerfFormattedData_NvspNicStats_HyperVVirtualNetworkAdapter Win32_PerfRawData_NvspNicStats_HyperVVirtualNetworkAdapter Win32_PerfFormattedData_NvspPortStats_HyperVVirtualSwitchPort Win32_PerfRawData_NvspPortStats_HyperVVirtualSwitchPort Win32_PerfFormattedData_NvspSwitchProcStats_HyperVVirtualSwitchProcessor Win32_PerfRawData_NvspSwitchProcStats_HyperVVirtualSwitchProcessor Win32_PerfFormattedData_NvspSwitchStats_HyperVVirtualSwitch Win32_PerfRawData_NvspSwitchStats_HyperVVirtualSwitch Win32_PerfFormattedData_RemotePerfProvider_HyperVVMRemoting Win32_PerfRawData_RemotePerfProvider_HyperVVMRemoting Win32_PerfFormattedData_StorageStats_HyperVVirtualStorageDevice Win32_PerfRawData_StorageStats_HyperVVirtualStorageDevice Win32_PerfFormattedData_VidPerfProvider_HyperVVMVidNumaNode Win32_PerfRawData_VidPerfProvider_HyperVVMVidNumaNode Win32_PerfFormattedData_VidPerfProvider_HyperVVMVidPartition Win32_PerfRawData_VidPerfProvider_HyperVVMVidPartition Win32_PerfFormattedData_VmbusStats_HyperVVirtualMachineBus Win32_PerfRawData_VmbusStats_HyperVVirtualMachineBus Win32_PerfFormattedData_VmmsVirtualMachineStats_HyperVVirtualMachineHealthSummary Win32_PerfRawData_VmmsVirtualMachineStats_HyperVVirtualMachineHealthSummary 

这些计数器来自虚拟机pipe理程序本身,在这种情况下,您可以接近真正的硬件。 这些计数器将会更准确。

问题2:如何从服务器的PowerShell中获取guest-OS所看到的磁盘?

 Get-WMIObject -Computername $VM Win32_LogicalDisk 

据我所知,这是你最好的select。 因为pipe理程序不关心客户操作系统对其存储的操作。 它只关心关联的.vhd's / .vhdx的大小,正如您所指出的那样,通常不是准确衡量虚拟机认为它在逻辑驱动器上使用了多less数据。

问题3:如果网卡是桥接的,是否有办法findguest-OS的IP地址?

 PS C:\> $(Get-WmiObject -ComputerName $VM win32_networkadapterConfiguration).IPAddress 192.168.1.5 fe80::858c:f47e:9bac:29eb fd58:2c98:ee9c:279b::5 

我想你可能会有后续问题,所以如果你发布他们,我会编辑我的post,试图回答他们。

编辑:

要回答有关从Hyper-V主机获取虚拟机IP地址的问题,无需访问虚拟机:

 PS C:\> Get-VMNetworkAdapter * Name IsManagementOs VMName SwitchName MacAddress Status IPAddresses ---- -------------- ------ ---------- ---------- ------ ----------- Network Adapter False WEB01 Hyper-V Virtual Switch 00155D015F00 {Ok} {192.168.1.5, fe80::858c:f47e:9bac:... Network Adapter False ECA01 Hyper-V Virtual Switch 00155D015F05 {Ok} {192.168.1.6, fe80::6890:cc44:2e50:... 

在我看来,从客户操作系统运行所有查询将是一个更好的主意。 既然你想从pipe理程序的angular度来看一个准确的访客视图,这就带来了一些挑战:

对于问题1,存在pipe理程序开销的问题 – 从pipe理程序中看到的虚拟机的“真实”CPU利用率将高于来自客户机操作系统的报告。 多less钱? 这取决于许多因素,如负载types,正在使用的虚拟化技术等等。 不同版本的Hyper-V需要不同的技术 – 最新需要SLAT ,因此很难判断它会如何影响您的案例。

磁盘使用也很困难,因为您不能轻易地知道在VHD内部使用了哪个文件系统。 即使你可以(而且是NTFS),那么也有不同的VHDtypes的问题 ,这将使得更难以衡量。

对于第三个问题,我假设您指的是Hyper-V可用于与来宾虚拟机(以及主机本身,如果已configuration)共享物理networking连接的外部虚拟交换机。

从Windows 2008 R2开始,可以使用CIM(WMI)从主机访问这些信息(通过查询客户端运行的底层Hyper-V基础架构), 这里就是一个很好的例子。

如果您使用Windows作为唯一的客户操作系统,我build议您查看有关PowerShell远程处理的文章 。

或者您可以进一步深入到Hyper-V的CIM中, 这里有一个很好的介绍, 这里是文档。