Compartilhar via


Otimizar a taxa de transferência de rede para máquinas virtuais do Azure

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

Máquinas virtuais do Windows

Se a máquina virtual do Windows der suporte à rede acelerada, habilite esse recurso para a taxa de transferência ideal. Para obter mais informações, confira Criar uma VM do Windows com rede acelerada.

Para todas as outras VMs do Windows, usar RSS (Receive Side Scaling) pode alcançar uma taxa de transferência máxima maior que uma VM sem RSS. O RSS pode ser desabilitado por padrão em uma VM do Windows. Para verificar se o RSS está habilitado e habilitá-lo, siga estas etapas:

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

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

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

    Esse comando não tem nenhuma saída. O comando altera as configurações da NIC (placa de adaptador de rede). Isso causa perda temporária de conectividade por cerca de um minuto. Aparece uma caixa de diálogo Reconectando durante a perda de conectividade. Normalmente, a conectividade for restaurada após a terceira tentativa.

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

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

Máquinas virtuais do Linux

O RSS é sempre habilitado por padrão em uma VM (Máquina Virtual) linux no Azure. Kernels do Linux liberados desde outubro de 2017 incluem novas opções de otimização de rede que permitem que uma VM Linux obtenha maior taxa de transferência de rede.

Habilitar 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 tremulação. Atualmente, há duas tecnologias diferentes que são usadas dependendo do tamanho da máquina virtual, Mellanox , que é amplamente disponível e MANA , que é desenvolvida pela Microsoft.

Kernels Ajustados do Azure

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

Use o comando a seguir para garantir que você esteja 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 do Linux

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

Obtendo velocidades de transferência consistentes em VMs do Linux no Azure

As VMs do Linux geralmente enfrentam problemas de desempenho de rede, especialmente ao transferir arquivos grandes (de 1 GB a 50 GB) entre regiões, como Europa Ocidental e Oeste dos EUA. Esses problemas são causados por versões de kernel mais antigas, bem como configurações de kernel padrão, configurações de buffer de rede padrão 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 posteriores: Habilitar o controle de congestionamento BBR (Bottleneck Bandwidth and Round-trip propagation time) geralmente pode resultar em uma melhor taxa de transferência. Adicione essa 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 é aprimorado definindo o qdisc padrão como fq. Adicione essa 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 elas sejam aplicadas 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 /etc/udev/rules.d/99-azure-qdisc.rules udev para garantir que o qdisc seja aplicado a 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 carga de trabalho, talvez você queira restringir o serviço irqbalance de agendar IRQs em determinados nós. Ao usar 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ções sobre como calcular a máscara disponível aqui.

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

IRQBALANCE_BANNED_CPULIST=0000ff00
  • Regras de UDEV: adicione regras para otimizar o comprimento da fila e gerenciar sinalizadores de dispositivo com eficiência. 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 trata de desempenho de rede no Linux, usamos SR-IOV com drivers Mellanox (mlx4 ou mlx5). Algo específico do Azure é que isso cria duas interfaces: uma interface sintética e uma interface virtual. Saiba mais.

Notas adicionais

Os administradores do sistema podem implementar essas soluções editando arquivos de configuração, como /etc/sysctl.d/, /etc/modules-load.d/e /etc/udev/rules.d/. Verifique se as atualizações do driver de kernel e as configurações sistemadas são revisadas para 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 o desempenho de rede.