Controles de recursos de máquina virtual

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. Con los grupos de CPU, los administradores de Hyper-V pueden:

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

  • Establezca los 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 puede consumir todo el grupo, aplicando eficazmente la clase de servicio deseada para ese grupo.

  • Restringir 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 las máquinas virtuales que pertenecen a grupos de CPU diferentes entre sí.

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. Puede encontrar una descripción excelente de HCS, su genéfico, vínculos a las API de HCS y mucho más en el blog del equipo de Virtualización de Microsoft en la publicación Introducing the Host Compute Service (HCS) (Introducción al servicio de proceso de host [HCS]).

Nota

Solo se puede usar HCS para crear y administrar grupos de CPU; El applet del Administrador de Hyper-V, wmi y las interfaces de administración de 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 HCS para administrar grupos de CPU. Esta utilidad también puede mostrar la topología de CPU de un host.

Cómo funcionan los grupos de CPU

El hipervisor de Hyper-V aplica la asignación de recursos de proceso de host entre 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 para un grupo de CPU. El valor del límite de grupo depende de la clase de grupo o del nivel de prioridad asignado. El límite de grupo calculado se puede pensar como "un número de tiempo de CPU por valor de LP". Este presupuesto de grupo se comparte, por lo que si solo una máquina virtual estaba activa, podría usar la asignación de CPU de todo el grupo por sí mismo.

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

  • G es la cantidad de LP del 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, considere 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, al grupo de CPU G se le asignan 2 LP 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, lo que cambiará con el número de máquinas virtuales enlazadas al grupo de CPU. Por lo tanto, a medida que las máquinas virtuales están enlazadas o sin enlazar de un grupo de CPU, el límite general del grupo de CPU debe ajustarse y establecerse para mantener el límite por máquina virtual resultante deseado. El administrador de host de 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

Echemos un vistazo a algunos ejemplos sencillos. Para empezar, suponga que el administrador de host de Hyper-V quiere admitir dos niveles de servicio para las máquinas virtuales invitadas:

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

  2. Un nivel "B" de intervalo medio. A este nivel se le asigna el 50 % de los recursos de proceso de todo el host.

En este punto de nuestro ejemplo vamos a asegurar que no hay ningún otro control de recursos de CPU en uso, como límites, pesos y reservas individuales de las máquinas virtuales. Sin embargo, los límites individuales de las máquinas virtuales son importantes, como veremos un poco más adelante.

Por motivos de simplicidad, supongamos que cada máquina virtual tiene 1 VP y que nuestro host tiene 8 LP. Comenzaremos con un host vacío.

Para crear el nivel "B", el administrador de host establece el límite de 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 sola máquina virtual de nivel "B". En este momento, nuestra máquina virtual de nivel "B" puede usar como máximo el 50 % de la CPU del host o el equivalente de 4 LP en 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 %, el 25 % cada una, o el equivalente a 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 un límite de CPU, un peso y una reserva, han sido 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 las máquinas virtuales "C" estén inactivas, 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 oportunistamente un rendimiento más allá de los niveles permitidos por su nivel.

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

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

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

Segregación de las máquinas virtuales raíz de las ip virtuales invitadas

De forma predeterminada, Hyper-V creará un VP raíz en cada LP físico subyacente. Estas máquinas virtuales raíz se asignan estrictamente 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. Las máquinas virtuales invitadas se pueden ejecutar en cualquier LP disponible y compartirán la ejecución con las máquinas virtuales raíz.

Sin embargo, puede ser conveniente separar completamente la actividad de VP raíz de las máquinas virtuales invitadas. Considere el ejemplo anterior, donde implementamos una máquina virtual de nivel Premium "A". Para asegurarse de que las máquinas virtuales de la máquina virtual "A" tienen la menor latencia y "vibración" posibles, o la variación de programación, nos gustaría ejecutarlas en un conjunto dedicado de LP y asegurarnos de que la raíz no se ejecuta en estos LP.

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

El host de virtualización se puede configurar para restringir la partición de host a LP específicos, con uno o varios grupos de CPU afinidadados con los LP restantes. De esta manera, las particiones raíz e invitado se pueden ejecutar en recursos de CPU dedicados y completamente aislados, sin uso compartido de CPU.

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

Uso de la herramienta CpuGroups

Echemos un vistazo a 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 solo mediante espacios como delimitadores. Ningún carácter "/" o "-" debe continuar con el modificador de línea de comandos deseado.

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 LP, el nodo NUMA al que pertenece el LP, los valores de Package and Core IDs 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 multiproceso habilitados, y configurado para habilitar Minroot con 8 VPs raíz, 4 de cada nodo NUMA. Los LPs que tienen VPs raíz tienen rootVpIndex >= 0; Los LP con rootVpIndex de -1 no están disponibles para la partición raíz, pero el hipervisor sigue administrando y ejecutarán las VP invitadas según lo permitido 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: Impresión de todos los grupos de CPU en el host

En este caso, enumeraremos todos los grupos de CPU en el host actual, su GroupId, el límite de CPU del grupo y las características de LPs asignadas 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 de 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: Impresión de un único grupo de CPU

En este ejemplo, se consultará un único grupo de CPU mediante 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: Creación de un nuevo grupo de CPU

En este caso, crearemos un nuevo grupo de CPU, especificando el identificador de grupo y el conjunto de direcciones IP que se asignarán al grupo.

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

Ahora, muestre el 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í, estableceremos 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 la configuración mostrando el grupo que acaba 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: Impresión de 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: Desenlaz de una máquina virtual del grupo de CPU

Para quitar una máquina virtual de un grupo de CPU, establezca en CpuGroupId de la máquina virtual en el GUID NULL. Esto desenlazó 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: Enlace de 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 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: Impresión de 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: Intento de eliminar un grupo de CPU no vacío

Solo se pueden eliminar los grupos de CPU vacíos, es decir, los grupos de CPU sin máquinas virtuales enlazadas. Se producirá un error al intentar eliminar un grupo de CPU no vacío.

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

Ejemplo 12: Desenlazen la única máquina virtual de un grupo de CPU y el grupo se elimina

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

En primer lugar, vamos a enumerar 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 quitar 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 compruebe nuestro 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 confirme que nuestro 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 una máquina virtual de nuevo 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