Eu tentarei e tentarei fornecer algumas informações específicas do Hyper-V aqui. Estou usando o Hyper-V Server 2012 como um exemplo.
Problem 1: I can only get the CPU usage as seen by the host-OS
Não, você pode obter o uso da CPU da maneira que quiser. Se você deseja obter o uso geral da CPU do sistema operacional convidado como o próprio convidado o vê (uma média de todas as suas vCPUs,) faça
$(Get-WMIObject -Computername $VM Win32_Processor).LoadPercentage
(O manuseio de credenciais, se essa VM estiver em outro domínio, é um problema separado, mas ainda assim totalmente possível. Se estiver no mesmo domínio que a máquina da qual você está fazendo a medição, o comando acima "funcionará" via a magia da autenticação de domínio Kerberos.) Esse não é o único contador que o levará ao mesmo lugar, mas é um exemplo tão bom quanto qualquer outro.
Você pode obter a porcentagem de carga de cada "núcleo" ou vCPU individualmente no sistema operacional convidado, se desejar. Ou se for uma VM do Linux, faça top
ou algo assim. Esteja ciente de que as VMs não são muito boas no cálculo do uso de seu próprio processador. Eles não têm os relógios de precisão que as máquinas físicas fazem por uma coisa. Pior ainda se a VM não tiver as ferramentas de virtualização instaladas, já que as ferramentas de integração são modificações reais no código do kernel (chamadas de iluminações no Windows) que dão à VM convidada melhores recursos e compatibilidade, pois agora é uma VM.
Lembre-se também de que o sistema operacional do host que possui o Hyper-V instalado (também conhecido como partição raiz) é na verdade apenas outra VM guest, embora seja um convidado especial com acesso privilegiado ao Hypervisor.
| Host OS | Guest VM | Guest VM | Guest VM |
--------------------------------------------
HYPERVISOR
--------------------------------------------
Physical Hardware
Existem contadores especiais que são expostos apenas ao sistema operacional host pelo hipervisor, sobre ele e todas as outras VMs convidadas em execução no sistema.
Há uma grande quantidade desses contadores de desempenho específicos do Hyper-V e eles permitem dividir os dados de praticamente todos os modos imagináveis.
Pegue os seguintes contadores, por exemplo: \HYPERVSERVER\Hyper-V Hypervisor Logical Processor\% Guest Run Time
, % Hypervisor Run Time
, % Total Run Time
, etc. Para cada um desses contadores, você encontrará uma instância separada para cada VM atualmente no sistema, bem como _Total
, claro. Você verá na partição raiz (sistema operacional do host) que cada VM no sistema tem seu próprio processo de trabalho da VM no modo de usuário. (1 vmmp.exe por VM, mais 1 vmms.exe para o host.) Na verdade, se você for um hypervisor, poderá pensar em cada máquina virtual no sistema como um encadeamento de execução separado, sujeito a programação de encadeamentos no mesmo como se você tivesse 10 instâncias do Skifree.exe em execução no sistema Windows. Mas vmwp.exe é apenas parte da imagem, então não pense que você pode medir o uso da CPU desse processo em modo de usuário no sistema operacional host e chamá-lo de bom.
Observe que há também um \HYPERVSERVER\Hyper-V Hypervisor Root Virtual Processor\*
, que fornece os objetos do Processador Lógico, pois o hipervisor os abstraiu de seus processadores físicos associados e os apresentou ao SO do Host. Existem mais contadores; muitos para eu passar por cima. Mas você pode ler as descrições de todos os contadores em Perfmon.
Existem alguns contadores no namespace root \ Virtualization e há também alguns contadores do Hyper-V no namespace root \ CIMv2. Aqui estão alguns que eu acabei de desenterrar:
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
Esses contadores são do próprio hipervisor, que é o mais próximo que você pode chegar do hardware real nesse caso. Esses contadores serão muito mais precisos.
Problem 2: How can I get the disk-use as seen by the guest-OS from the server's PowerShell?
Get-WMIObject -Computername $VM Win32_LogicalDisk
Tanto quanto eu sei, essa é a sua melhor aposta. Porque o hypervisor não se importa com o que o sistema operacional convidado faz com seu armazenamento. Ele só se preocupa com o tamanho dos .vhd's / .vhdx associados, que, como você apontou, não costumam ser uma medida precisa de quantos dados a VM acredita ter usado em suas unidades lógicas.
Problem 3: Is there a way to find the IP-address of the guest-OS if the network adapter is bridged?
PS C:\> $(Get-WmiObject -ComputerName $VM win32_networkadapterConfiguration).IPAddress
192.168.1.5
fe80::858c:f47e:9bac:29eb
fd58:2c98:ee9c:279b::5
Acho que você tem perguntas de acompanhamento, por isso, se você postá-las, editarei minha postagem para tentar respondê-las.
Editar:
Para responder à sua pergunta sobre como obter os endereços IP das máquinas virtuais do host do Hyper-V, sem precisar acessar as VMs:
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:...