Hyper-V PowerShell 获取磁盘使用情况和 CPU 使用情况(由客户操作系统看到)

Hyper-V PowerShell 获取磁盘使用情况和 CPU 使用情况(由客户操作系统看到)

我正在为 Hyper-V 编写一个控制面板(新手;请原谅)。以此为参考:[关联]

问题 1:我只能获得主机操作系统所看到的 CPU 使用率,在单核客户机上最大可达 11-12%。(对于 8 核服务器,我可以将其除以 [1/8],结果就是近似值)。在客户机上,它会显示“100%”。我如何才能获得客户机对 CPU 使用率的解释?

问题 2:如何从服务器的 PowerShell 获取客户操作系统看到的磁盘使用情况?我可以获取主机看到的 VHD 文件大小,但这通常与客户报告的不一样。

问题 3:如果网络适配器是桥接的,有没有办法找到客户操作系统的 IP 地址?

答案1

我将尝试并尝试在此提供一些 Hyper-V 特定信息。我使用 Hyper-V Server 2012 作为示例。

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

不,您可以以任何方式获取 CPU 使用率。如果您想获取客户机操作系统的总体 CPU 使用率(即客户机本身所见的 CPU 使用率,即其所有 vCPU 的平均值),只需执行

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

(如果该虚拟机恰好位于另一个域中,则处理凭据是另一个问题,但仍然完全有可能。如果它与您从中进行测量的机器位于同一域中,则上述命令将通过 Kerberos 域身份验证的魔力“正常工作”。)这也不是唯一一个可以让您到达同一位置的计数器,但这是一个很好的例子。

当然,如果您愿意,您可以单独获取客户操作系统上每个“核心”或 vCPU 的负载百分比。或者,如果是 Linux VM,只需执行top此操作即可。请注意,VM 并不擅长计算自己的处理器使用情况。首先,它们没有物理机器那样的精确时钟。如果 VM 没有安装虚拟化工具,情况会更糟,因为集成工具是对内核代码的实际修改(在 Windows 中称为启示),可为客户 VM 提供更好的功能和兼容性,因为客户现在知道它是 VM。

还要注意,安装了 Hyper-V 的主机操作系统 (又名根分区) 实际上只是另一个来宾虚拟机本身,尽管它是一个具有虚拟机管理程序特权访问权限的特殊来宾。

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

有一些特殊计数器仅由虚拟机管理程序向主机操作系统公开,涉及主机操作系统以及系统上运行的所有其他客户虚拟机。

这些 Hyper-V 特定性能计数器确实有很多,它们可以让您以几乎所有可以想象到的方式切分数据。

以以下计数器为例:\\HYPERVSERVER\Hyper-V Hypervisor Logical Processor\% Guest Run Time、、等。对于每个计数器,您将找到系统上当前每个 VM 的单独实例,当然还有。您将在根分区(主机操作系统)上看到系统上的每个 VM 都有% Hypervisor Run Time自己的用户模式 ​​VM 工作进程。(每个 VM 1 个 vmmp.exe,加上主机的 1 个 vmms.exe。)实际上,如果您是虚拟机管理程序,则可以将系统上的每个虚拟机视为受线程调度约束的单独执行线程,就像在 Windows 系统上运行 10 个 Skifree.exe 实例一样。但 vmwp.exe 只是其中的一部分,所以不要以为您可以在主机操作系统上测量该用户模式进程的 CPU 使用率并称其为良好。% Total Run Time_Total

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

root\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

这些计数器来自虚拟机管理程序本身,在这种情况下,它与真实硬件非常接近。这些计数器将更加准确。

问题 2:如何从服务器的 PowerShell 获取客户操作系统所看到的磁盘使用情况?

Get-WMIObject -Computername $VM Win32_LogicalDisk

据我所知,这是最好的选择。因为虚拟机管理程序并不关心客户操作系统如何处理其存储。它只关心关联的 .vhd/.vhdx 的大小,正如您所指出的,这通常不是虚拟机认为在其逻辑驱动器上使用的数据量的准确度量。

问题 3:如果网络适配器是桥接的,有没有办法找到客户操作系统的 IP 地址?

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

我认为您可能会有后续问题,因此如果您发布它们,我会编辑我的帖子以尝试回答它们。

编辑:

回答有关从 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:...

答案2

在我看来,从客户操作系统运行所有查询会是一个更好的主意。由于您希望从虚拟机管理程序的角度获得准确的客户视图,因此这会带来一些挑战:

对于问题 1,存在虚拟机管理程序开销的问题 - 从虚拟机管理程序看到的虚拟机的“实际”CPU 利用率将高于客户操作系统报告的利用率。高多少?这取决于很多因素,例如负载类型,虚拟化技术正在使用,仅举几例。不同版本的 Hyper-V 需要不同的技术 - 最新版本需要板条,因此很难判断它会如何影响你的案件。

磁盘使用也很难,因为你无法轻易分辨 VHD 内正在使用什么文件系统。即使你能分辨(并且是 NTFS),那么还有不同的 VHD 类型这会让测量变得更加困难。

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

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

如果你使用 Windows 作为唯一的客户操作系统,我建议你看看有关 PowerShell Remoting 的那些文章

或者你可以进一步了解 Hyper-V 的 CIM,这里是一个很好的介绍,这里是文档。

相关内容