Condividi tramite


Ottimizzare la velocità effettiva di rete per le macchine virtuali di Azure

Le macchine virtuali di Azure hanno impostazioni di rete predefinite che possono essere ulteriormente ottimizzate per la velocità effettiva di rete. Questo articolo descrive come ottimizzare la velocità effettiva di rete per le macchine virtuali Windows e Linux, incluse le distribuzioni principali, ad esempio Ubuntu e Red Hat.

macchine virtuali Windows

Se la macchina virtuale Windows supporta la rete accelerata, abilitare tale funzionalità per una velocità effettiva ottimale. Per altre informazioni, vedere Creare una macchina virtuale Windows con rete accelerata.

Per tutte le altre macchine virtuali Windows, l'uso di Receive Side Scaling (RSS) può raggiungere una velocità effettiva massima superiore rispetto a una macchina virtuale senza RSS. RSS potrebbe essere disabilitato per impostazione predefinita in una macchina virtuale Windows. Per verificare se RSS è abilitato e abilitarlo, seguire questa procedura:

  1. Verificare se RSS è abilitato per una scheda di rete con il comando PowerShell Get-NetAdapterRss . Nell'esempio seguente l'output restituito da Get-NetAdapterRss RSS non è abilitato.

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : False
    
  2. Per abilitare RSS, immettere il comando seguente:

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

    Questo comando non ha un output. Il comando modifica le impostazioni della scheda di interfaccia di rete.The command changes network interface card (NIC) settings. Causa una perdita temporanea di connettività per circa un minuto. Viene visualizzata una finestra di dialogo Riconnessione durante la perdita di connettività. La connettività viene in genere ripristinata dopo il terzo tentativo.

  3. Verificare che RSS sia abilitato nella macchina virtuale immettendo di nuovo il Get-NetAdapterRss comando . In caso di esito positivo, viene restituito l'output di esempio seguente:

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

Macchine virtuali Linux

RSS è sempre abilitato per impostazione predefinita in una macchina virtuale Linux in Azure. I kernel Linux rilasciati a partire da ottobre 2017 includono nuove opzioni di ottimizzazione di rete che consentono a una macchina virtuale Linux di ottenere una velocità effettiva di rete superiore.

Abilitare la rete accelerata di Azure per una velocità effettiva ottimale

Azure offre una rete accelerata che può migliorare realmente le prestazioni di rete, la latenza, il jitter. Attualmente sono disponibili due tecnologie diverse che vengono usate a seconda delle dimensioni della macchina virtuale, Mellanox , che è disponibile a livello generale e MANA , sviluppato da Microsoft.

Kernel ottimizzati per Azure

Alcune distribuzioni, ad esempio Ubuntu (Canonical) e SUSE hanno kernel ottimizzati di Azure.

Usare il comando seguente per assicurarsi di usare il kernel di Azure, che in genere ha la azure stringa nella denominazione.

uname -r

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

Altre distribuzioni Linux

La maggior parte delle distribuzioni moderne presenta miglioramenti significativi con i kernel più recenti. Controllare la versione corrente del kernel per assicurarsi di eseguire un kernel più recente della versione 4.19, che include alcuni miglioramenti importanti nella rete, ad esempio il supporto per BBR Congestion-Based Congestion Control.

Raggiungimento di velocità di trasferimento coerenti nelle macchine virtuali Linux in Azure

Le macchine virtuali Linux spesso riscontrano problemi di prestazioni di rete, in particolare quando si trasferiscono file di grandi dimensioni (da 1 GB a 50 GB) tra aree, ad esempio Europa occidentale e Stati Uniti occidentali. Questi problemi sono causati dalle versioni precedenti del kernel, nonché dalle configurazioni del kernel predefinite, dalle impostazioni predefinite del buffer di rete e dagli algoritmi di controllo della congestione predefiniti, che comportano pacchetti ritardati, velocità effettiva limitata e utilizzo inefficiente delle risorse.

Per ottenere prestazioni di rete coerenti, è consigliabile implementare le ottimizzazioni seguenti che sono state comprovate efficaci in molte situazioni in Azure:

  • Impostazioni del buffer di rete: modificare i parametri del kernel per ottimizzare i buffer di memoria di lettura e scrittura. Aggiungere queste configurazioni 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 controllo della congestione per i kernel 4.19 e versioni successive: Abilitare il controllo della congestione Bottleneck Bandwidth and Round-trip propagation time (BBR) può spesso comportare un miglior throughput. Aggiungere questa configurazione a /etc/sysctl.d/99-azure-congestion-control.conf:
net.ipv4.tcp_congestion_control = bbr 
  • Parametri TCP aggiuntivi che in genere consentono una migliore coerenza, velocità effettiva: aggiungere queste configurazioni 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 della coda (qdisc): l'elaborazione dei pacchetti in Azure viene migliorata impostando il valore predefinito di qdisc su fq. Aggiungere questa configurazione a /etc/sysctl.d/99-azure-qdisc.conf:
net.core.default_qdisc = fq 
  • Ottimizzare i buffer circolari della scheda di interfaccia di rete per TX/RX: creare una regola udev in /etc/udev/rules.d/99-azure-ring-buffer.rules per assicurarsi che vengano applicati alle interfacce di rete:
# 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"
  • Creare una regola udev in /etc/udev/rules.d/99-azure-qdisc.rules per assicurarsi che qdisc venga applicato alle interfacce di rete:
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“ 
  • Pianificazione della richiesta di interruzione (IRQ): a seconda del carico di lavoro, è possibile limitare il servizio irqbalance nella pianificazione degli IRQ su determinati nodi. Quando si usa IRQBalance, è possibile eseguire l'aggiornamento /etc/default/irqbalance per specificare quali CPU non devono avere irQs pianificate, sarà necessario determinare la maschera che escluderà le CPU che richiedono l'esclusione.

Altre informazioni su come calcolare la maschera disponibile qui.

L'esempio seguente presuppone che si voglia escludere CPU da 8 a 15

IRQBALANCE_BANNED_CPULIST=0000ff00
  • Regole UDEV: aggiungere regole per ottimizzare la lunghezza della coda e gestire i flag di dispositivo in modo efficiente. Creare la regola seguente in /etc/udev/rules.d/99-azure-txqueue-len.rules:
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="eth*", ATTR{tx_queue_len}="10000“ 

Per i pacchetti ritardati due volte

Quando si tratta di rete per le prestazioni di Linux si usa SR-IOV con i driver Mellanox (mlx4 o mlx5), un elemento specifico di Azure è che crea due interfacce sintetiche e un'interfaccia virtuale. Scopri di più.

Note aggiuntive

Gli amministratori di sistema possono implementare queste soluzioni modificando i file di configurazione, ad /etc/sysctl.d/esempio , /etc/modules-load.d/e /etc/udev/rules.d/. Assicurarsi che gli aggiornamenti del driver del kernel e le configurazioni di sistema vengano esaminati per individuare potenziali regressioni.

Per altre informazioni sulle configurazioni specifiche e sulla risoluzione dei problemi, vedere la documentazione di Azure sulle prestazioni di rete.