Поделиться через


Элементы управления ресурсами виртуальной машины

В этой статье описаны ресурсы Hyper-V и элементы управления изоляцией для виртуальных машин. Эти возможности, которые мы будем называть группами ЦП виртуальной машины или просто группами ЦП, были представлены в Windows Server 2016. Группы ЦП позволяют администраторам Hyper-V лучше управлять и выделять ресурсы ЦП узла на гостевых виртуальных машинах. С помощью групп ЦП администраторы Hyper-V могут:

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

  • Задайте ограничения ресурсов ЦП определенным группам. Это ограничение группы задает верхнюю границу для ресурсов ЦП узла, которые может использовать вся группа, эффективно применяя требуемый класс службы для этой группы.

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

Управление группами ЦП

Группы ЦП управляются службой вычислений узлов Hyper-V или HCS. Большое описание HCS, его происхождения, ссылок на API HCS и многое другое доступно в блоге группы виртуализации Майкрософт в публикации введение в службу вычислений узла (HCS).

Примечание.

Для создания групп ЦП и управления ими можно использовать только HCS; Интерфейсы управления Диспетчером Hyper-V, WMI и PowerShell не поддерживают группы ЦП.

Корпорация Майкрософт предоставляет программу командной строки cpugroups.exe в Центре загрузки Майкрософт, использующей интерфейс HCS для управления группами ЦП. Эта программа также может отображать топологию ЦП узла.

Как работают группы ЦП

Выделение вычислительных ресурсов узла между группами ЦП применяется гипервизором Hyper-V, используя вычисленную крышку группы ЦП. Ограничение группы ЦП — это доля общей емкости ЦП для группы ЦП. Значение ограничения группы зависит от класса группы или назначаемого уровня приоритета. Вычисленная группа может рассматриваться как "количество ресурсов ЦП на время ЦП". Этот бюджет группы является общим, поэтому если только одна виртуальная машина была активной, она может использовать выделение ЦП всей группы для себя.

Ограничение группы ЦП вычисляется как G = n x C, где:

  • G — это объем LP узла, который мы хотели бы назначить группе
  • n — общее количество логических процессоров (LPs) в группе
  • C — это максимальное выделение ЦП, то есть класс службы, требуемый для группы, выраженный в процентах от общей вычислительной емкости системы.

Например, рассмотрим группу ЦП, настроенную с 4 логическими процессорами (LPs), и ограничением 50 %.

  • G = n * C
  • G = 4 * 50%
  • G = 2 LP стоит времени ЦП для всей группы

В этом примере группа ЦП G выделяет 2 LP времени ЦП.

Обратите внимание, что ограничение группы применяется независимо от количества виртуальных машин или виртуальных процессоров, привязанных к группе, и независимо от состояния (например, завершения работы или запуска) виртуальных машин, назначенных группе ЦП. Таким образом, каждая виртуальная машина, привязанная к одной группе ЦП, получит долю общего выделения ЦП группы, и это изменится с количеством виртуальных машин, привязанных к группе ЦП. Таким образом, так как виртуальные машины привязаны или не связаны из группы ЦП, общая крышка группы ЦП должна быть перезаписывается и настроена для поддержания требуемого требуемого ограничения для каждой виртуальной машины. Администратор узла виртуальной машины или уровень программного обеспечения управления виртуализацией отвечает за управление ограничениями групп при необходимости для достижения требуемого распределения ресурсов ЦП виртуальной машины.

Пример классов службы

Рассмотрим некоторые простые примеры. Для начала предположим, что администратор узла Hyper-V хотел бы поддерживать два уровня службы для гостевых виртуальных машин:

  1. Низкий уровень "C". Мы предоставим этому уровню 10 % вычислительных ресурсов всего узла.

  2. Средний уровень "B". Этот уровень выделяется 50% вычислительных ресурсов всего узла.

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

Для простоты давайте предположим, что каждая виртуальная машина имеет 1 VP, и что у нашего узла 8 LPs. Начнем с пустого узла.

Чтобы создать уровень "B", администратор узла устанавливает ограничение группы на 50%:

  • G = n * C
  • G = 8 * 50%
  • G = 4 LP стоимость ЦП для всей группы

Администратор узла добавляет одну виртуальную машину уровня B. На этом этапе наша виртуальная машина уровня "B" может использовать не более 50% от ЦП узла или эквивалент 4 LPS в нашей примере системы.

Теперь администратор добавляет вторую виртуальную машину уровня B. Распределение группы ЦП распределяется равномерно между всеми виртуальными машинами. У нас есть в общей сложности 2 виртуальных машины в группе B, поэтому каждая виртуальная машина теперь получает половину группы B в общей сложности 50%, 25% каждый или эквивалент 2 LPs стоимостью вычислительного времени.

Настройка ограничений ЦП на отдельных виртуальных машинах

Помимо ограничения группы, каждая виртуальная машина также может иметь отдельную "крышку виртуальной машины". Элементы управления ресурсами ЦП на виртуальных машинах, включая ограничение ЦП, вес и резерв, были частью Hyper-V с момента его внедрения. При сочетании с ограничением группы ограничение виртуальной машины указывает максимальный объем ЦП, который может получить каждый VP, даже если группа имеет доступные ресурсы ЦП.

Например, администратор узла может поместить ограничение виртуальной машины на виртуальных машинах "C" на 10 % . Таким образом, даже если большинство виртуальных машин "C" неактивны, каждый VP никогда не может получить более 10 %. Без ограничения виртуальной машины виртуальные машины "C" могут оппортунистически достичь производительности за пределами уровней, разрешенных их уровнем.

Изоляция групп виртуальных машин для конкретных процессоров узлов

Администраторы узлов Hyper-V также могут потребовать возможности выделить вычислительные ресурсы виртуальной машине. Например, представьте, что администратор хотел предложить виртуальную машину класса "A", которая имеет ограничение класса 100 %. Для этих виртуальных машин уровня "Премиум" также требуется наименьшая задержка планирования и возможное jitter; То есть они могут быть не запланированы любой другой виртуальной машиной. Чтобы добиться этого разделения, можно также настроить группу ЦП с конкретным сопоставлением с LP.

Например, чтобы соответствовать виртуальной машине "A" на узле в нашем примере, администратор создаст новую группу ЦП и присвоит группе сходство процессора с подмножеством LPS узла. Группы B и C будут сопоставлены с остальными LP. Администратор может создать одну виртуальную машину в группе A, которая затем будет иметь эксклюзивный доступ ко всем LPs в группе A, в то время как предположительно более низкие группы B и C будут совместно использовать остальные LPS.

Разделение корневых виртуальных ip-адресов от гостевых виртуальных машин

По умолчанию Hyper-V создаст корневой VP для каждой базовой физической LP. Эти корневые виртуальные машины строго сопоставляются с 1:1 с системными LPs и не переносятся. То есть каждый корневой VP всегда будет выполняться на одном физическом LP. Гостевые виртуальные машины могут работать на любой доступной виртуальной машине и предоставлять общий доступ к выполнению с корневыми виртуальными машинами.

Однако может потребоваться полностью разделить действие корневого VP от гостевых виртуальных машин. Рассмотрим наш пример выше, где мы реализуем виртуальную машину уровня "A" уровня "Премиум". Чтобы виртуальные машины "A" имели наименьшую возможную задержку и "jitter" или вариант планирования, мы хотели бы запустить их на выделенном наборе LPs и убедиться, что корневой каталог не выполняется на этих LPs.

Это можно сделать с помощью сочетания конфигурации minroot, которая ограничивает секцию ОС узла выполняться в подмножестве общих системных логических процессоров вместе с одной или несколькими соответствующими группами ЦП.

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

Дополнительные сведения о конфигурации minroot см. в разделе "Управление ресурсами ЦП узла Hyper-V".

Использование средства CpuGroups

Рассмотрим некоторые примеры использования средства CpuGroups.

Примечание.

Параметры командной строки для средства CpuGroups передаются только пробелами в качестве разделителей. Символы "/" или "-" не должны продолжать нужный переключатель командной строки.

Обнаружение топологии ЦП

Выполнение ЦП с помощью GetCpuTopology возвращает сведения о текущей системе, как показано ниже, включая индекс LP, узел NUMA, к которому принадлежит LP, идентификаторы пакетов и основных компонентов и корневой индекс VP.

В следующем примере показана система с 2 сокетами ЦП и узлами NUMA, в общей сложности 32 LPS и несколькими потоками, и настроена для включения Minroot с 8 корневых виртуальных машин, 4 из каждого узла NUMA. LPs с корневыми виртуальными машинами имеют rootVpIndex >= 0; LPs с rootVpIndex -1 недоступны для корневой секции, но по-прежнему управляются гипервизором и будут запускать гостевые виртуальные машины, как разрешено другими параметрами конфигурации.

C:\vm\tools>CpuGroups.exe GetCpuTopology

LpIndex NodeNumber PackageId CoreId RootVpIndex
------- ---------- --------- ------ -----------
      0          0         0      0           0
      1          0         0      0           1
      2          0         0      1           2
      3          0         0      1           3
      4          0         0      2          -1
      5          0         0      2          -1
      6          0         0      3          -1
      7          0         0      3          -1
      8          0         0      4          -1
      9          0         0      4          -1
     10          0         0      5          -1
     11          0         0      5          -1
     12          0         0      6          -1
     13          0         0      6          -1
     14          0         0      7          -1
     15          0         0      7          -1
     16          1         1     16           4
     17          1         1     16           5
     18          1         1     17           6
     19          1         1     17           7
     20          1         1     18          -1
     21          1         1     18          -1
     22          1         1     19          -1
     23          1         1     19          -1
     24          1         1     20          -1
     25          1         1     20          -1
     26          1         1     21          -1
     27          1         1     21          -1
     28          1         1     22          -1
     29          1         1     22          -1
     30          1         1     23          -1
     31          1         1     23          -1

Пример 2. Печать всех групп ЦП на узле

Здесь мы перечислим все группы ЦП на текущем узле, их GroupId, крышку ЦП группы и наборы LPs, назначенные этой группе.

Обратите внимание, что допустимые значения ограничения ЦП находятся в диапазоне [0, 65536], и эти значения выражают ограничение группы в процентах (например, 32768 = 50%).

C:\vm\tools>CpuGroups.exe GetGroups

CpuGroupId                          CpuCap  LpIndexes
------------------------------------ ------ --------
36AB08CB-3A76-4B38-992E-000000000002 32768  4,5,6,7,8,9,10,11,20,21,22,23
36AB08CB-3A76-4B38-992E-000000000003 65536  12,13,14,15
36AB08CB-3A76-4B38-992E-000000000004 65536  24,25,26,27,28,29,30,31

Пример 3. Печать одной группы ЦП

В этом примере мы запросим одну группу ЦП с помощью GroupId в качестве фильтра.

C:\vm\tools>CpuGroups.exe GetGroups /GroupId:36AB08CB-3A76-4B38-992E-000000000003
CpuGroupId                          CpuCap   LpIndexes
------------------------------------ ------ ----------
36AB08CB-3A76-4B38-992E-000000000003 65536  12,13,14,15

Пример 4. Создание новой группы ЦП

Здесь мы создадим новую группу ЦП, указав идентификатор группы и набор LPs для назначения группе.

C:\vm\tools>CpuGroups.exe CreateGroup /GroupId:36AB08CB-3A76-4B38-992E-000000000001 /GroupAffinity:0,1,16,17

Теперь отобразится новая добавленная группа.

C:\vm\tools>CpuGroups.exe GetGroups
CpuGroupId                          CpuCap LpIndexes
------------------------------------ ------ ---------
36AB08CB-3A76-4B38-992E-000000000001 65536 0,1,16,17
36AB08CB-3A76-4B38-992E-000000000002 32768 4,5,6,7,8,9,10,11,20,21,22,23
36AB08CB-3A76-4B38-992E-000000000003 65536 12,13,14,15
36AB08CB-3A76-4B38-992E-000000000004 65536 24,25,26,27,28,29,30,31

Пример 5. Установка ограничения группы ЦП на 50 %

Здесь мы установим ограничение группы ЦП на 50 %.

C:\vm\tools>CpuGroups.exe SetGroupProperty /GroupId:36AB08CB-3A76-4B38-992E-000000000001 /CpuCap:32768

Теперь давайте подтвердите наш параметр, отображая группу, которую мы только что обновили.

C:\vm\tools>CpuGroups.exe GetGroups /GroupId:36AB08CB-3A76-4B38-992E-000000000001

CpuGroupId                          CpuCap LpIndexes
------------------------------------ ------ ---------
36AB08CB-3A76-4B38-992E-000000000001 32768 0,1,16,17

Пример 6. Печать идентификаторов группы ЦП для всех виртуальных машин на узле

C:\vm\tools>CpuGroups.exe GetVmGroup

VmName                                 VmId                           CpuGroupId
------ ------------------------------------ ------------------------------------
    G2 4ABCFC2F-6C22-498C-BB38-7151CE678758 36ab08cb-3a76-4b38-992e-000000000002
    P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC 36ab08cb-3a76-4b38-992e-000000000003
    P2 A593D93A-3A5F-48AB-8862-A4350E3459E8 36ab08cb-3a76-4b38-992e-000000000004
    G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200 36ab08cb-3a76-4b38-992e-000000000002
    G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC 36ab08cb-3a76-4b38-992e-000000000002

Пример 7. Отмена привязки виртуальной машины из группы ЦП

Чтобы удалить виртуальную машину из группы ЦП, установите значение CpuGroupId виртуальной машины в значение NULL GUID. Это отменяет привязку виртуальной машины из группы ЦП.

C:\vm\tools>CpuGroups.exe SetVmGroup /VmName:g1 /GroupId:00000000-0000-0000-0000-000000000000

C:\vm\tools>CpuGroups.exe GetVmGroup
VmName                                 VmId                           CpuGroupId
------ ------------------------------------ ------------------------------------
    G2 4ABCFC2F-6C22-498C-BB38-7151CE678758 36ab08cb-3a76-4b38-992e-000000000002
    P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC 36ab08cb-3a76-4b38-992e-000000000003
    P2 A593D93A-3A5F-48AB-8862-A4350E3459E8 36ab08cb-3a76-4b38-992e-000000000004
    G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200 36ab08cb-3a76-4b38-992e-000000000002
    G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC 00000000-0000-0000-0000-000000000000

Пример 8. Привязка виртуальной машины к существующей группе ЦП

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

C:\vm\tools>CpuGroups.exe SetVmGroup /VmName:g1 /GroupId:36AB08CB-3A76-4B38-992E-000000000001

Теперь убедитесь, что виртуальная машина G1 находится в требуемой группе ЦП.

C:\vm\tools>CpuGroups.exe GetVmGroup
VmName                                 VmId                           CpuGroupId
------ ------------------------------------ ------------------------------------
    G2 4ABCFC2F-6C22-498C-BB38-7151CE678758 36ab08cb-3a76-4b38-992e-000000000002
    P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC 36ab08cb-3a76-4b38-992e-000000000003
    P2 A593D93A-3A5F-48AB-8862-A4350E3459E8 36ab08cb-3a76-4b38-992e-000000000004
    G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200 36ab08cb-3a76-4b38-992e-000000000002
    G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC 36AB08CB-3A76-4B38-992E-000000000001

Пример 9. Печать всех виртуальных машин, сгруппированных по идентификатору группы ЦП

C:\vm\tools>CpuGroups.exe GetGroupVms
CpuGroupId                           VmName                                 VmId
------------------------------------ ------ ------------------------------------
36AB08CB-3A76-4B38-992E-000000000001     G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC
36ab08cb-3a76-4b38-992e-000000000002     G2 4ABCFC2F-6C22-498C-BB38-7151CE678758
36ab08cb-3a76-4b38-992e-000000000002     G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200
36ab08cb-3a76-4b38-992e-000000000003     P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC
36ab08cb-3a76-4b38-992e-000000000004     P2 A593D93A-3A5F-48AB-8862-A4350E3459E8

Пример 10. Печать всех виртуальных машин для одной группы ЦП

C:\vm\tools>CpuGroups.exe GetGroupVms /GroupId:36ab08cb-3a76-4b38-992e-000000000002

CpuGroupId                           VmName                                VmId
------------------------------------ ------ ------------------------------------
36ab08cb-3a76-4b38-992e-000000000002     G2 4ABCFC2F-6C22-498C-BB38-7151CE678758
36ab08cb-3a76-4b38-992e-000000000002     G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200

Пример 11. Попытка удалить непустую группу ЦП

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

C:\vm\tools>CpuGroups.exe DeleteGroup /GroupId:36ab08cb-3a76-4b38-992e-000000000001
(null)
Failed with error 0xc0350070

Пример 12. Отмена привязки единственной виртуальной машины из группы ЦП и удаление группы

В этом примере мы будем использовать несколько команд для проверки группы ЦП, удаления одной виртуальной машины, принадлежащей этой группе, а затем удаления группы.

Сначала перечислим виртуальные машины в нашей группе.

C:\vm\tools>CpuGroups.exe GetGroupVms /GroupId:36AB08CB-3A76-4B38-992E-000000000001
CpuGroupId                           VmName                                VmId
------------------------------------ ------ ------------------------------------
36AB08CB-3A76-4B38-992E-000000000001     G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC

Мы видим, что к этой группе принадлежит только одна виртуальная машина с именем G1. Давайте удалим виртуальную машину G1 из нашей группы, задав идентификатор группы виртуальной машины значение NULL.

C:\vm\tools>CpuGroups.exe SetVmGroup /VmName:g1 /GroupId:00000000-0000-0000-0000-000000000000

И проверьте наше изменение...

C:\vm\tools>CpuGroups.exe GetVmGroup /VmName:g1
VmName                                 VmId                           CpuGroupId
------ ------------------------------------ ------------------------------------
    G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC 00000000-0000-0000-0000-000000000000

Теперь, когда группа пуста, мы можем безопасно удалить ее.

C:\vm\tools>CpuGroups.exe DeleteGroup /GroupId:36ab08cb-3a76-4b38-992e-000000000001

И убедитесь, что наша группа исчезла.

C:\vm\tools>CpuGroups.exe GetGroups
CpuGroupId                          CpuCap                     LpIndexes
------------------------------------ ------ -----------------------------
36AB08CB-3A76-4B38-992E-000000000002 32768  4,5,6,7,8,9,10,11,20,21,22,23
36AB08CB-3A76-4B38-992E-000000000003 65536  12,13,14,15
36AB08CB-3A76-4B38-992E-000000000004 65536 24,25,26,27,28,29,30,31

Пример 13. Привязка виртуальной машины к исходной группе ЦП

C:\vm\tools>CpuGroups.exe SetVmGroup /VmName:g1 /GroupId:36AB08CB-3A76-4B38-992E-000000000002

C:\vm\tools>CpuGroups.exe GetGroupVms
CpuGroupId VmName VmId
------------------------------------ -------------------------------- ------------------------------------
36ab08cb-3a76-4b38-992e-000000000002 G2 4ABCFC2F-6C22-498C-BB38-7151CE678758
36ab08cb-3a76-4b38-992e-000000000002 G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200
36AB08CB-3A76-4B38-992E-000000000002 G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC
36ab08cb-3a76-4b38-992e-000000000003 P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC
36ab08cb-3a76-4b38-992e-000000000004 P2 A593D93A-3A5F-48AB-8862-A4350E3459E8