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% — что примерно и ожидалось. Надеюсь, что данный пример поможет вам при необходимости рассчитать загрузку ресурсов виртуальными машинами.

Comments (0)

Skip to main content