Funzionamento della rete accelerata in VM Linux e FreeBSD
Quando viene creata una macchina virtuale (VM) in Azure, viene creata un'interfaccia di rete sintetica per ogni scheda di interfaccia di rete virtuale nella relativa configurazione. L'interfaccia sintetica è un dispositivo VMbus e usa il driver netvsc. Pacchetti di rete che usano questa interfaccia sintetica passano attraverso il commutatore virtuale nell'host di Azure e nella rete fisica del data center.
Se la macchina virtuale è configurata con rete accelerata, viene creata una seconda interfaccia di rete per ogni scheda di interfaccia di rete virtuale configurata. La seconda interfaccia è una funzione virtuale SR-IOV (VF) offerta dalla scheda di interfaccia di rete fisica nell'host di Azure. L'interfaccia VF viene visualizzata nel guest Linux come dispositivo PCI. Usa il driver Mellanox mlx4 o mlx5 in Linux, perché gli host di Azure usano schede di interfaccia di rete fisiche da Mellanox.
La maggior parte dei pacchetti di rete passa direttamente tra il guest Linux e la scheda di interfaccia di rete fisica senza attraversare il commutatore virtuale o qualsiasi altro software in esecuzione nell'host. A causa dell'accesso diretto all'hardware, la latenza di rete è inferiore e meno tempo cpu viene usato per elaborare i pacchetti di rete, rispetto all'interfaccia sintetica.
Diversi host di Azure usano modelli diversi di scheda di interfaccia di rete fisica Mellanox. Linux determina automaticamente se usare il driver mlx4 o mlx5. L'infrastruttura di Azure controlla la posizione della macchina virtuale nell'host di Azure. Senza alcuna opzione del cliente per specificare la scheda di interfaccia di rete fisica usata da una distribuzione di vm, le macchine virtuali devono includere entrambi i driver. Se una macchina virtuale viene arrestata o deallocata e quindi riavviata, potrebbe essere ridistribuita nell'hardware con un modello diverso di scheda di interfaccia di rete fisica Mellanox. Pertanto, potrebbe usare l'altro driver Mellanox.
Se un'immagine di macchina virtuale non include un driver per la scheda di interfaccia di rete fisica Mellanox, le funzionalità di rete continuano a funzionare a velocità più lente della scheda di interfaccia di rete virtuale. Il portale, l'interfaccia della riga di comando di Azure e Azure PowerShell visualizzano la funzionalità Rete accelerata come abilitata.
FreeBSD offre lo stesso supporto per la rete accelerata di Linux quando è in esecuzione in Azure. La parte restante di questo articolo descrive Linux e usa esempi di Linux, ma la stessa funzionalità è disponibile in FreeBSD.
Nota
Questo articolo contiene riferimenti al termine slave, che Microsoft non usa più. Quando questo termine viene rimosso dal software, verrà rimosso da questo articolo.
Legame
L'interfaccia di rete sintetica e l'interfaccia VF vengono abbinate automaticamente e fungono da singola interfaccia nella maggior parte degli aspetti usati dalle applicazioni. Il driver netvsc esegue il legame. A seconda della distribuzione linux, le regole e gli script udev possono aiutare a denominare l'interfaccia VF e a configurare la rete.
Se la macchina virtuale è configurata con più schede di interfaccia di rete virtuali, l'host di Azure fornisce un numero di serie univoco per ognuno di essi. Consente a Linux di eseguire l'associazione corretta di interfacce sintetiche e VF per ogni scheda di interfaccia di rete virtuale.
Le interfacce sintetiche e VF hanno lo stesso indirizzo MAC. Insieme, costituiscono una singola scheda di interfaccia di rete dal punto di vista di altre entità di rete che scambiano pacchetti con la scheda di interfaccia di rete virtuale nella macchina virtuale. Altre entità non eseguono alcuna azione speciale a causa dell'esistenza dell'interfaccia sintetica e dell'interfaccia VF.
Entrambe le interfacce sono visibili tramite il ifconfig
comando o ip addr
in Linux. Di seguito è riportato un esempio ifconfig
di output:
U1804:~$ ifconfig
enP53091s1np0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 00:0d:3a:f5:76:bd txqueuelen 1000 (Ethernet)
RX packets 365849 bytes 413711297 (413.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9447684 bytes 2206536829 (2.2 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.19.4 netmask 255.255.255.0 broadcast 10.1.19.255
inet6 fe80::20d:3aff:fef5:76bd prefixlen 64 scopeid 0x20<link>
ether 00:0d:3a:f5:76:bd txqueuelen 1000 (Ethernet)
RX packets 8714212 bytes 4954919874 (4.9 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9103233 bytes 2183731687 (2.1 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
L'interfaccia sintetica ha sempre un nome nel formato eth\<n\>
. A seconda della distribuzione linux, l'interfaccia VF potrebbe avere un nome nel formato eth\<n\>
. Oppure potrebbe avere un nome diverso sotto forma di a causa di enP\<n\>
una regola udev che rinomina.
È possibile determinare se una particolare interfaccia è l'interfaccia sintetica o l'interfaccia VF usando la riga di comando della shell che mostra il driver di dispositivo usato dall'interfaccia:
$ ethtool -i <interface name> | grep driver
Se il driver è hv_netvsc
, si tratta dell'interfaccia sintetica. L'interfaccia VF ha un nome di driver che contiene "mlx". L'interfaccia VF è anche identificabile perché il relativo flags
campo include SLAVE
. Questo flag indica che è sotto il controllo dell'interfaccia sintetica con lo stesso indirizzo MAC.
Gli indirizzi IP vengono assegnati solo all'interfaccia sintetica. L'output di ifconfig
o ip addr
mostra anche questa distinzione.
Utilizzo applicazioni
Le applicazioni devono interagire solo con l'interfaccia sintetica, proprio come in qualsiasi altro ambiente di rete. I pacchetti di rete in uscita vengono passati dal driver netvsc al driver VF e quindi trasmessi tramite l'interfaccia VF.
I pacchetti in ingresso vengono ricevuti ed elaborati nell'interfaccia VF prima di essere passati all'interfaccia sintetica. Le eccezioni sono pacchetti TCP SYN in ingresso e pacchetti broadcast/multicast elaborati solo dall'interfaccia sintetica.
È possibile verificare che i pacchetti vengano trasmessi sull'interfaccia VF dall'output di ethtool -S eth\<n\>
. Le righe di output che contengono vf
mostrano il traffico sull'interfaccia VF. Ad esempio:
U1804:~# ethtool -S eth0 | grep ' vf_'
vf_rx_packets: 111180
vf_rx_bytes: 395460237
vf_tx_packets: 9107646
vf_tx_bytes: 2184786508
vf_tx_dropped: 0
Se questi contatori aumentano all'esecuzione successiva del ethtool
comando, il traffico di rete passa attraverso l'interfaccia VF.
È possibile verificare l'esistenza dell'interfaccia VF come dispositivo PCI usando il lspci
comando . Ad esempio, nella macchina virtuale di prima generazione, è possibile ottenere un output simile all'output seguente. Le macchine virtuali di seconda generazione non dispongono dei dispositivi PCI legacy.
U1804:~# lspci
0000:00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) (rev 03)
0000:00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 01)
0000:00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
0000:00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 02)
0000:00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual VGA
cf63:00:02.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function] (rev 80)
In questo esempio, l'ultima riga di output identifica un VF dalla scheda di interfaccia di rete fisica Mellanox ConnectX-4.
Il ethtool -l
comando o ethtool -L
(per ottenere e impostare il numero di code di trasmissione e ricezione) è un'eccezione alle indicazioni per interagire con l'interfaccia eth<n>
. È possibile usare questo comando direttamente sull'interfaccia VF per controllare il numero di code per l'interfaccia VF. Il numero di code per l'interfaccia VF è indipendente dal numero di code per l'interfaccia sintetica.
Interpretazione dei messaggi di avvio
Durante l'avvio, Linux mostra molti messaggi correlati all'inizializzazione e alla configurazione dell'interfaccia VF. Mostra anche informazioni sul legame con l'interfaccia sintetica. Comprendere questi messaggi può essere utile per identificare eventuali problemi nel processo.
Di seguito è riportato un esempio di output del dmesg
comando, tagliato in base alle righe rilevanti per l'interfaccia VF. A seconda della versione e della distribuzione del kernel Linux nella macchina virtuale, i messaggi potrebbero variare leggermente, ma il flusso complessivo è lo stesso.
[ 2.327663] hv_vmbus: registering driver hv_netvsc
[ 3.918902] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added
Il driver netvsc per eth0
è stato registrato.
[ 6.944883] hv_vmbus: registering driver hv_pci
Il driver PCI virtuale VMbus è stato registrato. Questo driver fornisce servizi PCI di base in una macchina virtuale Linux in Azure. È necessario registrarlo prima che l'interfaccia VF possa essere rilevata e configurata.
[ 6.945132] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI VMBus probing: Using version 0x10002
[ 6.947953] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI host bridge to bus cf63:00
[ 6.947955] pci_bus cf63:00: root bus resource [mem 0xfe0000000-0xfe00fffff window]
[ 6.948805] pci cf63:00:02.0: [15b3:1016] type 00 class 0x020000
[ 6.957487] pci cf63:00:02.0: reg 0x10: [mem 0xfe0000000-0xfe00fffff 64bit pref]
[ 7.035464] pci cf63:00:02.0: enabling Extended Tags
[ 7.040811] pci cf63:00:02.0: 0.000 Gb/s available PCIe bandwidth, limited by Unknown x0 link at cf63:00:02.0 (capable of 63.008 Gb/s with 8.0 GT/s PCIe x8 link)
[ 7.041264] pci cf63:00:02.0: BAR 0: assigned [mem 0xfe0000000-0xfe00fffff 64bit pref]
È stato rilevato il dispositivo PCI con il GUID elencato (assegnato dall'host di Azure). Viene assegnato un ID di dominio PCI (0xcf63 in questo caso) in base al GUID. L'ID di dominio PCI deve essere univoco in tutti i dispositivi PCI disponibili nella macchina virtuale. Questo requisito di univocità si estende ad altre interfacce Mellanox VF, GPU, dispositivi NVMe e altri dispositivi che potrebbero essere presenti nella macchina virtuale.
[ 7.128515] mlx5_core cf63:00:02.0: firmware version: 14.25.8362
[ 7.139925] mlx5_core cf63:00:02.0: handle_hca_cap:524:(pid 12): log_max_qp value in current profile is 18, changing it to HCA capability limit (12)
[ 7.342391] mlx5_core cf63:00:02.0: MLX5E: StrdRq(0) RqSz(1024) StrdSz(256) RxCqeCmprss(0)
È stato rilevato un VF Mellanox che usa il driver mlx5. Il driver mlx5 inizia l'inizializzazione del dispositivo.
[ 7.465085] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF registering: eth1
[ 7.465119] mlx5_core cf63:00:02.0 eth1: joined to eth0
L'interfaccia sintetica corrispondente che usa il driver netvsc ha rilevato un VF corrispondente. Il driver mlx5 riconosce che è stato legato all'interfaccia sintetica.
[ 7.466064] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[ 7.480575] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[ 7.480651] mlx5_core cf63:00:02.0 enP53091s1np0: renamed from eth1
Il kernel Linux inizialmente ha denominato l'interfaccia eth1
VF. Una regola udev l'ha rinominata per evitare confusione con i nomi assegnati alle interfacce sintetiche.
[ 8.087962] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
L'interfaccia Mellanox VF è ora attiva e attiva.
[ 8.090127] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
[ 9.654979] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
Questi messaggi indicano che il percorso dati per la coppia associata è passato all'uso dell'interfaccia VF. Circa 1,6 secondi dopo, torna all'interfaccia sintetica. Tali commutatori possono verificarsi due o tre volte durante il processo di avvio e sono comportamenti normali durante l'inizializzazione della configurazione.
[ 9.909128] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
[ 9.910595] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
[ 11.411194] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
[ 11.532147] mlx5_core cf63:00:02.0 enP53091s1np0: Disabling LRO, not supported in legacy RQ
[ 11.731892] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
[ 11.733216] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
Il messaggio finale indica che il percorso dati è passato all'uso dell'interfaccia VF. È previsto durante il normale funzionamento della macchina virtuale.
Manutenzione host di Azure
Durante la manutenzione dell'host di Azure, tutte le interfacce VF potrebbero essere rimosse temporaneamente dalla macchina virtuale. Al termine della manutenzione, le interfacce VF vengono aggiunte nuovamente alla macchina virtuale. Il normale funzionamento continua. Mentre la macchina virtuale funziona senza le interfacce VF, il traffico di rete continua a fluire attraverso l'interfaccia sintetica senza interruzioni nelle applicazioni.
In questo contesto, la manutenzione host di Azure potrebbe includere l'aggiornamento dei componenti dell'infrastruttura di rete di Azure o l'aggiornamento completo del software hypervisor host di Azure. Tali eventi di manutenzione si verificano a intervalli di tempo che dipendono dalle esigenze operative dell'infrastruttura di Azure. Questi eventi si verificano in genere più volte nel corso di un anno.
Il passaggio automatico tra l'interfaccia VF e l'interfaccia sintetica garantisce che gli eventi di manutenzione non disturbino i carichi di lavoro se le applicazioni interagiscono solo con l'interfaccia sintetica. Le latenze e il carico della CPU potrebbero essere più elevati durante questi periodi a causa dell'uso dell'interfaccia sintetica. La durata di tali periodi è in genere di circa 30 secondi, ma a volte può essere di qualche minuto.
La rimozione e la lettura dell'interfaccia VF durante un evento di manutenzione sono visibili nell'output dmesg
della macchina virtuale. Ecco l'output tipico:
[ 8160.911509] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
[ 8160.912120] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF unregistering: enP53091s1np0
[ 8162.020138] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 removed
Il percorso dei dati è stato disattivato dall'interfaccia VF e l'interfaccia VF è stata annullata la registrazione. A questo punto, Linux ha rimosso tutte le conoscenze dell'interfaccia VF e funziona come se la rete accelerata non fosse abilitata.
[ 8225.557263] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added
[ 8225.557867] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI VMBus probing: Using version 0x10002
[ 8225.566794] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI host bridge to bus cf63:00
[ 8225.566797] pci_bus cf63:00: root bus resource [mem 0xfe0000000-0xfe00fffff window]
[ 8225.571556] pci cf63:00:02.0: [15b3:1016] type 00 class 0x020000
[ 8225.584903] pci cf63:00:02.0: reg 0x10: [mem 0xfe0000000-0xfe00fffff 64bit pref]
[ 8225.662860] pci cf63:00:02.0: enabling Extended Tags
[ 8225.667831] pci cf63:00:02.0: 0.000 Gb/s available PCIe bandwidth, limited by Unknown x0 link at cf63:00:02.0 (capable of 63.008 Gb/s with 8.0 GT/s PCIe x8 link)
[ 8225.667978] pci cf63:00:02.0: BAR 0: assigned [mem 0xfe0000000-0xfe00fffff 64bit pref]
Quando l'interfaccia VF viene letta dopo il completamento della manutenzione, viene rilevato un nuovo dispositivo PCI con il GUID specificato. Viene assegnato lo stesso ID di dominio PCI (0xcf63) di prima. La gestione dell'interfaccia VF letta è simile alla gestione durante l'avvio iniziale.
[ 8225.679672] mlx5_core cf63:00:02.0: firmware version: 14.25.8362
[ 8225.888476] mlx5_core cf63:00:02.0: MLX5E: StrdRq(0) RqSz(1024) StrdSz(256) RxCqeCmprss(0)
[ 8226.021016] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF registering: eth1
[ 8226.021058] mlx5_core cf63:00:02.0 eth1: joined to eth0
[ 8226.021968] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[ 8226.026631] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[ 8226.026699] mlx5_core cf63:00:02.0 enP53091s1np0: renamed from eth1
[ 8226.265256] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
Il driver mlx5 inizializza l'interfaccia VF e l'interfaccia è ora funzionale. L'output è simile all'output durante l'avvio iniziale.
[ 8226.267380] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
Il percorso dei dati è stato reimpostato sull'interfaccia VF.
Disabilitazione o abilitazione della rete accelerata in una macchina virtuale non in esecuzione
È possibile disabilitare o abilitare la rete accelerata in una scheda di interfaccia di rete virtuale in una macchina virtuale non in esecuzione usando l'interfaccia della riga di comando di Azure. Ad esempio:
$ az network nic update --name u1804895 --resource-group testrg --accelerated-network false
La disabilitazione della rete accelerata abilitata nella macchina virtuale guest genera un dmesg
output. Equivale a quando l'interfaccia VF viene rimossa per la manutenzione dell'host di Azure. L'abilitazione della rete accelerata produce lo stesso dmesg
output di quando l'interfaccia VF viene letta dopo la manutenzione dell'host di Azure.
È possibile usare questi comandi dell'interfaccia della riga di comando di Azure per simulare la manutenzione dell'host di Azure. È quindi possibile verificare che le applicazioni non dipendono in modo errato dall'interazione diretta con l'interfaccia VF.
Passaggi successivi
- Informazioni su come creare una macchina virtuale con rete accelerata in PowerShell.
- Informazioni su come creare una macchina virtuale con rete accelerata usando l'interfaccia della riga di comando di Azure.
- Migliorare la latenza con un gruppo di posizionamento di prossimità di Azure.