Optimera nätverkets dataflöde för virtuella Azure-datorer

Virtuella Azure-datorer (VM:er) har nätverksinställningar som används som standard och som kan optimeras för att förbättra dataflöde och stabilitet. I den här artikeln beskrivs hur du optimerar nätverksprestanda för Windows och virtuella Linux-datorer.

Important

Många av de optimeringar som beskrivs i den här artikeln (till exempel överbelastningskontroll, ködisciplin, buffertstorlekar och NIC-justering) påverkar hur trafiken flödar mellan system.

För bästa resultat kan du tillämpa de här inställningarna konsekvent på alla virtuella datorer som deltar i arbetsbelastningen, inklusive:

  • Klientsystem
  • Serversystem

Att tillämpa dessa konfigurationer på endast en delmängd av virtuella datorer kan leda till:

  • Ojämn genomströmning
  • Ökade paketåteröverföringar
  • Suboptimalt beteende vid överbelastning

Verifiera alltid ändringar i hela datasökvägen och testa prestanda från slutpunkt till slutpunkt.

Virtuella Windows-datorer

Om den virtuella Windows-datorn stöder accelererat nätverk aktiverar du den funktionen för optimalt dataflöde. Mer information finns i Skapa en virtuell Windows-dator med accelererat nätverk.

För alla andra Windows virtuella datorer kan RSS (Receive Side Scaling) ge högre maximalt dataflöde än en virtuell dator utan RSS. RSS kan vara inaktiverat som standard. Följ dessa steg för att kontrollera om RSS är aktiverat och aktivera det:

  1. Kontrollera om RSS är aktiverat för ett nätverkskort med hjälp av PowerShell-kommandot Get-NetAdapterRss . I följande exempel visar utdata från Get-NetAdapterRss att RSS inte är aktiverat.

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : False
    
  2. Om du vill aktivera RSS anger du följande kommando:

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

    Det här kommandot har inga utdata. Den ändrar inställningarna för nätverkskort (NIC) och orsakar tillfällig anslutningsförlust i ungefär en minut. En dialogruta för återanslutning visas under anslutningsförlusten. Anslutningen återställs vanligtvis efter det tredje försöket.

  3. Bekräfta att RSS är aktiverat på den virtuella datorn genom att ange Get-NetAdapterRss kommandot igen. Om det lyckas returneras följande exempelutdata:

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

Virtuella Linux-datorer

RSS är aktiverat som standard på virtuella Linux-datorer i Azure. Linux-kernels som släppts sedan oktober 2017 innehåller ytterligare alternativ för nätverksoptimering som hjälper virtuella Linux-datorer att uppnå högre dataflöde.

Aktivera Azure Accelerated Networking för optimalt dataflöde

Azure Accelererat nätverk kan avsevärt förbättra dataflödet och minska svarstiden och jitter. Beroende på vm-storlek och plattformsgenerering använder Azure en av två tekniker: Mellanox, som är allmänt tillgänglig, och MANA, som utvecklas av Microsoft.

Azure-optimerade kärnor

Vissa distributioner, till exempel Ubuntu (Canonical) och SUSE, tillhandahåller Azure finjusterade kernels.

Använd följande kommando för att kontrollera att du använder Azure kernel, som vanligtvis ingår azure i kernelnamnet.

uname -r

# Sample output for an Azure kernel on an Ubuntu Linux VM
6.8.0-1017-azure

Andra Linux-distributioner

De flesta moderna distributioner omfattar stora nätverksförbättringar i nyare kärnor. Kontrollera kernelversionen och använd 4.19 eller senare när det är möjligt. Nyare kärnor innehåller bättre nätverksbeteende och stöder moderna alternativ för överbelastningskontroll, till exempel BBR.

Uppnå konsekventa överföringshastigheter i virtuella Linux-datorer i Azure

Linux-virtuella datorer kan uppvisa varierande överföringshastigheter, särskilt vid stora överföringar mellan regioner (till exempel 1 GB till 50 GB mellan Västeuropa och Västra USA). Vanliga orsaker är äldre kärnor, standardbuffertstorlekar och icke optimerade inställningar för överbelastningsstyrning eller ködisciplin.

För att få mer konsekvent genomströmning, använd följande grundläggande justeringar och testa sedan kombinationer av trängselkontroll och qdisc för din arbetsbelastning.

Grundläggande sysctl-justering (kopiera/klistra in)

Tillämpa följande grundläggande sysctl-inställningar:

sudo tee /etc/sysctl.d/99-azure-network-tuning.conf > /dev/null <<'EOF'
# Buffer and memory tuning
# Overall TCP memory pressure thresholds (min, pressure, max pages)
net.ipv4.tcp_mem = 4096 87380 67108864
# Overall UDP memory pressure thresholds (min, pressure, max pages)
net.ipv4.udp_mem = 4096 87380 33554432
# Per-socket TCP read buffer limits (min, default, max bytes)
net.ipv4.tcp_rmem = 4096 87380 67108864
# Per-socket TCP write buffer limits (min, default, max bytes)
net.ipv4.tcp_wmem = 4096 65536 67108864
# Default socket receive buffer size in bytes
net.core.rmem_default = 33554432
# Default socket send buffer size in bytes
net.core.wmem_default = 33554432
# Minimum UDP send buffer per socket in bytes
net.ipv4.udp_wmem_min = 16384
# Minimum UDP receive buffer per socket in bytes
net.ipv4.udp_rmem_min = 16384
# Maximum socket send buffer size in bytes
net.core.wmem_max = 134217728
# Maximum socket receive buffer size in bytes
net.core.rmem_max = 134217728
# Busy polling time in microseconds for low-latency packet receive
net.core.busy_poll = 50
# Busy read time in microseconds when polling sockets
net.core.busy_read = 50

# Extra TCP and networking settings
# Enable TCP timestamps for RTT measurement and PAWS protection
net.ipv4.tcp_timestamps = 1
# Allow safer TIME-WAIT socket reuse for outbound connections
net.ipv4.tcp_tw_reuse = 1
# Expand available ephemeral source port range
net.ipv4.ip_local_port_range = 1024 65535
# Increase packets processed per NAPI polling cycle
net.core.netdev_budget = 1000
# Increase per-socket ancillary/option memory limit in bytes
net.core.optmem_max = 65535
# Disable F-RTO (typically unnecessary on stable wired paths)
net.ipv4.tcp_frto = 0
# Increase maximum listen backlog for pending connections
net.core.somaxconn = 32768
# Increase ingress packet backlog queue length
net.core.netdev_max_backlog = 32768
# Increase per-CPU packet processing quota per softirq cycle
net.core.dev_weight = 64
EOF

sudo sysctl --system

Överbelastningskontroll och qdisc-tester (sysctl)

Olika arbetsbelastningar fungerar annorlunda. Testa dessa kombinationer och behåll den som ger bästa resultat för din svarstid, dataflöde och återöverföringsprofil.

  1. BBR + FQ (ofta ett starkt standardvärde för överföring med högt dataflöde och långdistansöverföringar)
    sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
    sudo sysctl -w net.core.default_qdisc=fq
    
  2. BBR + PFIFO_FAST (användbart för att jämföra köbeteendet vid ryckig eller blandad trafik)
    sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
    sudo sysctl -w net.core.default_qdisc=pfifo_fast
    
  3. CUBIC + PFIFO_FAST (gemensam äldre baslinje för kompatibilitet och jämförelse)
    sudo sysctl -w net.ipv4.tcp_congestion_control=cubic
    sudo sysctl -w net.core.default_qdisc=pfifo_fast
    

Mät varje alternativ med representativ trafik och använd sedan den bästa kombinationen för din miljö.

Note

pfifo_fast tillgängligheten kan variera beroende på distribution/kernel. Om den inte är tillgänglig använder du det närmaste qdisc-alternativet som stöds i din miljö och fortsätter benchmarking.

UDEV-regel för NIC-ringbuffertar (TX/RX)

Skapa en udev-regel i /etc/udev/rules.d/99-azure-ring-buffer.rules för att tillämpa ringbuffertinställningar på nätverksgränssnitt:

Använd rx 4096 tx 4096 för accelererade nätverksgränssnitt (hv_pci) och behåll rx 1024 tx 1024 för syntetiska hv_netvsc gränssnitt.

Om du föredrar en interaktiv metod för justering av ringbuffert kan du också använda det här hjälpverktyget: Azure Linux NIC-installation (bash).

Note

Det här GitHub verktyget är en valfri hjälp och ingår inte i Microsoft Dokumentation om Learn-produkten. Granska skripten och testa ändringar i en icke-produktionsmiljö före bred distribution.

# Setup Accelerated Interface ring buffers (Mellanox / Mana) 
SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION=="add",  RUN+="/usr/sbin/ethtool -G $env{INTERFACE} rx 4096 tx 4096"

# 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"

UDEV-regel för NIC-överföringskölängd

Skapa följande regel i /etc/udev/rules.d/99-azure-txqueue-len.rules för att öka överföringskölängden:

SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="eth*", ATTR{tx_queue_len}="10000" 

SR-IOV-dubbelgränssnittsbeteende och biverkningar

I Linux-nätverk med höga prestanda använder Azure SR-IOV (till exempel med Mellanox-drivrutiner som mlx4 eller mlx5). I den här modellen kan du se både ett syntetiskt gränssnitt och ett virtuellt funktionsgränssnitt (VF) för samma nätverkssökväg för virtuella datorer. Läs mer.

Den här designen är förväntad, men den kan skapa förvirring vid justering och felsökning om båda gränssnitten behandlas som oberoende datasökvägar.

Möjliga biverkningar är:

  • Inkonsekventa prestandaresultat när inställningarna tillämpas på ett gränssnitt, men trafiken använder det andra.
  • Oväntade latensspikar eller omöverföringar vid felväxling mellan syntetiska vägar och VF-vägar.
  • Vilseledande diagnostik om räknare och paketinsamlingar samlas in från fel gränssnitt.

Så här minskar du risken:

  • Kontrollera vilket gränssnitt som bär din arbetsbelastningstrafik innan du justerar.
  • Håll udev- och sysctl-justeringen konsekvent med din gränssnittsstrategi.
  • Testa dataflödet och svarstiden igen efter omstart, drivrutinsuppdateringar eller accelererade ändringar i nätverkstillståndet.

Ytterligare kommentarer

Systemadministratörer kan implementera dessa rekommendationer genom att redigera konfigurationsfiler som /etc/sysctl.d/, /etc/modules-load.d/och /etc/udev/rules.d/. Granska kernel- och drivrutinsuppdateringarna noggrant för att undvika regressioner.

Mer information om specifika konfigurationer och felsökning finns i Azure dokumentation om nätverksprestanda.