Delen via


Netwerkdoorvoer voor virtuele Azure-machines optimaliseren

Virtuele Azure-machines (VM's) hebben standaardnetwerkinstellingen die verder kunnen worden geoptimaliseerd voor netwerkdoorvoer. In dit artikel wordt beschreven hoe u netwerkdoorvoer voor Windows- en Linux-VM's optimaliseert, waaronder belangrijke distributies zoals Ubuntu en Red Hat.

Virtuele Windows-machines

Als uw Windows-VM versneld netwerken ondersteunt, schakelt u deze functie in voor optimale doorvoer. Zie Een Virtuele Windows-machine maken met versneld netwerken voor meer informatie.

Voor alle andere Windows-VM's kan het schalen aan ontvangstzijde (RSS) een hogere maximale doorvoer bereiken dan een VIRTUELE machine zonder RSS. RSS kan standaard worden uitgeschakeld op een Virtuele Windows-machine. Voer de volgende stappen uit om te controleren of RSS is ingeschakeld en in te schakelen:

  1. Kijk of RSS is ingeschakeld voor een netwerkadapter met de Opdracht Get-NetAdapterRss PowerShell. In het volgende voorbeeld is uitvoer die wordt geretourneerd vanuit RSS Get-NetAdapterRss niet ingeschakeld.

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : False
    
  2. Voer de volgende opdracht in om RSS in te schakelen:

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

    Deze opdracht heeft geen uitvoer. Met de opdracht worden de NIC-instellingen (Network Interface Card) gewijzigd. Dit veroorzaakt tijdelijk connectiviteitsverlies gedurende ongeveer één minuut. Er wordt een dialoogvenster voor opnieuw verbinden weergegeven tijdens het connectiviteitsverlies . De verbinding wordt meestal hersteld na de derde poging.

  3. Controleer of RSS is ingeschakeld op de virtuele machine door de Get-NetAdapterRss opdracht opnieuw in te voeren. Als dit lukt, wordt de volgende voorbeelduitvoer geretourneerd:

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

Virtuele Linux-machines

RSS is altijd standaard ingeschakeld in een virtuele Linux-machine (VM) in Azure. Linux-kernels die sinds oktober 2017 zijn uitgebracht, bevatten nieuwe opties voor netwerkoptimalisatie waarmee een Linux-VM een hogere netwerkdoorvoer kan bereiken.

Versneld netwerken van Azure inschakelen voor optimale doorvoer

Azure biedt versneld netwerken waarmee de netwerkprestaties, latentie en jitter echt kunnen worden verbeterd. Er zijn momenteel twee verschillende technologieën die worden gebruikt, afhankelijk van de grootte van de virtuele machine, Mellanox die breed beschikbaar is en MANA die is ontwikkeld door Microsoft.

Afgestemde Azure-kernels

Sommige distributies, zoals Ubuntu (Canonical) en SUSE, hebben afgestemde Azure-kernels.

Gebruik de volgende opdracht om ervoor te zorgen dat u de Azure-kernel gebruikt, die meestal de azure tekenreeks in de naamgeving heeft.

uname -r

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

Andere Linux-distributies

De meeste moderne distributies hebben aanzienlijke verbeteringen met nieuwere kernels. Controleer de huidige kernelversie om ervoor te zorgen dat u een kernel uitvoert die nieuwer is dan 4.19, waaronder enkele geweldige verbeteringen in netwerken, bijvoorbeeld ondersteuning voor de BBR Congestion-Based Congestiecontrole.

Consistente overdrachtssnelheden bereiken in Linux-VM's in Azure

Linux-VM's ondervinden vaak netwerkprestatieproblemen, met name bij het overdragen van grote bestanden (1 GB naar 50 GB) tussen regio's, zoals Europa - west en VS - west. Deze problemen worden veroorzaakt door oudere kernelversies en standaard kernelconfiguraties, standaardnetwerkbufferinstellingen en standaard algoritmen voor congestiebeheer, wat resulteert in vertraagde pakketten, beperkte doorvoer en inefficiënt resourcegebruik.

Voor consistente netwerkprestaties kunt u overwegen de volgende optimalisaties te implementeren die in veel situaties in Azure effectief zijn:

  • Netwerkbufferinstellingen: pas kernelparameters aan om geheugenbuffers voor lezen en schrijven te maximaliseren. Voeg deze configuraties toe aan /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 Congestiebeheer voor kernels 4.19 en hoger: Het inschakelen van Bottleneck Bandwidth and Round-trip propagation Time (BBR) congestiebeheer kan vaak leiden tot een betere doorvoer. Voeg deze configuratie toe aan /etc/sysctl.d/99-azure-congestion-control.conf:
net.ipv4.tcp_congestion_control = bbr 
  • Extra TCP-parameters die meestal helpen bij betere consistentie, doorvoer: voeg deze configuraties toe aan /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
  • Wachtrij-discipline (qdisc): pakketverwerking in Azure wordt verbeterd door de standaard-qdisc in te stellen op fq. Voeg deze configuratie toe aan /etc/sysctl.d/99-azure-qdisc.conf:
net.core.default_qdisc = fq 
  • NIC-ringbuffers optimaliseren voor TX/RX: maak een udev-regel /etc/udev/rules.d/99-azure-ring-buffer.rules om ervoor te zorgen dat deze worden toegepast op netwerkinterfaces:
# 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"
  • Maak een udev-regel /etc/udev/rules.d/99-azure-qdisc.rules om ervoor te zorgen dat de qdisc wordt toegepast op netwerkinterfaces:
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“ 
  • IrQ-planning (Interrupt Request): Afhankelijk van uw workload, kunt u de irqbalance-service beperken tot het plannen van IRQs op bepaalde knooppunten. Wanneer u IRQBalance gebruikt, kunt u /etc/default/irqbalance bijwerken om aan te geven welke CPU's geen IRQ's toegewezen moeten krijgen. U moet het masker bepalen dat de CPU's uitsluit die moeten worden uitgesloten.

Meer informatie over het berekenen van het masker dat hier beschikbaar is.

In het onderstaande voorbeeld wordt ervan uitgegaan dat u CPU's 8-15 wilt uitsluiten

IRQBALANCE_BANNED_CPULIST=0000ff00
  • UDEV-regels: voeg regels toe om de wachtrijlengte te optimaliseren en apparaatvlagmen efficiënt te beheren. Maak de volgende regel in /etc/udev/rules.d/99-azure-txqueue-len.rules:
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="eth*", ATTR{tx_queue_len}="10000“ 

Voor pakketten die twee keer zijn vertraagd

Als het gaat om Linux-prestatienetwerken, gebruiken we SR-IOV met Mellanox-stuurprogramma's (mlx4 of mlx5), iets dat specifiek is voor Azure, is dat hiermee twee interfaces worden gemaakt die een synthetische en een virtuele interface zijn. Meer informatie.

Aanvullende notities

Systeembeheerders kunnen deze oplossingen implementeren door configuratiebestanden zoals /etc/sysctl.d/, /etc/modules-load.d/, en /etc/udev/rules.d/. Zorg ervoor dat updates van kernelstuurprogramma's en systeemconfiguraties worden gecontroleerd op mogelijke regressies.

Raadpleeg de Azure-documentatie over netwerkprestaties voor meer informatie over specifieke configuraties en probleemoplossing.