Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 SR-IOV (VF) 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.
Observação
Este artigo contém referências ao termo escravo, um termo que a Microsoft já não utiliza. Quando este termo for removido do software, iremos removê-lo deste artigo.
Aderência
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 configurar a VM com múltiplas NICs virtuais, o host do Azure fornece um número de série único para cada uma. Este número de série permite ao Linux emparelhar corretamente as interfaces sintética e VF para cada NIC 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.
Pode determinar se uma determinada interface é sintética ou VF usando um comando shell que mostra qual o driver de dispositivo que a interface utiliza:
$ 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 estes contadores aumentarem com execuções sucessivas do ethtool comando, o tráfego de rede flui pela interface VF.
Você pode verificar a existência da interface VF como um dispositivo PCI usando o lspci comando. Por exemplo, na VM da Geração 1, pode obter uma saída semelhante à seguinte. (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 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 receção) é uma exceção à orientação para interagir com a interface eth<n>. 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.
Configuração do Linux rp_filter ao utilizar rede acelerada
Quando ativa a Rede Acelerada, a VM pode receber tráfego na interface VF, enquanto o estado de encaminhamento do Linux e a configuração de IP estão associados à interface sintética. Durante o funcionamento normal e em eventos de manutenção do host (quando o tráfego pode alternar entre caminhos VF e sintéticos), este comportamento pode parecer assimétrico do ponto de vista da filtragem de caminho inverso.
Se definires rp_filter para modo estrito (1), o Linux pode deixar cair pacotes legítimos se a interface de entrada não for a que o Linux considera o melhor caminho inverso. Para reduzir quedas inesperadas de pacotes enquanto se mantém a validação da fonte, defina rp_filter para modo frouxo (2).
No Linux, os rp_filter valores são:
-
0: Desativado -
1: Modo estrito -
2: Modo solto
Para verificar os valores atuais:
$ sysctl net.ipv4.conf.all.rp_filter
$ sysctl net.ipv4.conf.default.rp_filter
$ sysctl net.ipv4.conf.eth0.rp_filter
Substitui eth0 pelo nome da interface sintética se a tua VM usar um esquema de nomes diferente.
Para ativar o modo solto imediatamente:
$ sudo sysctl -w net.ipv4.conf.all.rp_filter=2
$ sudo sysctl -w net.ipv4.conf.default.rp_filter=2
Para persistir a definição durante os reinícios, adicione este conteúdo a um ficheiro de configuração sysctl (por exemplo, /etc/sysctl.d/99-azure-an-rpfilter.conf):
net.ipv4.conf.all.rp_filter=2
net.ipv4.conf.default.rp_filter=2
Depois aplica as definições persistentes:
$ sudo sysctl --system
Para a semântica detalhada rp_filter, veja:
- Referência de sysctl IP do kernel Linux (
rp_filter): https://docs.kernel.org/networking/ip-sysctl.html - RFC 3704 (Encaminhamento por Caminho Inverso Estrito e Flexível): https://www.rfc-editor.org/rfc/rfc3704
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, cortado apenas para as linhas 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 registado.
[ 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 em funcionamento.
[ 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 alternaçõ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 saída de dmesg na VM mostra a remoção e a nova adição da interface VF durante um evento de manutenção. 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 foi desregistrada. 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 o processo adiciona novamente a interface VF após a manutenção estar concluída, deteta um novo dispositivo PCI com o GUID especificado. Atribui o mesmo ID de domínio PCI (0xcf63) de antes. O manuseamento da interface VF readicionada é semelhante ao manuseamento durante o arranque 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 comutado 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. Ao habilitar a Rede Acelerada, produz-se a mesma dmesg saída como quando a interface VF é novamente adicionada após a manutenção do host no 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.
Observação
Desativar a Rede Acelerada em tamanhos de VM onde a Rede Acelerada está listada como 'obrigatória' não tem qualquer efeito. Estes tamanhos receberão a interface VF independentemente do estado da Rede Acelerada associada à NIC virtual.
Próximos passos
- Saiba como criar uma VM com Rede Acelerada no PowerShell.
- Saiba como criar uma VM com Rede Acelerada usando a CLI do Azure.
- Melhore a latência com um grupo de posicionamento de proximidade do Azure.