优化 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 实现更高的网络吞吐量。

用于新部署的 Ubuntu

Azure 内核上的 Ubuntu 已针对 Azure 上的出色网络性能进行了大量优化。 目前,Canonical 的所有 Ubuntu 映像都默认安装了优化的 Azure 内核。

使用以下命令,确保你使用的是 Azure 内核,它的版本末尾有 -azure 标识。

uname -r

#sample output on Azure kernel:
6.8.0-1017-azure

现有 VM 的 Ubuntu on Azure 内核升级

可以通过升级到 Azure Linux 内核来实现显著的吞吐量性能。 若要验证是否具有此内核,请检查你的内核版本。 该版本应与示例版本相同或更新。

#Azure kernel name ends with "-azure"
uname -r

#sample output on Azure kernel:
#4.13.0-1007-azure

如果 VM 没有 Azure 内核,版本号将通常以“4.4”开头。 如果 VM 没有 Azure 内核,请使用根权限运行以下命令:

#run as root or preface with sudo
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade -y
sudo apt-get install "linux-azure"
sudo reboot

其他发行版

大多数新式发行版在使用高于 4.19+ 的内核版本时应具有显著改进。 检查当前内核版本,确保运行的是较新的内核。

优化 Azure Linux VM 中的跨区域传输速度

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

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

  • 网络缓冲区设置:调整内核参数以最大化读取和写入内存缓冲区。 将这些配置添加到 /etc/sysctl.d/99-azure-network-buffers.conf

    net.core.rmem_max = 2147483647 
    net.core.wmem_max = 2147483647 
    net.ipv4.tcp_rmem = 4096 67108864 1073741824 
    net.ipv4.tcp_wmem = 4096 67108864 1073741824 
    
  • 拥塞控制:启用 BBR 拥塞控制通常会导致更好的吞吐量。 将此配置添加到 /etc/sysctl.d/99-azure-congestion-control.conf

  • 请将 BBR 模块添加到 /etc/modules-load.d/99-azure-tcp-bbr.conf 以确保其已加载。

    tcp_bbr 
    
    net.ipv4.tcp_congestion_control = bbr 
    
  • 队列规则(qdisc):Azure 中的数据包处理通常通过将默认 qdisc 设置为 fq改进。 将此配置添加到 /etc/sysctl.d/99-azure-qdisc.conf

    net.core.default_qdisc = fq 
    
  • 创建 /etc/udev/rules.d/99-azure-qdisc.rules 中的 udev 规则以确保 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。 更新 /etc/default/irqbalance 以指定哪些 CPU 不应计划 IRQ:

    IRQBALANCE_BANNED_CPULIST=0-2 
    
  • 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 文档。