你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 虚拟机 (VM) 的默认网络设置可以进一步针对网络吞吐量进行优化。 本文介绍如何优化 Windows 和 Linux VM(包括 Ubuntu 和 Red Hat 等主要发行版)的网络吞吐量。
Windows 虚拟机
如果 Windows VM 支持加速网络,请启用该功能以实现最佳吞吐量。 有关详细信息,请参阅创建具有加速网络的 Windows VM。
对于所有其他 Windows VM,与不使用 RSS 的 VM 相比,使用接收方缩放 (RSS) 可达到更高的最大吞吐量。 默认情况下,RSS 可能在 Windows VM 中已禁用。 若要检查 RSS 是否已启用并启用它,请执行以下步骤:
使用 Get-NetAdapterRss PowerShell 命令查看是否为网络适配器启用了 RSS。 在以下从
Get-NetAdapterRss
返回的示例输出中,RSS 未启用。Name : Ethernet InterfaceDescription : Microsoft Hyper-V Network Adapter Enabled : False
输入以下命令以启用 RSS:
Get-NetAdapter | % {Enable-NetAdapterRss -Name $_.Name}
此命令没有任何输出。 该命令更改网络接口卡 (NIC) 设置。 它会导致临时连接丢失约一分钟。 在连接丢失期间显示“正在重新连接”对话框。 通常在第三次尝试后,连接会还原。
再次输入
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 文档。
相关内容
- 使用邻近放置组将各个 VM 部署在相近的位置,以缩短延迟。
- 请通过带宽/吞吐量测试查看你的方案的优化后结果。
- 阅读有关如何为虚拟机分配带宽的信息。
- 通过 Azure 虚拟网络常见问题解答了解详细信息。