Мониторинг CPU хоста Hyper-V

windows server 2012 r2Мониторинг CPU хоста Hyper-V задача достаточно актуальная, особенно сейчас, в эпоху виртуализации всего и вся.

В статье я сделаю небольшой обзор групп счетчиков производительности CPU, которые созданы специально для мониторинга ЦП в виртуальных средах (все группы имеют префикс Hyper-V Hypervisor …).


Если вам интересны счетчики производительности Windows, рекомендую обратиться к основной статье тематики — Счетчики производительности.


Мониторинг CPU хоста Hyper-V

Актуальные (2008-2016) на сегодняшний день серверные операционные системы Windows изобилуют счетчиками производительности — отдельные группы счетчиков есть как для каждой роли, так и для целых продуктов (например Exchange). Различные вариации счетчиков есть и для отдельных компонентов системы — например для мониторинга показателей CPU существуют целых две группы с разными наборами (Счетчики производительности процессора), при анализе которых, к тому же, всплывают и некоторые нюансы (Изменения счетчиков производительности CPU).

Во-первых, стандартные счетчики групп Процессор (Processor) и Сведения о процессоре (Processor Information) вам не помогут в принципе, потому что они отображают потребление ресурсов CPU только процессами корневой (хостовой) системой. То есть те ресурсы ЦП, которые потребляют гостевые операционные системы (проще говоря сами виртуалки), не будут отражены в показателях. Это действительно проблема, поскольку очень часто стоит элементарная задача узнать сколько ресурсов съедают все виртуалки враз.

Косвенно задача решается суммированием загрузки ЦП всех виртуалок в пересчете на то количество виртуальных процессоров, которые им выделены. Дело это, мягко говоря, неблагодарное.

Однако удобное решение есть. Для роли Hyper-V добавляются несколько новых групп счетчиков CPU:

  • Hyper-V Hypervisor Logical Processor — Логический процессор низкоуровневой оболочки Hyper-V
  • Hyper-V Hypervisor Root Virtual Processor — Корневой виртуальный процессор низкоуровневой оболочки Hyper-V
  • Hyper-V Hypervisor Virtual Processor — Виртуальный процессор низкоуровневой оболочки Hyper-V

Несмотря на очень похожие названия, по сути счетчики предназначены для разных целей. Рассмотрим подробнее каждую группу.

Hyper-V Hypervisor Logical Processor

По большому счету виртуальные машины не волнует (если честно, то не всегда) ресурсы каких ядер или даже процессоров для них используются, им больше важна сама возможность их своевременного получения. Чтобы абстрагировать виртуальную среду от реального оборудования, между физическими и виртуальными процессорами создана логическая прослойка. Этой прослойкой и управляет гипервизор, запрашивая ресурсы реального ЦП и предоставляя их виртуальным процессорам. Как раз для мониторинга этой логической прослойки ЦП и создана группа счетчиков Hyper-V Hypervisor Logical Processor. Каждый логический процессор соответствует ядру/потоку реального процессора.

Вот и получается, что для отслеживания реальной загрузки ЦП мы должны обращаться к показателям загрузки логических процессоров, но не к чему-либо другому. Конкретно для этого нам подойдет счетчик Hyper-V Hypervisor Logical Processor(_Total)\% Total Run Time (зеленая линия):

Мониторинг CPU хоста Hyper-V 04

Красная линия на графике — это счетчик Processor Information(_Total)\% Processor Time. Как вы видите, его показания абсолютно бесполезны и не отражают реальной загрузки сервера. Будьте внимательны.

Hyper-V Hypervisor Root Virtual Processor

Переходим к полностью виртуальному представлению, ведь группа счетчиков Hyper-V Hypervisor Root Virtual Processor отвечает за мониторинг показателей производительности ЦП корневого раздела. Корневой раздел — это как раз та хостовая ОС, на которой вы и разворачиваете виртуальные машины.

Но почему бы не отслеживать производительность хоста через известные нам группы счетчиков Processor и Processor Information? В принципе можно, но все-таки правильнее это делать через Hyper-V Hypervisor Root Virtual Processor. Объясняю почему: суть гипервизора в том, что он предоставляет равноправный доступ к ресурсам как хостовому разделу, так и гостевым. То есть ресурсы для виртуальных машин выделяет не хостовый раздел, а именно гипервизор. Это хорошо видно на иллюстрации с официального ресурса 1:

IC194739

Такие вот тонкости.

Hyper-V Hypervisor Virtual Processor

В данной группе счетчиков отображается каждый виртуальный процессор (с принадлежностью к ВМ) каждой виртуальной машины на вашем сервере Hyper-V. Виртуальный процессор в данном случае — это эквивалентная одному процессорному ядру (или потоку — при использовании гипертридинга или его аналогов) вычислительная мощность.

Чтобы лучше было понятно дальнейший ход мыслей, хочу привести пример: имеем сервер с одним ЦП, у которого 8 потоков. На этом сервере крутятся 3 виртуальные машины и у каждой из них по 4 виртуальных процессора. Учитывая тот факт, что 1 виртуальный процессор = 1 ядру/потоку реального ЦП, то виртуалки по суммарной мощности вылезают в 1,5 раза из мощности ЦП хоста. Тем не менее, вы запросто можете назначить каждой виртуалке хоть 8 vCPU, чтобы общее количество виртуальных процессоров составило 24 штуки.

Я на своем домашнем Core i7 могу создать с десяток виртуалок, назначить каждой по несколько vCPU так, чтобы их общее количество явно выходило за пределы 8 потоков реального процессора и вот что получится:

Мониторинг CPU хоста Hyper-V 01

Как вы видите, список виртуальных процессоров достаточно внушительный, но реальная загрузка хостового процессора выглядит смешной, поскольку мои виртуальные машины особо не нагружены:

Мониторинг CPU хоста Hyper-V 02

Отслеживать показатели производительности ЦП виртуальных машин через счетчики хоста в принципе удобно в некоторых случаях, но не всегда.

Вывод

Каким же образом гипервизор распределяет нагрузку между ядрами? Есть несколько ключевых моментов:

1. Дело в том, что для каждой конкретной виртуальной машины он не резервирует процессорную мощность, а высвобождает имеющиеся ресурсы только при необходимости;

2. Виртуальный процессор никоим образом не привязан к реальному физическому ядру. Из этого следует, что каждый виртуальный процессор может «размываться» по нескольким физическим ядрам, взяв от каждого какую-либо величину;

3. Также надо отметить, что на данный момент нет никакого способа узнать какой процент мощности от того или иного реального ядра отнимает каждый виртуальный процессор.

Серьезные проблемы у вас начнутся в том случае, если все виртуалки начнут отжирать максимально выделенную им процессорную мощность. По факту ЦП каждой ВМ будет нагружен на 10-15%, а хост ляжет с 95-98% загрузкой ЦП.


История из личного опыта: подобная ситуация у меня как-то была при тестировании виртуального сервера 1С+СУБД и терминального сервера. Все они располагались на одном и том же хосте виртуализации и им было выделено максимальное количество vCPU. Когда на терминалке запустили с десяток толстых клиентов 1С и сымитировали закрытие месяца, то терминалка показывала примерно 60% загрузки, 1С+СУБД всего лишь 40%, но хост лег наглухо — загрузка ЦП стремилась к 100%.

Вывод прост — не размещайте на одном хосте несколько требовательных к производительности виртуальных серверов, лучше разнесите их по разным хостам и разбавьте чем-то не ресурсоемким (например файловыми серверами или контроллерами домена).


По идее на серверах в продакшене нормой будет средняя загрузка не более 60%, но это уже совсем другая история.

comments powered by HyperComments