你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

优化 Azure 虚拟机网络吞吐量

Azure 虚拟机 (VM) 的默认网络设置可以进一步针对网络吞吐量进行优化。 本文介绍如何优化 Windows 和 Linux VM(包括 Ubuntu 和 Red Hat 等主要发行版)的网络吞吐量。

Windows 虚拟机

如果 Windows VM 支持加速网络,请启用该功能以实现最佳吞吐量。 有关详细信息,请参阅创建具有加速网络的 Windows VM

对于所有其他 Windows VM,与不使用 RSS 的 VM 相比,使用接收方缩放 (RSS) 可达到更高的最大吞吐量。 默认情况下,RSS 可能在 Windows VM 中已禁用。 若要检查 RSS 是否已启用并启用它,请执行以下步骤:

  1. 使用 Get-NetAdapterRss PowerShell 命令查看是否为网络适配器启用了 RSS。 在以下从 Get-NetAdapterRss 返回的示例输出中,RSS 未启用。

    Name                    : Ethernet
    InterfaceDescription    : Microsoft Hyper-V Network Adapter
    Enabled                 : False
    
  2. 输入以下命令以启用 RSS:

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

    此命令没有任何输出。 该命令更改网络接口卡 (NIC) 设置。 它会导致临时连接丢失约一分钟。 在连接丢失期间显示“正在重新连接”对话框。 通常在第三次尝试后,连接会还原。

  3. 再次输入 Get-NetAdapterRss 命令,确认 RSS 在 VM 中已启用。 如果成功,将返回以下示例输出:

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

Linux 虚拟机

默认情况下,RSS 始终在 Azure Linux 虚拟机(VM)中启用。 自 2017 年 12 月以后发布的 Linux 内核均包含新的网络优化选项,可使 Linux VM 实现更高的网络吞吐量。

启用 Azure 加速网络以实现最佳吞吐量

Azure 提供加速网络,可以真正提高网络性能、延迟、抖动。 目前有两种不同的技术可以根据虚拟机的大小来选择:Mellanox 技术,它广泛可用;以及由微软开发的 MANA 技术。

Azure Linux 优化内核

某些分发版(如 Ubuntu(Canonical)和 SUSE 具有 Azure 优化内核

使用以下命令确保您使用的是 Azure 内核,该内核的命名中通常包含 azure 字符串。

uname -r

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

其他 Linux 分发版

大多数新式分发版对较新的内核进行了显著改进。 检查当前内核版本,确保运行的内核比 4.19 更新,其中包括网络方面的一些重大改进,例如对 BBR Congestion-Based 拥塞控制的支持。

在 Azure Linux VM 中实现一致的传输速度

Azure Linux VM 通常遇到网络性能问题,尤其是在区域(例如西欧和美国西部)之间传输大型文件(1 GB 到 50 GB)时。 这些问题是由较旧的内核版本以及默认内核配置、默认网络缓冲区设置和默认拥塞控制算法引起的,这会导致数据包延迟、吞吐量有限以及资源使用率低下。

若要获得一致的网络性能,请考虑实现在 Azure 上的许多情况下证明有效的以下优化:

  • 网络缓冲区设置:调整内核参数以最大化读取和写入内存缓冲区。 将这些配置添加到 /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 内核 4.19 及以上版本的拥塞控制:启用瓶颈带宽和往返传播时间(BBR)拥塞控制通常可以提升吞吐量。 将此配置添加到 /etc/sysctl.d/99-azure-congestion-control.conf
net.ipv4.tcp_congestion_control = bbr 
  • 通常有助于提高一致性的额外 TCP 参数,吞吐量:将这些配置添加到 /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
  • 队列规则(qdisc):通过将默认 qdisc 设置为 fq,改进了 Azure 中的数据包处理。 将此配置添加到 /etc/sysctl.d/99-azure-qdisc.conf
net.core.default_qdisc = fq 
  • 优化 TX/RX 的 NIC 环缓冲区:创建 udev 规则 /etc/udev/rules.d/99-azure-ring-buffer.rules ,以确保它们应用于网络接口:
# 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"
  • 创建一个 udev 规则在 /etc/udev/rules.d/99-azure-qdisc.rules 中,以确保 qdisc 应用于网络接口:
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)调度:根据您的工作负荷,您可能需要避免 irqbalance 服务在特定节点上执行 IRQ 分配。 使用 IRQBalance 时,可以更新 /etc/default/irqbalance 以指定哪些 CPU 不应计划 IRQ。你需要确定将需要排除的 CPU 排除在外的掩码

有关如何计算 此处可用的掩码的详细信息。

以下示例假定要排除 CPU 8-15

IRQBALANCE_BANNED_CPULIST=0000ff00
  • UDEV 规则:添加规则以优化队列长度并有效地管理设备标志。 在/etc/udev/rules.d/99-azure-txqueue-len.rules中创建以下规则:
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="eth*", ATTR{tx_queue_len}="10000“ 

对于延迟两次的数据包

在 Linux 性能网络方面,我们使用 SR-IOV 与 Mellanox 驱动程序(mlx4 或 mlx5)。Azure 的一个特性是它会创建两个网络接口:合成网络接口和虚拟网络接口。 了解详细信息

其他说明

系统管理员可以通过编辑配置文件(例如 /etc/sysctl.d//etc/modules-load.d//etc/udev/rules.d/)来实现这些解决方案。 确保查看内核驱动程序更新和系统配置,了解潜在的回归情况。

有关特定配置和故障排除的详细信息,请参阅有关网络性能的 Azure 文档。