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 risorse Hyper-V per le macchine virtuali. Queste funzionalità, a cui si farà riferimento come gruppi di CPU della macchina virtuale 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 nelle 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, applicando in modo efficace la classe di servizio desiderata per tale gruppo.

  • Vincolare un gruppo di CPU per l'esecuzione solo in 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. Una descrizione dettagliata di HCS, la sua genesi, i collegamenti alle API HCS e altro ancora è disponibile nel blog del team di virtualizzazione Microsoft nel post Introduzione al servizio di calcolo host (HCS).

Nota

Solo il servizio HCS può essere usato per creare e gestire i gruppi di CPU; Le interfacce di gestione di Hyper-V Manager, WMI e PowerShell non supportano i gruppi di CPU.

Microsoft fornisce 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 host tra gruppi di CPU viene applicata dall'hypervisor Hyper-V usando un limite di gruppo di 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 di gruppo calcolato può essere considerato come "un certo numero di tempo di CPU di LP". Questo budget di gruppo viene condiviso, quindi se solo una singola macchina virtuale era attiva, 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 LP host che si vuole assegnare al gruppo
  • n è il numero totale di processori logici (LP) nel gruppo
  • C è l'allocazione massima della CPU, ovvero 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 = 2 LP vale il tempo di CPU per l'intero gruppo

In questo esempio, il gruppo di CPU G viene allocato 2 LP del tempo di CPU.

Si noti che il limite di gruppo si applica indipendentemente dal numero di macchine virtuali o processori virtuali associati al gruppo e indipendentemente dallo stato (ad esempio, arresto o avvio) delle macchine virtuali assegnate al gruppo di CPU. Di conseguenza, ogni macchina virtuale associata allo stesso gruppo di CPU riceverà una frazione dell'allocazione totale della CPU del gruppo e ciò 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 riaggiusto e impostato per mantenere il limite desiderato per ogni macchina virtuale risultante. L'amministratore host della macchina virtuale o il livello software di gestione della virtualizzazione è responsabile della gestione dei limiti di gruppo in base alle esigenze per ottenere l'allocazione di risorse della CPU per macchina virtuale desiderata.

Classi di esempio di servizio

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

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

  2. Livello "B" di intervallo medio. Questo livello viene allocato al 50% delle risorse di calcolo dell'intero host.

A questo punto dell'esempio si asserisce che non sono in uso altri controlli delle risorse DELLA CPU, ad esempio singoli limiti di macchina virtuale, pesi e riserve. Tuttavia, i singoli limiti di macchina virtuale sono importanti, come vedremo 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 host imposta il limite di gruppo su 50%:

  • G = n * C
  • G = 8 * 50%
  • G = 4 LP vale il tempo di CPU 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 in modo uniforme tra tutte le macchine virtuali. Nel gruppo B sono presenti un totale di 2 macchine virtuali, quindi ogni macchina virtuale ottiene ora la metà del totale del 50%, del 25% ciascuno o dell'equivalente di 2 LP che vale il tempo di calcolo.

Impostazione dei limiti di CPU in singole macchine virtuali

Oltre al limite di gruppo, ogni macchina virtuale può anche avere un singolo limite di macchina virtuale. I controlli delle risorse CPU per macchina virtuale, inclusi un limite di CPU, un peso e una riserva, fanno parte di Hyper-V dall'introduzione. Se combinato con un limite di gruppo, un limite di VM specifica la quantità massima di CPU che ogni VP può ottenere, anche se il gruppo dispone di risorse CPU disponibili.

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

Isolamento di gruppi di macchine virtuali in processori host specifici

Gli amministratori host Hyper-V possono anche volere la possibilità di dedicare risorse di calcolo a una macchina virtuale. Si supponga, ad esempio, che l'amministratore voglia offrire una macchina virtuale premium "A" con un limite di classe pari al 100%. Queste macchine virtuali Premium richiedono anche la latenza di pianificazione più bassa e il jitter possibile; ovvero, potrebbero non essere pianificati da nessun'altra macchina virtuale. 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 nell'esempio, l'amministratore creerebbe un nuovo gruppo di CPU e imposta l'affinità del processore del gruppo su un subset degli indirizzi IP dell'host. I gruppi B e C verranno affinizzati con gli LP rimanenti. L'amministratore potrebbe creare una singola macchina virtuale nel gruppo A, che avrebbe quindi accesso esclusivo a tutti gli LP nel gruppo A, mentre i gruppi di livello inferiore presumibilmente inferiori B e C condividerebbero gli LP rimanenti.The administrator could create a single vm in Group A, which then have exclusive access to all LPS in Group A, while the presumibilmente lower tier groups B and C would share the remaining LPS.

Separazione di VP radice da VP guest

Per impostazione predefinita, Hyper-V creerà una VP radice in ogni LP fisico sottostante. Questi VP radice sono strettamente mappati 1:1 con gli indirizzi IP di sistema e non eseguono la migrazione, ovvero ogni VP radice verrà sempre eseguito sullo stesso LP fisico. I VP guest possono essere eseguiti in qualsiasi LP disponibile e condivideranno l'esecuzione con le VP radice.

Tuttavia, potrebbe essere consigliabile separare completamente l'attività VP radice dai VP guest. Si consideri l'esempio precedente in cui si implementa una macchina virtuale di livello "A" Premium. Per garantire che i VP della macchina virtuale "A" abbiano la latenza e la variazione di pianificazione più bassa possibile, è consigliabile eseguirli in un set dedicato di indirizzi IP e assicurarsi che la radice non venga eseguita in questi LP.

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

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

Per altre informazioni sulla configurazione "minroot", vedere Gestione risorse CPU host Hyper-V.

Uso dello strumento CpuGroups

Ecco alcuni esempi di come usare lo strumento CpuGroups.

Nota

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

Individuazione della topologia della CPU

L'esecuzione di CpuGroup con la topologia GetCpuTo restituisce informazioni sul sistema corrente, come illustrato di seguito, tra cui l'indice LP, il nodo NUMA a cui appartiene l'LP, gli ID pacchetto e core e l'indice ROOT VP.

L'esempio seguente mostra un sistema con 2 socket CPU e nodi NUMA, un totale di 32 LP e multithreading abilitato e configurato per abilitare Minroot con 8 VP radice, 4 da ogni nodo NUMA. Gli indirizzi IP con VP radice hanno rootVpIndex >= 0; Gli indirizzi IP con rootVpIndex pari a -1 non sono disponibili per la partizione radice, ma sono ancora gestiti dall'hypervisor e eseguiranno le VP 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 del limite di CPU sono compresi nell'intervallo [0, 65536], e questi valori esprimono 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 verrà eseguita 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 verrà creato un nuovo gruppo di CPU, specificando l'ID gruppo e il set di indirizzi IP 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 su 50%

In questo caso, il limite di gruppo della 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 del gruppo di 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: annullare l'associazione di una macchina virtuale dal gruppo di CPU

Per rimuovere una macchina virtuale da un gruppo di CPU, impostare su CpuGroupId della macchina virtuale sul GUID NULL. Questa operazione annulla l'associazione della macchina virtuale 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 a un gruppo di CPU esistente o l'impostazione dell'ID 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 in base all'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 gruppi di CPU vuoti, ovvero 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: annullare l'associazione dell'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, quindi eliminare il gruppo.

Prima di tutto, enumeriamo 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 noterà 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 nostra 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 in modo sicuro.

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

E confermare che il nostro gruppo è andato via.

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