Я пишу панель управления для Hyper-V (в новинку, пожалуйста, простите). Используя это как ссылку:[ссылка на сайт]
Проблема 1: я могу получить данные об использовании ЦП только с точки зрения ОС хоста, которая может составлять максимум 11–12% на одноядерной гостевой системе. (Я мог бы разделить это на [1/8] для 8-ядерного сервера, и это будет приблизительно). Например, для гостя будет написано «100%». Как я могу получить интерпретацию использования ЦП гостем?
Проблема 2: Как я могу получить доступ к диску, видимый гостевой ОС, из PowerShell сервера? Я мог бы взять размер файла VHD, видимый хостом, но часто это не то же самое, что и в гостевых отчетах.
Проблема 3: есть ли способ узнать IP-адрес гостевой ОС, если сетевой адаптер подключен к мосту?
Я попробую это сделать, и я постараюсь дать здесь некоторую конкретную информацию о Hyper-V. В качестве примера я использую Hyper-V Server 2012.
Проблема 1: я могу получить данные об использовании ЦП только с точки зрения ОС хоста.
Нет, вы можете получить информацию об использовании ЦП, как хотите. Если вы хотите получить общее использование ЦП гостевой ОС таким, каким его видит сам гость (в среднем для всех его виртуальных ЦП), просто выполните
$(Get-WMIObject -Computername $VM Win32_Processor).LoadPercentage
(Обработка учетных данных, если эта виртуальная машина находится в другом домене, представляет собой отдельную проблему, но все же вполне возможна. Если она находится в том же домене, что и машина, с которой вы проводите измерения, указанная выше команда будет «просто работать» с помощью магии Проверка подлинности домена Kerberos.) Это не единственный счетчик, который тоже приведет вас в одно и то же место, но это такой же хороший пример, как любой другой.
Вы, конечно, можете получить процент нагрузки каждого «ядра» или виртуального ЦП отдельно для гостевой ОС, если хотите. Или, если это виртуальная машина Linux, просто выполните top
или что-то. Просто имейте в виду, что виртуальные машины не очень хорошо рассчитывают использование собственного процессора. У них нет точных часов, которые делают физические машины. Еще хуже, если на виртуальной машине не установлены инструменты виртуализации, поскольку инструменты интеграции представляют собой фактические модификации кода ядра (называемые просветлениями в Windows), которые дают гостевой виртуальной машине лучшие возможности и совместимость, поскольку гость теперь знает, что это виртуальная машина.
Также имейте в виду, что операционная система хоста, на которой установлен Hyper-V (также известный как корневой раздел), на самом деле является просто другой гостевой виртуальной машиной, хотя и специальной гостевой с привилегированным доступом к гипервизору.
| Host OS | Guest VM | Guest VM | Guest VM |
--------------------------------------------
HYPERVISOR
--------------------------------------------
Physical Hardware
Существуют специальные счетчики, которые гипервизор выставляет только для ОС хоста, а также для всех других гостевых виртуальных машин, работающих в системе.
Этих счетчиков производительности для Hyper-V очень много, и они позволяют разрезать данные практически любым мыслимым способом.
Возьмем, к примеру, следующие счетчики: \\HYPERVSERVER\Hyper-V Hypervisor Logical Processor\% Guest Run Time
, % Hypervisor Run Time
, % Total Run Time
и т. д. Для каждого из этих счетчиков вы найдете отдельный экземпляр для каждой виртуальной машины в системе, а также _Total
, конечно. В корневом разделе (ОС хоста) вы увидите, что каждая виртуальная машина в системе имеет собственный рабочий процесс виртуальной машины в пользовательском режиме. (1 vmmp.exe на каждую виртуальную машину, плюс 1 vmms.exe для хоста.) Фактически, если вы являетесь гипервизором, вы можете рассматривать каждую виртуальную машину в системе как отдельный поток выполнения с учетом планирования потоков в том же так, как если бы в вашей системе Windows было запущено 10 экземпляров Skifree.exe. Но vmwp.exe - это только часть картины, поэтому не думайте, что вы можете измерить использование ЦП этим процессом в пользовательском режиме в ОС хоста и назвать это хорошим.
Обратите внимание, что есть также \\HYPERVSERVER\Hyper-V Hypervisor Root Virtual Processor\*
, который предоставляет объекты логического процессора, поскольку гипервизор абстрагировал их от связанных с ними физических процессоров и представил их ОС хоста. Больше счетчиков; слишком много для меня, чтобы перейти. Но описание всех счетчиков вы можете прочитать прямо в Perfmon.
Есть несколько счетчиков в пространстве имен root \ Virtualization, а также несколько счетчиков Hyper-V в пространстве имен root \ CIMv2. Вот некоторые, которые я только что откопал:
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
Я думаю, что у вас, вероятно, возникнут дополнительные вопросы, поэтому, если вы их разместите, я отредактирую свой пост, чтобы попытаться ответить на них.
Редактировать:
Чтобы ответить на ваш вопрос о получении IP-адресов виртуальных машин с узла Hyper-V без необходимости доступа к виртуальным машинам:
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:...
Мне кажется, что лучше будет запускать все ваши запросы из гостевой ОС. Поскольку вам нужно точное представление гостя с точки зрения гипервизора, это создает некоторые проблемы:
Для проблемы 1 существует проблема накладных расходов гипервизора - "реальная" загрузка ЦП для виртуальной машины, если смотреть со стороны гипервизора, будет выше, чем то, что сообщается от гостевой ОС. На сколько? Это зависит от множества факторов, таких как тип нагрузки, технологии виртуализации используется, чтобы назвать несколько. Для разных версий Hyper-V требуются разные технологии - для последней требуется SLAT, поэтому сложно судить, как это повлияет на ваши дела.
Использование диска также затруднено, потому что вы не можете легко определить, какая файловая система используется внутри VHD. И даже если вы можете (и это NTFS), то есть вопрос разные типы VHD это сделало бы измерение еще труднее.
Что касается третьей проблемы, я предполагаю, что вы имеете в виду внешний виртуальный коммутатор, который Hyper-V может использовать для совместного использования физического сетевого соединения с гостевыми виртуальными машинами (и самим хостом, если он настроен).
Начиная с Windows 2008 R2, можно получить доступ к этой информации (путем запроса базовой инфраструктуры Hyper-V, работающей в гостевой системе) с хоста с помощью CIM (WMI), Вот хороший пример.
Если вы используете Windows в качестве единственной гостевой ОС, я предлагаю вам взглянуть на те статьи о PowerShell Remoting.
Или вы можете глубже погрузиться в CIM Hyper-V, Вот хорошее введение и Вот это документация.