Controles de recursos de máquinas virtuales

Se aplica a: Windows Server 2022, Windows Server 2016, Microsoft Hyper-V Server 2016, Windows Server 2019, Microsoft Hyper-V Server 2019

En este artículo se describen los controles de aislamiento y recursos de Hyper-V para máquinas virtuales. Estas funcionalidades, a las que nos referiremos como grupos de CPU de máquina virtual o simplemente "grupos de CPU", se introdujeron en Windows Server 2016. Los grupos de CPU permiten a los administradores de Hyper-V administrar y asignar mejor los recursos de CPU del host entre las máquinas virtuales invitadas. Mediante los grupos de CPU, los administradores de Hyper-V pueden:

  • Cree grupos de máquinas virtuales en el que cada grupo tenga asignaciones diferentes de los recursos totales de CPU del host de virtualización, compartidos entre todo el grupo. Esto permite al administrador del host implementar clases de servicio para diferentes tipos de máquinas virtuales.

  • Establezca límites de recursos de CPU en grupos específicos. Este "límite de grupo" establece el límite superior para los recursos de CPU del host que todo el grupo puede consumir, aplicando de forma efectiva la clase de servicio deseada para ese grupo.

  • Restrinja un grupo de CPU para que solo se ejecute en un conjunto específico de procesadores del sistema host. Esto se puede usar para aislar entre sí las máquinas virtuales que pertenecen a diferentes grupos de CPU.

Administración de grupos de CPU

Los grupos de CPU se administran a través del servicio de proceso de host de Hyper-V o HCS. En la publicación Introducción al servicio de proceso de host (HCS) del blog del equipo de virtualización de Microsoft, encontrará una excelente descripción de HCS, su origen, vínculos a las API de HCS, etc.

Nota

Solo se puede usar HCS para crear y administrar grupos de CPU; las applet de Hyper-V Manager, las interfaces de administración de WMI y PowerShell no admiten grupos de CPU.

Microsoft proporciona una utilidad de línea de comandos, cpugroups.exe, en el Centro de descarga de Microsoft que usa la interfaz de HCS para administrar grupos de CPU. Esta utilidad también puede mostrar la topología de CPU de un host.

Funcionamiento de los grupos de CPU

El hipervisor de Hyper-V aplica la asignación de recursos de proceso de host entre los grupos de CPU mediante un límite de grupo de CPU calculado. El límite del grupo de CPU es una fracción de la capacidad total de CPU de un grupo. El valor del límite del grupo depende de la clase de grupo o del nivel de prioridad asignado. El límite de grupo calculado puede considerarse como "el tiempo de CPU de un número de procesadores lógicos". Este presupuesto de grupo se comparte, por lo que si solo una sola máquina virtual estuviera activa, podría usar la asignación de CPU de todo el grupo para sí misma.

El límite del grupo de CPU se calcula como G = n x C, donde:

  • G es la cantidad de procesadores lógicos (LP) de host que nos gustaría asignar al grupo.
  • n es el número total de procesadores lógicos (LP) del grupo.
  • C es la asignación máxima de CPU, es decir, la clase de servicio deseada para el grupo, expresada como un porcentaje de la capacidad de proceso total del sistema.

Por ejemplo, imagine un grupo de CPU configurado con 4 procesadores lógicos (LP) y un límite del 50 %.

  • G = n * C
  • G = 4 * 50 %
  • G = 2 LP de tiempo de CPU para todo el grupo

En este ejemplo, se asigna al valor G del grupo de CPU 2 procesadores lógicos de tiempo de CPU

Tenga en cuenta que el límite de grupo se aplica independientemente del número de máquinas virtuales o procesadores virtuales enlazados al grupo, e independientemente del estado (por ejemplo, apagado o iniciado) de las máquinas virtuales asignadas al grupo de CPU. Por lo tanto, cada máquina virtual enlazada al mismo grupo de CPU recibirá una fracción de la asignación total de CPU del grupo y esto cambiará con el número de máquinas virtuales enlazadas al grupo de CPU. Por lo tanto, a medida que se enlazan o desenlazan máquinas virtuales de un grupo de CPU, el límite general del grupo de CPU debe reajustarse y establecerse para que mantenga el límite resultante por máquina virtual deseado. El administrador de host de la máquina virtual o la capa de software de administración de virtualización es responsable de administrar los límites de grupo según sea necesario para lograr la asignación de recursos de CPU por máquina virtual deseada.

Clases de servicio de ejemplo

Veamos algunos ejemplos sencillos. Para empezar, supongamos que el administrador del host de Hyper-V desea admitir dos niveles de servicio para las máquinas virtuales invitadas:

  1. Un nivel "C" de gama baja. Asignaremos a este nivel el 10 % de los recursos de proceso de todo el host.

  2. Un nivel "B" de gama media. Asignaremos a este nivel el 50 % de los recursos de proceso de todo el host.

En este punto de nuestro ejemplo, nos aseguraremos de que ningún otro control de recursos de CPU esté en uso, como límites, pesos y reservas individuales de máquina virtual. No obstante, los límites de máquina virtual individuales son importantes, como ya veremos un poco más adelante.

Por motivos de simplicidad, supongamos que cada máquina virtual tiene 1 procesador virtual (VP) y que nuestro host tiene 8 procesadores lógicos (LP). Comenzaremos con un host vacío.

Para crear el nivel "B", el administrador de host establece el límite del grupo en el 50 %:

  • G = n * C
  • G = 8 * 50 %
  • G = 4 LP de tiempo de CPU para todo el grupo

El administrador de host agrega una única máquina virtual de nivel "B". En este momento, nuestra máquina virtual de nivel "B" puede usar como máximo el 50 % de CPU del host o el equivalente a 4 LP de nuestro sistema de ejemplo.

Ahora, el administrador agrega una segunda máquina virtual de "nivel B". La asignación del grupo de CPU se divide uniformemente entre todas las máquinas virtuales. Tenemos un total de 2 máquinas virtuales en el grupo B, por lo que cada máquina virtual ahora obtiene la mitad del total del grupo B del 50 %, es decir, el 25 % cada una, o el equivalente de 2 LP de tiempo de proceso.

Establecimiento de límites de CPU en máquinas virtuales individuales

Además del límite de grupo, cada máquina virtual también puede tener un "límite de máquina virtual" individual. Los controles de recursos de CPU por máquina virtual, incluido el límite, peso y reserva de CPU, han formado parte de Hyper-V desde su introducción. Cuando se combina con un límite de grupo, un límite de máquina virtual especifica la cantidad máxima de CPU que puede obtener cada VP, incluso si el grupo tiene recursos de CPU disponibles.

Por ejemplo, es posible que el administrador del host quiera colocar un límite de máquina virtual del 10 % en las máquinas virtuales "C". De este modo, aunque la mayoría de los VP de "C" estén inactivos, cada VP nunca podría obtener más del 10 %. Sin un límite de máquina virtual, las máquinas virtuales "C" podrían lograr de forma oportunista un rendimiento más allá de los niveles permitidos por su nivel.

Aislamiento de grupos de máquinas virtuales en procesadores host específicos

Es posible que los administradores de host de Hyper-V también quieran dedicar recursos de proceso a una máquina virtual. Por ejemplo, imagine que el administrador quisiera ofrecer una máquina virtual "A" premium que tiene un límite de clase del 100 %. Estas máquinas virtuales premium también requieren la menor latencia de programación y vibración posible; es decir, ninguna otra máquina virtual puede desprogramarlas. Para lograr esta separación, también se puede configurar un grupo de CPU con una asignación de afinidad de LP específica.

Por ejemplo, para ajustarse a una máquina virtual "A" en el host en nuestro ejemplo, el administrador podría crear un nuevo grupo de CPU y establecer la afinidad de procesador del grupo en un subconjunto de LP del host. Los grupos B y C establecerían su afinidad con los LP restantes. El administrador podría crear una sola máquina virtual en el grupo A, la cual tendría acceso exclusivo a todos los LP del grupo A, mientras que los grupos de nivel inferior B y C compartirían los LP restantes.

Separación de los VP raíz de los VP invitados

De forma predeterminada, Hyper-V creará un VP raíz en cada LP físico subyacente. Estas máquinas virtuales raíz se asignan con una correspondencia estricta 1:1 con los LP del sistema y no se migran, es decir, cada VP raíz siempre se ejecutará en el mismo LP físico. Los VP invitados se pueden ejecutar en cualquier LP disponible y compartirán la ejecución con los VP raíz.

Sin embargo, puede que sea conveniente separar completamente la actividad del VP raíz de los VP invitados. Considere el ejemplo anterior en el que implementamos una máquina virtual de nivel "A" premium. Para asegurarse de que los VP de la máquina virtual "A" tengan la menor latencia y "vibración" posible, o variación de programación, las ejecutaremos en un conjunto dedicado de LP y nos aseguraremos de que el raíz no se ejecute en estos LP.

Esto se puede lograr mediante una combinación de la configuración "minroot", que limita la partición del sistema operativo host a ejecutarse en un subconjunto del total de los procesadores lógicos del sistema, junto con uno o varios grupos de CPU afines.

El host de virtualización se puede configurar para que restrinja la partición del host a LP específicos, con uno o más grupos de CPU afines con los LP restantes. De esta manera, las particiones raíz e invitada se pueden ejecutar en recursos de CPU dedicados, y completamente aislados, sin que haya uso compartido de CPU.

Para más información sobre la configuración de "minroot", consulte Administración de recursos de CPU del host de Hyper-V.

Uso de la herramienta CpuGroups

Veamos algunos ejemplos de cómo usar la herramienta CpuGroups.

Nota

Los parámetros de la línea de comandos de la herramienta CpuGroups se pasan mediante espacios como delimitadores. Ningún carácter "/" o "-" debe preceder al modificador deseado de la línea de comandos.

Detección de la topología de CPU

La ejecución de CpuGroups con GetCpuTopology devuelve información sobre el sistema actual, como se muestra a continuación, incluido el índice de LP, el nodo NUMA al que pertenece el LP, los identificadores de paquete y núcleo, y el índice de VP raíz.

En el ejemplo siguiente se muestra un sistema con 2 sockets de CPU y nodos NUMA, un total de 32 LP y varios subprocesos habilitados y configurados para habilitar Minroot con 8 VP raíz, 4 en cada nodo NUMA. Los LP que tienen VP raíz tienen un valor RootVpIndex >= 0; Los LP con RootVpIndex de -1 no están disponibles para la partición raíz, pero el hipervisor los administra y ejecutará los VP invitados permitidos por otras opciones de configuración.

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

Ejemplo 2: Imprimir todos los grupos de CPU en el host

Aquí, enumeraremos todos los grupos de CPU en el host actual, su GroupId, el límite de CPU del grupo y las indicciones de los LP asignados a ese grupo.

Tenga en cuenta que los valores de límite de CPU válidos están en el intervalo [0, 65536], y estos valores expresan el límite del grupo en porcentaje (por ejemplo, 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

Ejemplo 3: Imprimir un único grupo de CPU

En este ejemplo, consultaremos un único grupo de CPU con GroupId como filtro.

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

Ejemplo 4: Crear un grupo de CPU

Aquí, crearemos un nuevo grupo de CPU, especificando el identificador de grupo y el conjunto de LP que se asignarán al grupo.

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

Ahora aparece nuestro grupo recién agregado.

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

Ejemplo 5: Establecer el límite del grupo de CPU en el 50 %

Aquí vamos a establecer el límite del grupo de CPU en el 50 %.

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

Ahora vamos a confirmar nuestra configuración mostrando el grupo que acabamos de actualizar.

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

Ejemplo 6: Imprimir identificadores de grupo de CPU para todas las máquinas virtuales del host

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

Ejemplo 7: Desenlazar una máquina virtual del grupo de CPU

Para eliminar una máquina virtual de un grupo de CPU, establezca el CpuGroupId de la máquina virtual en el identificador único global NULL. Esto desenlazará la máquina virtual del grupo de CPU.

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

Ejemplo 8: Enlazar una máquina virtual a un grupo de CPU existente

Aquí agregaremos una máquina virtual a un grupo de CPU existente. Tenga en cuenta que la máquina virtual no debe estar enlazada a ningún grupo de CPU existente o se producirá un error al establecer el identificador del grupo de CPU.

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

Ahora, confirme que la máquina virtual G1 está en el grupo de CPU deseado.

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

Ejemplo 9: Imprimir todas las máquinas virtuales agrupadas por el identificador de grupo de CPU

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

Ejemplo 10: Imprimir todas las máquinas virtuales para un único grupo de CPU

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

Ejemplo 11: Intentar eliminar un grupo de CPU no vacío

Solo se pueden eliminar grupos de CPU vacíos (es decir, grupos de CPU sin máquinas virtuales enlazadas). Si intenta eliminar un grupo de CPU no vacío se producirá un error.

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

Ejemplo 12: Desenlazar la única máquina virtual de un grupo de CPU y eliminar el grupo

En este ejemplo, usaremos varios comandos para examinar un grupo de CPU, eliminar la única máquina virtual que pertenece a ese grupo y, a continuación, eliminar el grupo.

En primer lugar, vamos a mostrar las máquinas virtuales de nuestro grupo.

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

Vemos que solo una sola máquina virtual, denominada G1, pertenece a este grupo. Vamos a eliminar la máquina virtual G1 de nuestro grupo estableciendo el identificador de grupo de la máquina virtual en NULL.

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

Y vamos a comprobar el cambio...

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

Ahora que el grupo está vacío, podemos eliminarlo de forma segura.

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

Y confirmar que el grupo ha desaparecido.

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

Ejemplo 13: Enlazar de nuevo una máquina virtual a su grupo de CPU original

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