Sdílet prostřednictvím


Hyper-V и производительность. Часть 6 — расчет загрузки процессора виртуальными машинами при помощи WMI

Часто задаваемый в последнее время вопрос — как получить формулу загрузки ресурсов процессора виртуальными машинами Hyper-V при помощи WMI или PowerShell. Я приведу некоторые выкладки с примерами расчета и опишу способ вычисления через WinRM (WMI). Гуру в PowerShell — welcome вашу версию в комментариях.

Мой пример для вычисляет загрузку процессора гостевыми ОС, то есть использует экземпляр счетчика PercentGuestRunTime. Вы можете с легкостью вычислить другие показатели нагрузки — «% Total Run Time», «% Hypervisor Time» и «% Idle time». Данные экземпляры счетчика в WMI объекте Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor называются не «PercentGuestRunTime», а соответственно «PercentTotalRunTime», «PercentHypervisorRunTime» и «PercentIdleTime».

Для наглядности нарисую общую формулу:

где

GN — Percent Guest Run Time (именно это значение следует заменять на другие экземпляры, если интересно вычислить другие показатели нагрузки на процессор);
PN — Timestamp_PerfTime;
FN — Frequency_PerfTime;
LP — количество логических процессоров (из набора счетчиков «Hyper-V Hypervisor»).

Сначала снимаются показания счетчиков G1 и P1, затем G2 и P2. Для получения реальных значений загрузки процессора потребуется снимать показание дважды через незначительный интервал времени.

Для проверки работы формулы дважды снимем показания счетчиков «Hyper-V Hypervisor Logical Process» функцией Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor с интервалом примерно в десять секунд. В моем примере сам сервер имеет два логических процессора, виртуальная машина настроена на использование одного виртуального процессора, и в ней запущена расчетная задача, потребляющая 100% доступных процессорных ресурсов. Очевидно, что в данном случае формула должна показать значение близкое к 50% (т.к. занят лишь один процессор).

Запускаю команду winrm enum wmi/root/cimv2/* -filter:"select * from Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor where name='_Total'". Вот полученный результат:

Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor
C1TransitionsPersec = 409197889
C2TransitionsPersec = 0
C3TransitionsPersec = 0
Caption = null
ContextSwitchesPersec = 889911109
Description = null
Frequency_Object = 0
Frequency_PerfTime = 14318180
Frequency_Sys100NS = 10000000
HardwareInterruptsPersec = 92282462
InterProcessorInterruptsPersec = 8174254
InterProcessorInterruptsSentPersec = 8174254
MonitorTransitionCost = 16
Name = _Total
PercentC1Time = 4193635539355
PercentC2Time = 0
PercentC3Time = 0
PercentGuestRunTime = 314976793671
PercentHypervisorRunTime = 53745475789
PercentIdleTime = 8385447570540
PercentTotalRunTime = 368722269460
SchedulerInterruptsPersec = 384836664
TimerInterruptsPersec = 33425466
Timestamp_Object = 0
Timestamp_PerfTime = 6268633722843
Timestamp_Sys100NS = 4199325031975
TotalInterruptsPersec = 518718846

Примерно через 10 секунд запускаю повторно: winrm enum wmi/root/cimv2/* -filter:"select * from Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor where name='_Total'". Получаю:

Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor
C1TransitionsPersec = 409201218
C2TransitionsPersec = 0
C3TransitionsPersec = 0
Caption = null
ContextSwitchesPersec = 889922035
Description = null
Frequency_Object = 0
Frequency_PerfTime = 14318180
Frequency_Sys100NS = 10000000
HardwareInterruptsPersec = 92283571
InterProcessorInterruptsPersec = 8174425
InterProcessorInterruptsSentPersec = 8174425
MonitorTransitionCost = 16
Name = _Total
PercentC1Time = 4193667417779
PercentC2Time = 0
PercentC3Time = 0
PercentGuestRunTime = 315044817737
PercentHypervisorRunTime = 53746578312
PercentIdleTime = 8385511363951
PercentTotalRunTime = 368791396049
SchedulerInterruptsPersec = 384840537
TimerInterruptsPersec = 33426627
Timestamp_Object = 0
Timestamp_PerfTime = 6268728855292
Timestamp_Sys100NS = 4199364353043
TotalInterruptsPersec = 518725160

Подставляя значения в приведенную выше формулу, получаю 51% — что примерно и ожидалось. Надеюсь, что данный пример поможет вам при необходимости рассчитать загрузку ресурсов виртуальными машинами.