Controlli delle risorse delle macchine virtuali

Si applica a: Windows Server 2022, Windows Server 2016, Microsoft Hyper-V Server 2016, Windows Server 2019, Microsoft Hyper-V Server 2019

Questo articolo descrive i controlli di isolamento e delle risorse Hyper-V per le macchine virtuali. Queste funzionalità, a cui si fa riferimento come gruppi di CPU di macchine virtuali o semplicemente "gruppi di CPU", sono state introdotte in Windows Server 2016. I gruppi di CPU consentono agli amministratori di Hyper-V di gestire e allocare meglio le risorse della CPU dell'host tra le macchine virtuali guest. Usando i gruppi di CPU, gli amministratori di Hyper-V possono:

  • Creare gruppi di macchine virtuali, con ogni gruppo con allocazioni diverse delle risorse CPU totali dell'host di virtualizzazione, condivise nell'intero gruppo. In questo modo l'amministratore host può implementare classi di servizio per diversi tipi di macchine virtuali.

  • Impostare i limiti delle risorse della CPU su gruppi specifici. Questo "limite di gruppo" imposta il limite superiore per le risorse della CPU host che l'intero gruppo può utilizzare, in modo efficace l'applicazione della classe di servizio desiderata per tale gruppo.

  • Vincolare un gruppo di CPU in modo che sia eseguito solo su un set specifico di processori del sistema host. Può essere usato per isolare le macchine virtuali appartenenti a gruppi di CPU diversi l'uno dall'altro.

Gestione dei gruppi di CPU

I gruppi di CPU vengono gestiti tramite il servizio di calcolo host Hyper-V o HCS. Un'ottima descrizione del servizio HCS, la sua genesi, i collegamenti alle API HCS e altro ancora è disponibile nel blog del team di virtualizzazione Microsoft nel post Introducing the Host Compute Service (HCS)( Introduzione al servizio di calcolo host ( HCS).

Nota

Solo il servizio HCS può essere usato per creare e gestire gruppi di CPU. L'applet di gestione di Hyper-V, le interfacce di gestione WMI e PowerShell non supportano i gruppi di CPU.

Microsoft offre un'utilità della riga di comando, cpugroups.exe, nell'Area download Microsoft che usa l'interfaccia HCS per gestire i gruppi di CPU. Questa utilità può anche visualizzare la topologia della CPU di un host.

Funzionamento dei gruppi di CPU

L'allocazione delle risorse di calcolo dell'host tra gruppi di CPU viene applicata dall'hypervisor Hyper-V, usando un limite del gruppo CPU calcolato. Il limite del gruppo di CPU è una frazione della capacità totale della CPU per un gruppo di CPU. Il valore del limite di gruppo dipende dalla classe di gruppo o dal livello di priorità assegnato. Il limite del gruppo calcolato può essere pensato come "un numero di tempo di CPU di LP". Questo budget del gruppo è condiviso, quindi se era attiva una sola macchina virtuale, potrebbe usare l'allocazione della CPU dell'intero gruppo per se stessa.

Il limite del gruppo di CPU viene calcolato come G = n x C, dove:

  • G è la quantità di provider di risorse host da assegnare al gruppo
  • n è il numero totale di processori logici nel gruppo
  • C è l'allocazione massima della CPU, la classe di servizio desiderata per il gruppo, espressa come percentuale della capacità di calcolo totale del sistema

Si consideri ad esempio un gruppo di CPU configurato con 4 processori logici (LP) e un limite del 50%.

  • G = n * C
  • G = 4 * 50%
  • G = tempo di CPU pari a 2 LP per l'intero gruppo

In questo esempio, al gruppo di CPU G vengono allocati 2 LP di tempo di CPU.

Si noti che il limite del gruppo si applica indipendentemente dal numero di macchine virtuali o processori virtuali associati al gruppo e dallo stato (ad esempio, arresto o avvio) delle macchine virtuali assegnate al gruppo di CPU. Pertanto, ogni macchina virtuale associata allo stesso gruppo di CPU riceverà una frazione dell'allocazione totale della CPU del gruppo e questo cambierà con il numero di macchine virtuali associate al gruppo di CPU. Pertanto, poiché le macchine virtuali sono associate o non associate da un gruppo di CPU, il limite complessivo del gruppo di CPU deve essere regolato e impostato in modo da mantenere il limite risultante per macchina virtuale desiderato. L'amministratore host della macchina virtuale o il livello software di gestione della virtualizzazione è responsabile della gestione dei limiti dei gruppi in base alle esigenze per ottenere l'allocazione delle risorse della CPU per macchina virtuale desiderata.

Classi di servizio di esempio

Di seguito sono riportati alcuni semplici esempi. Per iniziare, si supponga che l'amministratore host Hyper-V desideri supportare due livelli di servizio per le macchine virtuali guest:

  1. Un livello "C" di fascia bassa. Questo livello verrà dato al 10% delle risorse di calcolo dell'intero host.

  2. Un livello "B" medio. A questo livello viene allocato il 50% delle risorse di calcolo dell'intero host.

A questo punto dell'esempio si asserirà che non sono in uso altri controlli delle risorse della CPU, ad esempio limiti di macchina virtuale singoli, pesi e riserve. Tuttavia, i limiti delle singole macchine virtuali sono importanti, come verrà illustrato più avanti.

Per semplicità, si supponga che ogni macchina virtuale abbia 1 VP e che l'host abbia 8 LP. Si inizierà con un host vuoto.

Per creare il livello "B", l'amministratore hoststartor imposta il limite del gruppo sul 50%:

  • G = n * C
  • G = 8 * 50%
  • G = tempo di CPU pari a 4 LP per l'intero gruppo

L'amministratore host aggiunge una singola macchina virtuale di livello "B". A questo punto, la macchina virtuale di livello "B" può usare al massimo il 50% della CPU dell'host o l'equivalente di 4 LP nel sistema di esempio.

A questo punto, l'amministratore aggiunge una seconda macchina virtuale "di livello B". L'allocazione del gruppo di CPU — è divisa uniformemente tra tutte le macchine virtuali. Il gruppo B ha un totale di 2 macchine virtuali, quindi ogni macchina virtuale ottiene la metà del totale del gruppo B del 50%, del 25% ognuna o l'equivalente di 2 LPs del tempo di calcolo.

Impostazione dei limiti della CPU nelle singole macchine virtuali

Oltre al limite di gruppo, ogni macchina virtuale può avere anche un singolo "limite di macchine virtuali". I controlli delle risorse della CPU per macchina virtuale, tra cui un limite di CPU, un peso e una riserva, fanno parte di Hyper-V dalla sua introduzione. In combinazione con un limite di gruppo, un limite di macchine virtuali specifica la quantità massima di CPU che ogni VP può ottenere, anche se nel gruppo sono disponibili risorse della CPU.

Ad esempio, l'amministratore host potrebbe voler inserire un limite del 10% per le macchine virtuali "C". In questo modo, anche se la maggior parte delle macchine virtuali "C" è inattiva, ogni VP non potrebbe mai ottenere più del 10%. Senza un limite di macchine virtuali, le macchine virtuali "C" potrebbero raggiungere in modo opportunistico prestazioni superiori ai livelli consentiti dal livello.

Isolamento di gruppi di macchine virtuali in processori host specifici

Gli amministratori host Hyper-V possono anche voler dedicare le risorse di calcolo a una macchina virtuale. Si supponga, ad esempio, che l'amministratore voglia offrire una macchina virtuale "A" Premium con un limite di classe del 100%. Queste macchine virtuali Premium richiedono anche la latenza e l'instabilità di pianificazione più basse possibili. ciò significa che non possono essere de-pianificati da altre macchine virtuali. Per ottenere questa separazione, è anche possibile configurare un gruppo di CPU con un mapping di affinità LP specifico.

Ad esempio, per adattare una macchina virtuale "A" nell'host in questo esempio, l'amministratore crea un nuovo gruppo di CPU e imposta l'affinità del processore del gruppo su un subset di IP dell'host. Ai gruppi B e C verrebbero affinità con i gruppi LP rimanenti. L'amministratore potrebbe creare una singola macchina virtuale nel gruppo A, che avrebbe quindi accesso esclusivo a tutti i gruppi di disponibilità nel gruppo A, mentre i gruppi di livello presumibilmente inferiore B e C condividerebbero i rimanenti LP.

Separazione di VM radice da VM guest

Per impostazione predefinita, Hyper-V creerà un VP radice in ogni punto di distribuzione fisico sottostante. Questi VP radice sono rigorosamente mappati 1:1 con gli LP di sistema e non eseguono la migrazione, vale a seconda che ogni VP radice verrà sempre eseguito nello stesso — percorso fisico. Le macchine virtuali guest possono essere eseguite in qualsiasi LP disponibile e condivideranno l'esecuzione con le macchine virtuali radice.

Tuttavia, può essere preferibile separare completamente l'attività del VP radice dalle macchine virtuali guest. Si consideri l'esempio precedente in cui viene implementata una macchina virtuale di livello "A" Premium. Per garantire che i VP della macchina virtuale "A" hanno la latenza e l'instabilità più bassi possibili o una variazione di pianificazione, è possibile eseguirli in un set dedicato di LP e assicurarsi che la radice non sia in esecuzione in questi LP.

Questa operazione può essere eseguita usando una combinazione della configurazione "minroot", che limita la partizione del sistema operativo host all'esecuzione in un subset dei processori logici di sistema totali, insieme a uno o più gruppi di CPU con affinità.

L'host di virtualizzazione può essere configurato per limitare la partizione host a indirizzi IP specifici, con uno o più gruppi di CPU affini ai rimanenti indirizzi IP. In questo modo, le partizioni radice e guest possono essere eseguite su risorse della CPU dedicate e completamente isolate, senza condivisione della CPU.

Per altre informazioni sulla configurazione "minroot", vedere Hyper-V Host CPU Resource Management.

Uso dello strumento CpuGroups

Di seguito sono riportati alcuni esempi di come usare lo strumento CpuGroups.

Nota

I parametri della riga di comando per lo strumento CpuGroups vengono passati usando solo spazi come delimitatori. Nessun carattere '/' o '-' deve continuare con l'opzione della riga di comando desiderata.

Individuazione della topologia della CPU

L'esecuzione di CpuGroups con GetCpuTopology restituisce informazioni sul sistema corrente, come illustrato di seguito, tra cui l'indice LP, il nodo NUMA a cui appartiene il punto di distribuzione locale, gli ID pacchetto e core e l'indice ROOT VP.

L'esempio seguente illustra un sistema con 2 socket CPU e nodi NUMA, un totale di 32 LP e multithreading abilitato e configurato per abilitare Minroot con 8 VM radice, 4 da ogni nodo NUMA. I provider di servizi di rete che dispongono di macchine virtuali radice hanno RootVpIndex > = 0; Gli LP con RootVpIndex -1 non sono disponibili per la partizione radice, ma sono ancora gestiti dall'hypervisor e eseguiranno i vip guest come consentito da altre impostazioni di configurazione.

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

Esempio 2: – Stampare tutti i gruppi di CPU nell'host

In questo caso verranno elencati tutti i gruppi di CPU nell'host corrente, il relativo GroupId, il limite di CPU del gruppo e gli indici di indirizzi IP assegnati a tale gruppo.

Si noti che i valori validi per il limite di CPU sono nell'intervallo [0, 65536] e questi valori esprimere il limite di gruppo in percentuale (ad esempio, 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

Esempio – 3: Stampare un singolo gruppo di CPU

In questo esempio si esegue una query su un singolo gruppo di CPU usando GroupId come 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

Esempio – 4: Creare un nuovo gruppo di CPU

In questo caso si creerà un nuovo gruppo DI CPU, specificando l'ID gruppo e il set di LP da assegnare al gruppo.

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

Visualizzare ora il gruppo appena aggiunto.

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

Esempio – 5: Impostare il limite del gruppo di CPU sul 50%

In questo caso, il limite del gruppo di CPU verrà impostato sul 50%.

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

A questo punto è possibile confermare l'impostazione visualizzando il gruppo appena aggiornato.

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

Esempio – 6: Stampare gli ID gruppo CPU per tutte le macchine virtuali nell'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

Esempio 7 – Disassociare una macchina virtuale dal gruppo CPU

Per rimuovere una macchina virtuale da un gruppo di CPU, impostare su CpuGroupId della macchina virtuale sul GUID NULL. In questo modo la macchina virtuale viene disassociato dal gruppo di 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

Esempio 8: – Associare una macchina virtuale a un gruppo di CPU esistente

In questo caso si aggiungerà una macchina virtuale a un gruppo di CPU esistente. Si noti che la macchina virtuale non deve essere associata ad alcun gruppo di CPU esistente. In caso contrario, l'impostazione dell'ID del gruppo di CPU avrà esito negativo.

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

Verificare ora che la macchina virtuale G1 sia nel gruppo di CPU desiderato.

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

Esempio 9: – Stampare tutte le macchine virtuali raggruppate per ID gruppo 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

Esempio 10: – Stampare tutte le macchine virtuali per un singolo gruppo di 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

Esempio 11 – Tentativo di eliminare un gruppo di CPU non vuoto

È possibile eliminare solo — i gruppi di CPU vuoti, ad esempio i gruppi di CPU senza — macchine virtuali associate. Il tentativo di eliminare un gruppo di CPU non vuoto avrà esito negativo.

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

Esempio 12 – Disassociare l'unica macchina virtuale da un gruppo di CPU ed eliminare il gruppo

In questo esempio si useranno diversi comandi per esaminare un gruppo di CPU, rimuovere la singola macchina virtuale appartenente a tale gruppo e quindi eliminare il gruppo.

Per prima cosa, enumerare le macchine virtuali nel gruppo.

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

Si noti che solo una singola macchina virtuale, denominata G1, appartiene a questo gruppo. Rimuovere la macchina virtuale G1 dal gruppo impostando l'ID gruppo della macchina virtuale su NULL.

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

E verificare la modifica...

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

Ora che il gruppo è vuoto, è possibile eliminarlo senza problemi.

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

Verificare che il gruppo non sia più disponibile.

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

Esempio 13: – Associare una macchina virtuale al gruppo di CPU originale

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