Skip to content

Commit 6fae8b8

Browse files
Merge pull request #301012 from mabicca/patch-23
Update virtual-network-optimize-network-bandwidth.md
2 parents 0406126 + cabe28b commit 6fae8b8

File tree

1 file changed

+76
-37
lines changed

1 file changed

+76
-37
lines changed

articles/virtual-network/virtual-network-optimize-network-bandwidth.md

Lines changed: 76 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Azure virtual machines (VMs) have default network settings that can be further o
1919

2020
If your Windows VM supports *accelerated networking*, enable that feature for optimal throughput. For more information, see [Create a Windows VM with accelerated networking](create-vm-accelerated-networking-powershell.md).
2121

22-
For all other Windows VMs, using Receive Side Scaling (RSS) can reach higher maximal throughput than a VM without RSS. RSS might be disabled by default in a Windows VM. To determine whether RSS is enabled, and enable it if it's currently disabled, follow these steps:
22+
For all other Windows VMs, using Receive Side Scaling (RSS) can reach higher maximal throughput than a VM without RSS. RSS might be disabled by default in a Windows VM. To check if RSS is enabled and enable it, follow these steps:
2323

2424
1. See if RSS is enabled for a network adapter with the [Get-NetAdapterRss](/powershell/module/netadapter/get-netadapterrss) PowerShell command. In the following example, output returned from the `Get-NetAdapterRss` RSS isn't enabled.
2525

@@ -53,7 +53,7 @@ RSS is always enabled by default in an Azure Linux VM. Linux kernels released si
5353

5454
The Ubuntu on Azure kernel is heavily optimized for excellent network performance on Azure. Currently, all Ubuntu images by Canonical come by default with the optimized Azure kernel installed.
5555

56-
Use the following command to make sure that you're using the Azure kernel, which is identified by `-azure` at the end of the version.
56+
Use the following command to make sure that you're using the Azure kernel, which has `-azure` at the end of the version.
5757

5858
```bash
5959
uname -r
@@ -91,55 +91,94 @@ Most modern distributions should have significant improvements with kernels newe
9191

9292
## Optimizing cross-region transfer speeds in Azure Linux VMs
9393

94-
Azure Linux VMs often experience network performance issues, particularly when transferring large files (1GB to 50GB) between regions, such as West Europe and West US. These issues are caused by generic kernel configurations, network buffer settings, and default congestion control algorithms, which result in delayed packets, limited throughput, and inefficient resource usage.
94+
Azure Linux VMs often experience network performance issues, particularly when transferring large files (1 GB to 50 GB) between regions, such as West Europe and West US. These issues are caused by generic kernel configurations, network buffer settings, and default congestion control algorithms, which result in delayed packets, limited throughput, and inefficient resource usage.
9595

96-
To enhance network performance, consider implementing the following optimizations that have been proven effective in a number of situations on Azure:
96+
To enhance network performance, consider implementing the following optimizations that are proven effective in many situations on Azure:
9797

9898
- **Network buffer settings**: Adjust kernel parameters to maximize read and write memory buffers. Add these configurations to `/etc/sysctl.d/99-azure-network-buffers.conf`:
9999

100-
```plaintext
101-
net.core.rmem_max = 2147483647
102-
net.core.wmem_max = 2147483647
103-
net.ipv4.tcp_rmem = 4096 67108864 1073741824
104-
net.ipv4.tcp_wmem = 4096 67108864 1073741824
105-
```
100+
```plaintext
101+
net.ipv4.tcp_mem = 4096 87380 67108864
102+
net.ipv4.udp_mem = 4096 87380 33554432
103+
net.ipv4.tcp_rmem = 4096 87380 67108864
104+
net.ipv4.tcp_wmem = 4096 65536 67108864
105+
net.core.rmem_default = 33554432
106+
net.core.wmem_default = 33554432
107+
net.ipv4.udp_wmem_min = 16384
108+
net.ipv4.udp_rmem_min = 16384
109+
net.core.wmem_max = 134217728
110+
net.core.rmem_max = 134217728
111+
net.core.busy_poll = 50
112+
net.core.busy_read = 50
113+
```
106114

107-
- **Congestion control**: Enabling BBR congestion control can often result in better throughput. Add this configuration to `/etc/sysctl.d/99-azure-congestion-control.conf`:
115+
- **Congestion control for kernels 4.19+**: Enabling Bottleneck Bandwidth and Round-trip propagation time (BBR) congestion control can often result in better throughput. Add this configuration to `/etc/sysctl.d/99-azure-congestion-control.conf`:
116+
117+
```plaintext
118+
net.ipv4.tcp_congestion_control = bbr
119+
```
120+
- **Extra TCP parameters that will usually help with better consistency, throughput**: Add these configurations to `/etc/sysctl.d/99-azure-network-extras.conf`:
121+
122+
````plaintext
123+
# For deployments where the Linux VM is BEHIND an Azure Load Balancer, timestamps MUST be set to 0
124+
net.ipv4.tcp_timestamps = 1
125+
126+
# Reuse does require tcp_timestamps to be enabled. If tcp_timestamps are disabled because of load balancers, you should set reuse to 2.
127+
net.ipv4.tcp_tw_reuse = 1
128+
129+
# Allowed local port range. This will increase the number of locally available ports (source ports)
130+
net.ipv4.ip_local_port_range = 1024 65535
131+
132+
# 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.
133+
net.core.netdev_budget = 1000
108134
109-
- Ensure the BBR module is loaded by adding it to `/etc/modules-load.d/99-azure-tcp-bbr.conf`:
135+
# 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
136+
# increase it to 1048576
137+
net.core.optmem_max = 65535
110138
111-
```plaintext
112-
tcp_bbr
113-
```
139+
# F-RTO is not recommended on wired networks.
140+
net.ipv4.tcp_frto = 0
114141
115-
```plaintext
116-
net.ipv4.tcp_congestion_control = bbr
117-
```
142+
# Increase the number of incoming connections / number of connections backlog
143+
net.core.somaxconn = 32768
144+
net.core.netdev_max_backlog = 32768
145+
net.core.dev_weight = 64
146+
````
118147

119-
- **Queue discipline (qdisc)**: Packet processing in Azure is generally improved by setting the default qdisc to `fq`. Add this configuration to `/etc/sysctl.d/99-azure-qdisc.conf`:
148+
- **Queue discipline (qdisc)**: Packet processing in Azure is improved by setting the default qdisc to `fq`. Add this configuration to `/etc/sysctl.d/99-azure-qdisc.conf`:
120149

121-
```plaintext
122-
net.core.default_qdisc = fq
123-
```
150+
```plaintext
151+
net.core.default_qdisc = fq
152+
```
124153

125-
- Create a udev rule in `/etc/udev/rules.d/99-azure-qdisc.rules` to ensure the qdisc is applied to network interfaces:
154+
- **Optimize NIC ring buffers for TX/RX**: Create an udev rule in `/etc/udev/rules.d/99-azure-ring-buffer.rules` to ensure they're applied to network interfaces:
126155

127-
```plaintext
128-
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="enP*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root noqueue"
129-
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="eth*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root fq“
130-
```
156+
````plaintext
157+
# Setup Accelerated Interface ring buffers (Mellanox / Mana)
158+
SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION=="add", RUN+="/usr/sbin/ethtool -G $env{INTERFACE} rx 1024 tx 1024"
131159
132-
- **IRQ scheduling**: Depending on your workload, you may wish to restrict the irqbalance service from scheduling IRQs on certain nodes. Update `/etc/default/irqbalance` to specify which CPUs should not have IRQs scheduled:
160+
# Setup Synthetic interface ring buffers (hv_netvsc)
161+
SUBSYSTEM=="net", DRIVERS=="hv_netvsc*", ACTION=="add", RUN+="/usr/sbin/ethtool -G $env{INTERFACE} rx 1024 tx 1024"
162+
````
163+
164+
- Create an udev rule in `/etc/udev/rules.d/99-azure-qdisc.rules` to ensure the qdisc is applied to network interfaces:
133165

134-
```bash
135-
IRQBALANCE_BANNED_CPULIST=0-2
136-
```
166+
```plaintext
167+
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="enP*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root noqueue"
168+
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="eth*", PROGRAM="/sbin/tc qdisc replace dev \$env{INTERFACE} root fq“
169+
```
137170

138-
- **udev rules**: Add rules to optimize queue length and manage device flags efficiently. Create the following rule in `/etc/udev/rules.d/99-azure-txqueue-len.rules`:
171+
- **Interrupt Request (IRQ) scheduling**: Depending on your workload, you may wish to restrict the irqbalance service from scheduling IRQs on certain nodes. Update `/etc/default/irqbalance` to specify which CPUs shouldn't have IRQs scheduled:
139172

140-
```plaintext
141-
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="eth*", ATTR{tx_queue_len}="10000“
142-
```
173+
```bash
174+
IRQBALANCE_BANNED_CPULIST=0-2
175+
```
176+
177+
- **UDEV rules**: Add rules to optimize queue length and manage device flags efficiently. Create the following rule in `/etc/udev/rules.d/99-azure-txqueue-len.rules`:
178+
179+
```plaintext
180+
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="eth*", ATTR{tx_queue_len}="10000“
181+
```
143182

144183
### For Packets delayed twice
145184

@@ -150,11 +189,11 @@ When it comes to Linux performance networking we use SR-IOV with Mellanox driver
150189

151190
System administrators can implement these solutions by editing configuration files such as `/etc/sysctl.d/`, `/etc/modules-load.d/`, and `/etc/udev/rules.d/`. Ensure that kernel driver updates and systemd configurations are reviewed for potential regressions.
152191

153-
For further details on specific configurations and troubleshooting, refer to Azure documentation on networking performance.
192+
For more information on specific configurations and troubleshooting, refer to Azure documentation on networking performance.
154193

155194
## Related content
156195

157196
- Deploy VMs close to each other for low latency with [proximity placement groups](/azure/virtual-machines/co-location).
158197
- See the optimized result with [Bandwidth/Throughput testing](virtual-network-bandwidth-testing.md) for your scenario.
159198
- Read about how [bandwidth is allocated to virtual machines](virtual-machine-network-throughput.md).
160-
- Learn more with [Azure Virtual Network frequently asked questions](virtual-networks-faq.md).
199+
- Learn more with [Azure Virtual Network frequently asked questions](virtual-networks-faq.md).

0 commit comments

Comments
 (0)