Hyper-V и производительность. Часть 2 — счетчики производительности. Где правда?

Меня часто спрашивают, как правильно измерять производительность и нагрузку на виртуальные машины в Hyper-V. Основным источником таких вопросов является... таймер. Давайте рассмотрим первопричину вопросов и попробуем разобраться в ситуации.

Мы уже знаем, что Hyper-V имеет родительскую (основную, root, host в разной терминологии) операционную систему и гостевые (guest) ОС в виртуальных машинах. Родительская ОС работает с большинством устройств напрямую, в ней устанавливаются драйверы; в ней же существуют Virtual Service Providers, которые предоставляют доступ к устройствам для гостевых ОС, через их Virtual Service Clients. В архитектуре процессоров x86, однако, существуют элементы, к которым невозможно предоставлять совместный доступ. Таким образом, они не могут находиться под контролем родительской ОС, и гипервизор эмулирует эти элементы как для родительской, так и для гостевых ОС. Примером такого элемента является таймер, на основе которого, в частности, в компьютере работают часы.

Теперь рассмотрим один из важнейших наборов счетчиков производительности Windows — % Processor Time. Эти счетчики показывают суммарный процент загрузки процессора (есть ли свободные ресурсы для выполнения задач без ожидания в очереди) и процент загрузки процессора конкретным процессом (например, насколько интенсивно Microsoft Word 2009 использует процессор пока я пишу данную заметку для блога).

А теперь рассмотрим эти счетчики одновременно из родительской и гостевой ОС, заметим разницу в показаниях и выясним, кто прав, а кто врёт. Картинка ниже отражает ситуацию, когда в виртуальной машине я запустил программу, генерирующую стопроцентную загрузку процессора. Performance Monitor в гостевой ОС реально показывает загрузку процессора в 100%. Однако, в это же время в родительской ОС я вижу загрузку процессора в 85% в счетчике Hyper-V Hypervisor Guest Run Time для конкретной виртуальной машины.

Итак, кто же прав? Как ни странно — оба. Гостевая ОС использует 100% процессорных ресурсов, предлагаемых ей гипервизором, и все процессорное время, отданное данной гостевой ОС тратится на вычислительную задачу, генерирующую стопроцентную загрузку виртуального процессора.

При этом, счетчик Hyper-V Hypervisor Guest Run Time показывает загруженность физического процессора данной гостевой ОС. Именно в этом и есть отличие. Если вы измеряете нагрузку, которую оказывает ваша виртуальная машина на реальные ресурсы сервера, вам следует пользоваться счетчиками в родительской ОС. Если вас интересует загрузка виртуального процессора неким приложением в гостевой ОС, тогда следует измерять производительность именно в виртуальной машине. Цифры будут разными, так как отражают разные понятия — физический и виртуальный процессор.