Partilhar via


Otimizar a largura de banda da rede para máquinas virtuais do Azure

As máquinas virtuais (VMs) do Azure têm configurações de rede padrão que podem ser otimizadas ainda mais para a taxa de transferência da rede. Este artigo descreve como otimizar a taxa de transferência de rede para VMs Windows e Linux, incluindo as principais distribuições, como Ubuntu e Red Hat.

Máquinas virtuais do Windows

Se a sua VM do Windows oferecer suporte a rede acelerada, habilite esse recurso para uma taxa de transferência ideal. Para obter mais informações, consulte Criar uma VM do Windows com rede acelerada.

Para todas as outras VMs do Windows, o uso do RSS (Receive Side Scaling) pode atingir uma taxa de transferência máxima mais alta do que uma VM sem RSS. O RSS pode estar desabilitado por padrão em uma VM do Windows. Para verificar se o RSS está ativado e habilitá-lo, siga estas etapas:

  1. Veja se o RSS está habilitado para um adaptador de rede com o comando Get-NetAdapterRss PowerShell. No exemplo a seguir, a saída retornada do Get-NetAdapterRss RSS não está habilitada.

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : False
    
  2. Para ativar o RSS, introduza o seguinte comando:

    Get-NetAdapter | % {Enable-NetAdapterRss -Name $_.Name}
    

    Este comando não tem uma saída. O comando altera as configurações da placa de interface de rede (NIC). Causa perda temporária de conectividade por cerca de um minuto. Uma caixa de diálogo Reconectando aparece durante a perda de conectividade. A conectividade normalmente é restaurada após a terceira tentativa.

  3. Confirme se o RSS está habilitado na VM inserindo o Get-NetAdapterRss comando novamente. Se bem-sucedida, a saída de exemplo a seguir é retornada:

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : True
    

Máquinas virtuais do Linux

O RSS é sempre habilitado por padrão em uma máquina virtual (VM) Linux no Azure. Os kernels Linux lançados desde outubro de 2017 incluem novas opções de otimizações de rede que permitem que uma VM Linux alcance uma taxa de transferência de rede mais alta.

Habilite a Rede Acelerada do Azure para uma taxa de transferência ideal

O Azure fornece rede acelerada que pode realmente melhorar o desempenho da rede, latência e instabilidade. Existem atualmente duas tecnologias diferentes que são usadas dependendo do tamanho da máquina virtual, Mellanox que está amplamente disponível e MANA que é desenvolvido pela Microsoft.

Kernels otimizados do Azure

Algumas distribuições, como o Ubuntu (Canonical) e o SUSE, têm kernels otimizados para o Azure.

Use o comando a seguir para certificar-se de que você está usando o kernel do Azure, que geralmente tem a azure cadeia de caracteres na nomenclatura.

uname -r

#sample output on Azure kernel on a Ubuntu Linux VM
6.8.0-1017-azure

Outras distribuições Linux

A maioria das distribuições modernas tem melhorias significativas com kernels mais recentes. Verifique a versão atual do kernel para se certificar de que você está executando um kernel mais recente que o 4.19, que inclui algumas grandes melhorias na rede, por exemplo, suporte para o BBR Congestion-Based Congestion Control.

Alcançando velocidades de transferência consistentes em VMs Linux no Azure

As VMs Linux geralmente enfrentam problemas de desempenho de rede, especialmente ao transferir arquivos grandes (1 GB a 50 GB) entre regiões, como a Europa Ocidental e o Oeste dos EUA. Esses problemas são causados por versões mais antigas do kernel, bem como configurações padrão do kernel, configurações padrão de buffer de rede e algoritmos de controle de congestionamento padrão, que resultam em pacotes atrasados, taxa de transferência limitada e uso ineficiente de recursos.

Para obter um desempenho de rede consistente, considere implementar as seguintes otimizações que são comprovadamente eficazes em muitas situações no Azure:

  • Configurações de buffer de rede: ajuste os parâmetros do kernel para maximizar os buffers de memória de leitura e gravação. Adicione estas configurações a /etc/sysctl.d/99-azure-network-buffers.conf:
net.ipv4.tcp_mem = 4096 87380 67108864
net.ipv4.udp_mem = 4096 87380 33554432
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.rmem_default = 33554432
net.core.wmem_default = 33554432
net.ipv4.udp_wmem_min = 16384
net.ipv4.udp_rmem_min = 16384
net.core.wmem_max = 134217728
net.core.rmem_max = 134217728
net.core.busy_poll = 50
net.core.busy_read = 50
  • Congestion-Based Controle de congestionamento para kernels 4.19 e superiores: Habilitar o controle de congestionamento BBR (restrição de largura de banda e tempo de propagação de ida e volta) pode frequentemente resultar em uma melhor taxa de transferência. Adicione esta configuração a /etc/sysctl.d/99-azure-congestion-control.conf:
net.ipv4.tcp_congestion_control = bbr 
  • Parâmetros TCP extras que geralmente ajudarão com melhor consistência, taxa de transferência: Adicione estas configurações a /etc/sysctl.d/99-azure-network-extras.conf:
# For deployments where the Linux VM is BEHIND an Azure Load Balancer, timestamps MUST be set to 0
net.ipv4.tcp_timestamps = 1

# Reuse does require tcp_timestamps to be enabled. If tcp_timestamps are disabled because of load balancers, you should set reuse to 2.
net.ipv4.tcp_tw_reuse = 1

# Allowed local port range. This will increase the number of locally available ports (source ports)
net.ipv4.ip_local_port_range = 1024 65535

# Maximum number of packets taken from all interfaces in one polling cycle (NAPI poll). In one polling cycle interfaces which are # registered to polling are probed in a round-robin manner.
net.core.netdev_budget = 1000

# For high-performance environments, it's recommended to increase from the default 20KB to 65KB, in some extreme cases, for environments that support 100G+ networking, you can 
# increase it to 1048576
net.core.optmem_max = 65535

# F-RTO is not recommended on wired networks. 
net.ipv4.tcp_frto = 0

# Increase the number of incoming connections / number of connections backlog
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 32768
net.core.dev_weight = 64
  • Disciplina de fila (qdisc): o processamento de pacotes no Azure é melhorado definindo o qdisc padrão como fq. Adicione esta configuração a /etc/sysctl.d/99-azure-qdisc.conf:
net.core.default_qdisc = fq 
  • Otimizar buffers de anel NIC para TX/RX: crie uma regra udev em /etc/udev/rules.d/99-azure-ring-buffer.rules para garantir que sejam aplicados a interfaces de rede:
# Setup Accelerated Interface ring buffers (Mellanox / Mana) 
SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION=="add",  RUN+="/usr/sbin/ethtool -G $env{INTERFACE} rx 1024 tx 1024"

# Setup Synthetic interface ring buffers (hv_netvsc)
SUBSYSTEM=="net", DRIVERS=="hv_netvsc*", ACTION=="add",  RUN+="/usr/sbin/ethtool -G $env{INTERFACE} rx 1024 tx 1024"
  • Crie uma regra udev em /etc/udev/rules.d/99-azure-qdisc.rules para garantir que o qdisc seja aplicado às interfaces de rede:
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="enP*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root noqueue" 
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="eth*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root fq“ 
  • Agendamento de solicitação de interrupção (IRQ): Dependendo da sua carga de trabalho, você pode querer restringir o serviço irqbalance de agendar IRQs em determinados nós. Ao usar o IRQBalance, você pode atualizar /etc/default/irqbalance para especificar quais CPUs não devem ter IRQs agendadas, você precisará determinar a máscara que excluirá as CPUs que precisam de exclusão.

Mais informação sobre como calcular a máscara está disponível aqui.

O exemplo abaixo pressupõe que você deseja excluir CPUs 8-15

IRQBALANCE_BANNED_CPULIST=0000ff00
  • Regras UDEV: adicione regras para otimizar o comprimento da fila e gerenciar sinalizadores de dispositivo de forma eficiente. Crie a seguinte regra em /etc/udev/rules.d/99-azure-txqueue-len.rules:
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="eth*", ATTR{tx_queue_len}="10000“ 

Para pacotes atrasados duas vezes

Quando se fala de redes de desempenho com Linux, usamos SR-IOV com drivers Mellanox (mlx4 ou mlx5). Algo específico do Azure é que isto cria duas interfaces: uma, a sintética, e outra, a interface virtual. Saiba mais.

Notas adicionais

Os administradores de sistema podem implementar essas soluções editando arquivos de configuração como /etc/sysctl.d/, /etc/modules-load.d/e /etc/udev/rules.d/. Certifique-se de que as atualizações do driver do kernel e as configurações do systemd sejam revisadas quanto a possíveis regressões.

Para obter mais informações sobre configurações específicas e solução de problemas, consulte a documentação do Azure sobre desempenho de rede.