Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo descrive i controlli delle risorse e dell'isolamento di Hyper-V per le macchine virtuali. Queste funzionalità, a cui ci si riferirà 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 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 che con allocazioni diverse delle risorse CPU totali dell'host di virtualizzazione, condivise dall'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 a gruppi specifici. Il "limite di gruppo" stabilisce il limite massimo di risorse della CPU host che l'intero gruppo può usare, applicando in modo efficace la classe di servizio desiderata per quel gruppo.
Vincola un gruppo di CPU per l’esecuzione in un solo set specifico di processori del sistema host. Ciò può essere usato per isolare tra loro le macchine virtuali appartenenti a gruppi di CPU diversi.
Gestione dei gruppi di CPU
I gruppi di CPU vengono gestiti tramite il servizio di calcolo host Hyper-V o HCS. Un'ottima descrizione dell'HCS, la sua genesi, i collegamenti alle API HCS e altro ancora sono disponibili sul blog del team di virtualizzazione Microsoft nel post Introduzione al servizio HCS (Host Compute Service).
Nota
Solo il servizio HCS può essere usato per creare e gestire i gruppi di CPU. L’applet Hyper-V Manager, le interfacce di gestione WMI e PowerShell non supportano i gruppi di CPU.
Microsoft fornisce un'utilità a riga di comando, cpugroups.exe, nell’Area download Microsoft che usa l'interfaccia HCS per gestire i gruppi di CPU. Questa utility può anche visualizzare la topologia della CPU di un host.
Funzionamento dei gruppi di CPU
L'allocazione delle risorse di calcolo host tra i gruppi di CPU viene applicata dall'hypervisor Hyper-V, usando un limite massimo calcolato per i gruppi di CPU. Il limite massimo 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 della CPU degli LP". Il budget del gruppo è condiviso, quindi se una sola macchina virtuale fosse attiva, potrebbe usare l'intera allocazione del CPU del gruppo per se stessa.
Il limite di gruppo della CPU viene calcolato come G = n x C, dove:
- G è la quantità di LP host da 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
Ad esempio, si consideri un gruppo di CPU configurato con 4 processori logici (LP) e un limite del 50%.
- G = n * C
- G = 4 * 50%
- G = 2 LP di tempo della CPU per l'intero gruppo
In questo esempio, al gruppo di CPU G vengono assegnati 2 LP di tempo della CPU.
Si noti che il limite del gruppo si applica indipendentemente dal numero di macchine virtuali o di processori virtuali associati al gruppo e dallo stato (ad esempio, arrestato o avviato) 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, che cambierà con il numero di macchine virtuali associate al gruppo di CPU. Pertanto, man mano che le macchine virtuali vengono associate o non associate da un gruppo di CPU, il limite complessivo del gruppo di CPU deve essere riadattato e impostato per mantenere il limite massimo per macchina virtuale desiderata. L'amministratore host della macchina virtuale o il livello del software di gestione della virtualizzazione è responsabile della gestione dei limiti di gruppo, in base alle esigenze di ottenere l'allocazione desiderata delle risorse CPU per macchina virtuale.
Esempi di classi di servizio
Vediamo alcuni semplici esempi. Per iniziare, si supponga che l'amministratore host Hyper-V voglia supportare due livelli di servizio per le macchine virtuali guest:
Un livello "C" di fascia bassa. A questo livello verrà assegnato il 10% delle risorse di calcolo dell'intero host.
Un livello "B" di media grandezza. A questo livello viene assegnato il 50% delle risorse di calcolo dell'intero host.
A questo punto dell’esempio si asserisce che non sono in uso altri controlli sulle risorse della CPU, come ad esempio i limiti, i pesi e le riserve delle singole macchine virtuali. Tuttavia, i limiti delle singole macchine virtuali sono importanti, come si vedrà 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 del gruppo al 50%:
- G = n * C
- G = 8 * 50%
- G = 4 LP di tempo della 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, ovvero 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 viene suddivisa in modo uniforme tra tutte le macchine virtuali. Nel gruppo B sono presenti un totale di 2 macchine virtuali, quindi ogni macchina virtuale ora ottiene la metà del 50% del totale del gruppo B, il 25% ciascuno, o l'equivalente di 2 LP di tempo di calcolo.
Impostazione dei limiti di CPU in singole macchine virtuali
Oltre al limite di gruppo, ogni macchina virtuale può avere un "limite di macchina virtuale" individuale. I controlli delle risorse CPU per macchina virtuale, inclusi il limite massimo, il peso e la riserva della CPU, fanno parte di Hyper-V fin dalla sua introduzione. Se combinato con un limite di gruppo, un limite di macchina virtuale specifica la quantità massima di CPU che ogni VP può ottenere, anche se il gruppo ha risorse CPU disponibili.
Ad esempio, l'amministratore host potrebbe voler inserire un limite del 10% alle macchine virtuali "C". In questo modo, anche se la maggior parte dei VP "C" sono inattivi, ogni VP non potrebbe mai ottenere più del 10%. Senza un limite per le macchine virtuali, le macchine virtuali "C" potrebbero ottenere opportunisticamente prestazioni superiori ai livelli consentiti dal loro livello.
Isolamento dei gruppi di macchine virtuali su processori host specifici
Gli amministratori host Hyper-V potrebbero anche voler dedicare risorse di calcolo a una macchina virtuale. Ad esempio, si supponga che l'amministratore voglia offrire una macchina virtuale premium "A" con un limite di classe del 100%. Queste macchine virtuali premium richiedono anche una latenza di pianificazione e il jitter più bassi possibili; ovvero, non possono essere depianificato da nessun'altra macchina virtuale. Per ottenere questa separazione, un gruppo di CPU può anche essere configurato con un mapping di affinità LP specifico.
Ad esempio, per inserire una macchina virtuale "A" nell'host del nostro esempio, l'amministratore dovrebbe creare un nuovo gruppo di CPU e impostare l'affinità del processore del gruppo su un subset degli LP dell'host. I gruppi B e C verrebbero raggruppati con i restanti LP. L'amministratore potrebbe creare una singola macchina virtuale nel gruppo A, che avrebbe accesso esclusivo a tutti gli LP del gruppo A, mentre i gruppi B e C, presumibilmente di livello inferiore, condividerebbero gli LP rimanenti.
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 rigorosamente mappati 1:1 con gli LP del 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 condividono l'esecuzione con i VP radice.
Tuttavia, potrebbe essere consigliabile separare completamente l'attività VP radice da quella VP guest. Si prenda in considerazione l'esempio precedente, in cui viene implementata una macchina virtuale di livello premium "A". Per garantire che i VP della macchina virtuale "A" abbiano la latenza e il "jitter" più bassi possibili, o variazione di schedulazione, è consigliabile eseguirli in un set dedicato di LP e assicurarsi che la radice non venga eseguita in questi LP.
Ciò può essere ottenuto usando una combinazione di configurazione "minroot", che limita l'esecuzione della partizione del sistema operativo host su un subset dei processori logici totali del sistema, insieme a uno o più gruppi di CPU affini.
L'host di virtualizzazione può essere configurato in modo da limitare la partizione dell'host a LP specifici, con uno o più gruppi di CPU affini agli LP rimanenti. In questo modo, le partizioni radice e guest possono essere eseguite su risorse CPU dedicate e completamente isolate, senza condividere la CPU.
Per altre informazioni sulla configurazione "minroot", vedere Gestione delle risorse CPU host Hyper-V.
Uso dello strumento CpuGroups
Ecco alcuni esempi di utilizzo dello 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 precedere il passaggio della riga di comando desiderata.
Individuare la 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 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, multithreading abilitato e configurato per abilitare Minroot con 8 VP root, 4 da ogni nodo NUMA. Gli LP che hanno VP radice hanno un RootVpIndex >= 0; gli LP con un RootVpIndex pari a -1 non sono disponibili per la partizione radice, ma sono comunque gestiti dall'hypervisor ed eseguiranno 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
Qui vengono elencati tutti i gruppi di CPU nell'host corrente, il relativo GroupId, il tetto di CPU del gruppo e gli indici degli LP assegnati a quel gruppo.
Si noti che i valori validi del limite di CPU sono compresi nell'intervallo [0, 65536] e che 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 il 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 del 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
Ora verrà visualizzato 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 massimo del gruppo CPU al 50%
Esempio 50 - Impostare il limite massimo del gruppo CPU al 50%.
C:\vm\tools>CpuGroups.exe SetGroupProperty /GroupId:36AB08CB-3A76-4B38-992E-000000000001 /CpuCap:32768
A questo punto sarà 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 - Annullare l’associazione di una macchina virtuale dal gruppo di CPU
Per rimuovere una macchina virtuale da un gruppo di CPU, impostare 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 nessun gruppo di CPU esistente, altrimenti 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 si trovi 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 CPU non vuoto
È possibile eliminare solo i gruppi di CPU vuoti, ossia quelli 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 quel gruppo e quindi eliminare il gruppo.
Prima di tutto, enumeriamo le macchine virtuali del 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. Si rimuoverà la macchina virtuale G1 dal gruppo impostando l'ID del 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 in modo sicuro.
C:\vm\tools>CpuGroups.exe DeleteGroup /GroupId:36ab08cb-3a76-4b38-992e-000000000001
E confermare che il gruppo è scomparso.
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