Como funciona a Rede Acelerada nas VMs Linux e FreeBSD

Quando uma máquina virtual (VM) é criada no Azure, uma interface de rede sintética é criada para cada NIC virtual em sua configuração. A interface sintética é um dispositivo VMbus e usa o driver netvsc. Os pacotes de rede que usam essa interface sintética fluem através do comutador virtual no host do Azure e para a rede física do datacenter.

Se a VM estiver configurada com Rede Acelerada, uma segunda interface de rede será criada para cada NIC virtual configurada. A segunda interface é uma função virtual (VF) SR-IOV oferecida pela NIC da rede física no host do Azure. A interface VF aparece no convidado Linux como um dispositivo PCI. Ele usa o driver mlx4 ou mlx5 do Mellanox no Linux, porque os hosts do Azure usam NICs físicas do Mellanox.

A maioria dos pacotes de rede vai diretamente entre o convidado Linux e a NIC física sem atravessar o comutador virtual ou qualquer outro software que seja executado no host. Devido ao acesso direto ao hardware, a latência da rede é menor e menos tempo de CPU é usado para processar pacotes de rede, quando comparado com a interface sintética.

Diferentes hosts do Azure usam modelos diferentes de NIC física Mellanox. O Linux determina automaticamente se deve usar o driver mlx4 ou mlx5. A infraestrutura do Azure controla o posicionamento da VM no host do Azure. Sem opção do cliente para especificar qual NIC física uma implantação de VM usa, as VMs devem incluir ambos os drivers. Se uma VM for interrompida ou desalocada e, em seguida, reiniciada, ela poderá ser reimplantada em hardware com um modelo diferente de NIC física Mellanox. Portanto, ele pode usar o outro driver Mellanox.

Se uma imagem de VM não incluir um driver para a NIC física Mellanox, os recursos de rede continuarão a funcionar nas velocidades mais lentas da NIC virtual. O portal, a CLI do Azure e o Azure PowerShell exibem o recurso Rede Acelerada como habilitado.

O FreeBSD fornece o mesmo suporte para Rede Acelerada que o Linux quando está sendo executado no Azure. O restante deste artigo descreve o Linux e usa exemplos do Linux, mas a mesma funcionalidade está disponível no FreeBSD.

Nota

Este artigo poderá conter referências ao termo slave (secundário), um termo que a Microsoft já não utiliza. Quando este termo for removido do software, iremos removê-lo deste artigo.

Colagem

A interface de rede sintética e a interface VF são emparelhadas automaticamente e atuam como uma interface única na maioria dos aspetos usados pelos aplicativos. O driver netvsc faz a ligação. Dependendo da distribuição Linux, as regras e scripts do udev podem ajudar a nomear a interface VF e a configurar a rede.

Se a VM estiver configurada com várias NICs virtuais, o host do Azure fornecerá um número de série exclusivo para cada uma. Ele permite que o Linux faça o emparelhamento adequado de interfaces sintéticas e VF para cada placa de rede virtual.

As interfaces sintética e VF têm o mesmo endereço MAC. Juntos, eles constituem uma única NIC do ponto de vista de outras entidades de rede que trocam pacotes com a NIC virtual na VM. Outras entidades não tomam nenhuma ação especial devido à existência da interface sintética e da interface VF.

Ambas as interfaces são visíveis através do ifconfig comando ou ip addr no Linux. Aqui está um exemplo ifconfig de saída:

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

A interface sintética sempre tem um nome no formato eth\<n\>. Dependendo da distribuição Linux, a interface VF pode ter um nome no formato eth\<n\>. Ou pode ter um nome diferente na forma de enP\<n\> por causa de uma regra udev que faz renomeação.

Você pode determinar se uma interface específica é a interface sintética ou a interface VF usando a linha de comando do shell que mostra o driver de dispositivo que a interface usa:

$ ethtool -i <interface name> | grep driver

Se o driver for hv_netvsc, é a interface sintética. A interface VF tem um nome de driver que contém "mlx". A interface VF também é identificável porque seu flags campo inclui SLAVE. Esse sinalizador indica que está sob o controle da interface sintética que tem o mesmo endereço MAC.

Os endereços IP são atribuídos apenas à interface sintética. A saída de ifconfig ou ip addr também mostra essa distinção.

Uso do aplicativo

Os aplicativos devem interagir apenas com a interface sintética, assim como em qualquer outro ambiente de rede. Os pacotes de rede de saída são passados do driver netvsc para o driver VF e, em seguida, transmitidos através da interface VF.

Os pacotes recebidos são recebidos e processados na interface VF antes de serem passados para a interface sintética. As exceções são pacotes TCP SYN de entrada e pacotes de difusão/multicast processados apenas pela interface sintética.

Você pode verificar se os pacotes estão fluindo pela interface VF a partir da saída do ethtool -S eth\<n\>. As linhas de saída que contêm vf mostram o tráfego na interface VF. Por exemplo:

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 esses contadores estiverem aumentando na execução sucessiva do comando, o ethtool tráfego de rede estará fluindo pela interface VF.

Você pode verificar a existência da interface VF como um dispositivo PCI usando o lspci comando. Por exemplo, na VM de Geração 1, você pode obter uma saída semelhante à saída a seguir. (As VMs de 2ª geração não têm os dispositivos PCI herdados.)

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)

Neste exemplo, a última linha de saída identifica um VF da placa de rede física Mellanox ConnectX-4.

O ethtool -l comando or ethtool -L (para obter e definir o número de filas de transmissão e receção) é uma exceção à orientação para interagir com a eth<n> interface. Você pode usar esse comando diretamente na interface VF para controlar o número de filas para a interface VF. O número de filas para a interface VF é independente do número de filas para a interface sintética.

Interpretando mensagens de inicialização

Durante a inicialização, o Linux mostra muitas mensagens relacionadas à inicialização e configuração da interface VF. Ele também mostra informações sobre a ligação com a interface sintética. Compreender essas mensagens pode ser útil para identificar quaisquer problemas no processo.

Aqui está um exemplo de saída do dmesg comando, cortada apenas para as linhas que são relevantes para a interface VF. Dependendo da versão do kernel Linux e da distribuição em sua VM, as mensagens podem variar um pouco, mas o fluxo geral é o mesmo.

[    2.327663] hv_vmbus: registering driver hv_netvsc
[    3.918902] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added

O driver netvsc para eth0 foi registrado.

[    6.944883] hv_vmbus: registering driver hv_pci

O driver PCI virtual VMbus foi registrado. Este driver fornece serviços PCI principais em uma VM Linux no Azure. Você deve registrá-lo antes que a interface VF possa ser detetada e configurada.

[    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]

O dispositivo PCI com o GUID listado (atribuído pelo host do Azure) foi detetado. É atribuído um ID de domínio PCI (0xcf63 neste caso) com base no GUID. O ID de domínio PCI deve ser exclusivo em todos os dispositivos PCI disponíveis na VM. Esse requisito de exclusividade abrange outras interfaces Mellanox VF, GPUs, dispositivos NVMe e outros dispositivos que podem estar presentes na VM.

[    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)

Foi detetado um Mellanox VF que usa o driver mlx5. O driver mlx5 começa sua inicialização do 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

A interface sintética correspondente que está usando o driver netvsc detetou um VF correspondente. O driver mlx5 reconhece que foi ligado com a interface sintética.

[    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

O kernel Linux inicialmente nomeou a interface eth1VF . Uma regra de udev renomeou-a para evitar confusão com os nomes dados às interfaces sintéticas.

[    8.087962] mlx5_core cf63:00:02.0 enP53091s1np0: Link up

A interface Mellanox VF está agora ativa e ativa.

[    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

Essas mensagens indicam que o caminho de dados para o par ligado mudou para usar a interface VF. Cerca de 1,6 segundos depois, ele volta para a interface sintética. Essas opções podem ocorrer duas ou três vezes durante o processo de inicialização e são um comportamento normal à medida que a configuração é inicializada.

[    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

A mensagem final indica que o caminho de dados mudou para usar a interface VF. É esperado durante a operação normal da VM.

Serviço de host do Azure

Durante a manutenção de host do Azure, todas as interfaces VF podem ser temporariamente removidas da VM. Quando a manutenção é concluída, as interfaces VF são adicionadas de volta à VM. A operação normal continua. Enquanto a VM está operando sem as interfaces VF, o tráfego de rede continua a fluir através da interface sintética sem qualquer interrupção para os aplicativos.

Nesse contexto, o serviço de host do Azure pode incluir a atualização dos componentes da infraestrutura de rede do Azure ou a atualização completa do software do hipervisor de host do Azure. Esses eventos de manutenção ocorrem em intervalos de tempo que dependem das necessidades operacionais da infraestrutura do Azure. Estes eventos normalmente acontecem várias vezes ao longo de um ano.

A comutação automática entre a interface VF e a interface sintética garante que os eventos de manutenção não perturbem as cargas de trabalho se os aplicativos interagirem apenas com a interface sintética. As latências e a carga da CPU podem ser maiores durante esses períodos devido ao uso da interface sintética. A duração desses períodos é tipicamente de cerca de 30 segundos, mas às vezes pode ser tão longa quanto alguns minutos.

A remoção e readição da interface VF durante um evento de manutenção é visível na dmesg saída na VM. Aqui está a saída típica:

[   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

O caminho de dados foi trocado da interface VF e a interface VF não foi registrada. Neste ponto, o Linux removeu todo o conhecimento da interface VF e está operando como se a Rede Acelerada não estivesse habilitada.

[   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 a interface VF é readicionada após a conclusão da manutenção, um novo dispositivo PCI com o GUID especificado é detetado. É atribuído o mesmo ID de domínio PCI (0xcf63) que antes. A manipulação da interface VF readd é como a manipulação durante a inicialização inicial.

[   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

O driver mlx5 inicializa a interface VF e a interface agora está funcional. A saída é semelhante à saída durante a inicialização inicial.

[   8226.267380] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0

O caminho de dados foi alternado de volta para a interface VF.

Desativando ou habilitando a Rede Acelerada em uma VM não executada

Você pode desabilitar ou habilitar a Rede Acelerada em uma NIC virtual em uma VM não em execução usando a CLI do Azure. Por exemplo:

$ az network nic update --name u1804895 --resource-group testrg --accelerated-network false

A desativação da Rede Acelerada habilitada na VM convidada produz uma dmesg saída. É o mesmo que quando a interface VF é removida para o serviço de host do Azure. A habilitação da Rede Acelerada produz a mesma dmesg saída de quando a interface VF é readicionada após a manutenção do host do Azure.

Você pode usar esses comandos da CLI do Azure para simular o serviço de host do Azure. Em seguida, você pode verificar se seus aplicativos não dependem incorretamente da interação direta com a interface VF.

Próximos passos