O Hyper-V PowerShell obtém o uso do disco e o uso da CPU (conforme visto pelo sistema operacional convidado)

2

Eu estou escrevendo um painel de controle para o Hyper-V (novo para ele; por favor, perdoe). Usando isso como referência: [link]

Problema 1: só posso obter o uso da CPU como visto pelo sistema operacional host, que pode ter no máximo 11-12% em um convidado de núcleo único. (Eu poderia dividir isso por [1/8] para um servidor de 8 núcleos e seria aproximado). No convidado, diria '100%' por exemplo. Como posso obter a interpretação do convidado sobre o uso da CPU?

Problema 2: Como posso obter o uso do disco como visto pelo guest-OS do PowerShell do servidor? Eu poderia ter o tamanho do arquivo VHD como visto pelo host, mas muitas vezes não é o mesmo que os relatórios convidados.

Problema 3: Existe uma maneira de encontrar o endereço IP do sistema operacional convidado se o adaptador de rede estiver em ponte?

    
por ionFish 24.12.2012 / 23:16

2 respostas

3

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:...
    
por 25.12.2012 / 02:08
1

Parece-me que seria uma boa ideia executar todas as suas consultas no sistema operacional convidado. Como você deseja uma visualização precisa do convidado na perspectiva do hipervisor, isso apresenta alguns desafios:

Para o problema 1, há um problema de sobrecarga do hipervisor - a utilização da CPU "real" para uma VM, conforme vista pelo hipervisor, será maior do que o que está sendo relatado no sistema operacional convidado. Por quanto? Isso depende de vários fatores, como o tipo de carga, tecnologias de virtualização , para citar alguns. Diferentes versões do Hyper-V requerem diferentes tecnologias - o mais recente requer SLAT , por isso é difícil avaliar como afetam seus casos.

O uso de disco também é difícil porque você não pode dizer facilmente qual sistema de arquivos está sendo usado dentro do VHD. E mesmo se você puder (e é NTFS), então há a questão de diferentes tipos de VHD que tornariam ainda mais difícil medir.

Para o terceiro problema, suponho que você esteja se referindo ao comutador virtual externo que o Hyper-V pode usar para compartilhar uma conexão de rede física com as VMs convidadas (e com o próprio host, se configurado).

Desde o Windows 2008 R2, é possível acessar essas informações (consultando a infra-estrutura Hyper-V subjacente que está em execução no convidado) do host usando o CIM (WMI), aqui é um bom exemplo.

Se você estiver usando o Windows como o único sistema operacional convidado, sugiro que dê uma olhada em esses artigos sobre o PowerShell Remoting .

Ou você pode mergulhar ainda mais no CIM do Hyper-V, aqui é uma boa introdução e aqui é a documentação.

    
por 24.12.2012 / 23:44