Compartilhar via


Como a rede acelerada funciona em VMs Linux e FreeBSD

Quando uma VM (máquina virtual) é 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 pelo comutador virtual no host do Azure e para a rede física do datacenter.

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

A maioria dos pacotes de rede vai diretamente entre o convidado do Linux e o NIC físico sem percorrer o comutador virtual ou qualquer outro software executado no host. Devido ao acesso direto ao hardware, a latência de rede é menor e menos tempo de CPU é usado para processar os pacotes de rede, em comparação com a interface sintética.

Diferentes hosts do Azure usam modelos diferentes de NIC físico 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 a opção do cliente de especificar qual NIC física uma implantação de VM usa, as VMs devem incluir os dois drivers. Se uma VM for interrompida ou desalocada e depois reiniciada, ela poderá ser reimplantada em um hardware com um modelo diferente de NIC física da Mellanox. Portanto, ela pode usar o outro driver Mellanox.

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

O FreeBSD oferece o mesmo suporte à Rede Acelerada que o Linux durante a execução no Azure. O restante deste artigo descreve o Linux e usa exemplos do Linux, mas a mesma funcionalidade está disponível no FreeBSD.

Observação

Este artigo contém referências ao termo servidor subordinado, um termo que a Microsoft não usa mais. Quando esse termo for removido do software, também o removeremos deste artigo.

Ligação

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

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

As interfaces sintética e de VF têm o mesmo endereço MAC. Juntas, elas 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 têm nenhuma ação especial devido à existência da interface sintética e da interface de VF.

Ambas as interfaces são visíveis por meio dos comandos ifconfig ou ip addr no Linux. Veja um exemplo de saída ifconfig.

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 do Linux, a interface de VF pode ter um nome no formato eth\<n\>. Ou ele pode ter um nome diferente na forma de enP\<n\> devido a uma regra do udev que renomeia.

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

$ ethtool -i <interface name> | grep driver

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

Os endereços IP são atribuídos somente à interface sintética. O resultado 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 da VF e, em seguida, transmitidos por meio da interface de VF.

Os pacotes de entrada são recebidos e processados na interface de 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 que são processados apenas pela interface sintética.

Você pode verificar se os pacotes estão fluindo pela interface VF a partir da saída de ethtool -S eth\<n\>. As linhas de saída que contêm vf mostram o tráfego pela 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 com a execução sucessiva do comando ethtool, o tráfego de rede está fluindo pela interface de VF.

Você pode verificar a existência da interface de VF como um dispositivo PCI usando o comando lspci. Por exemplo, na VM Generation 1, você pode obter uma saída semelhante à seguinte. (As VMs da Generation 2 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 uma VF do NIC físico Mellanox ConnectX-4.

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

Interpretação de mensagens de inicialização

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

Veja um exemplo de saída do comando dmesg, cortado apenas nas linhas que são relevantes para a interface de VF. Dependendo da versão e da distribuição do kernel do Linux 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 de PCI virtual do VMbus foi registrado. Esse driver fornece serviços essenciais de PCI em uma VM do Linux no Azure. É necessário registrá-la antes que a interface de VF possa ser detectada 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 detectado. Ele recebe uma ID de domínio PCI (0xcf63 nesse caso) com base no GUID. A ID de domínio PCI deve ser exclusiva em todos os dispositivos PCI disponíveis na VM. Esse requisito de exclusividade abrange outras interfaces de VF da Mellanox, GPUs, dispositivos NVMe e outros dispositivos que possam 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 detectado um VF da Mellanox que usa o driver mlx5. O driver mlx5 inicializa o 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 detectou um VF correspondente. O driver mlx5 reconhece que foi ligado à 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 do Linux inicialmente nomeou a interface de VF como eth1. Uma regra de udev a renomeou para evitar confusão com os nomes dados para as interfaces sintéticas.

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

A interface de VF Mellanox agora está ligada 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 foi alternado para usar a interface de VF. Cerca de 1,6 segundo depois, ele volta para a interface sintética. Essas trocas 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 alternou para usar a interface de VF. Isso é esperado durante a operação normal da VM.

Manutenção do host do Azure

Durante a manutenção de host do Azure, todas as interfaces de VF podem ser temporariamente removidas da VM. Quando a manutenção for concluída, as interfaces VF serão adicionadas novamente à VM e a operação normal continuará. A operação normal continua. Enquanto a VM está operando sem as interfaces de VF, o tráfego de rede continua fluindo pela interface sintética sem nenhuma interrupção nos aplicativos.

Nesse contexto, a manutençã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. Esses eventos geralmente ocorrem várias vezes ao longo de um ano.

A alternância 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 quando os aplicativos interagem 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 geralmente é de cerca de 30 segundos, mas às vezes pode chegar a alguns minutos.

A remoção e a readição da interface de VF durante um evento de manutenção são visíveis na saída dmesg da VM. Aqui está uma 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 alternado da interface de VF e a interface de VF foi cancelada. Neste ponto, o Linux removeu todo o conhecimento da interface de 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 é adicionada de novo após a conclusão da manutenção, um novo dispositivo PCI com o GUID especificado é detectado. Ele recebe a mesma ID de domínio PCI (0xcf63) que antes. A manipulação de readição da interface de VF é como a da inicialização.

[   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 de VF e a interface agora está funcional. A saída é semelhante à saída durante a inicialização.

[   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 de VF.

Desabilitar ou habilitar a Rede Acelerada em uma VM sem execução

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

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

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

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

Próximas etapas