Azure 仮想マシン (VM) には既定のネットワーク設定があり、ネットワーク スループットについてさらに最適化できます。 この記事では、Windows および Linux VM (Ubuntu、Red Hat などの主要ディストリビューションを含む) のネットワーク スループットを最適化する方法について説明します。
Windows仮想マシン
Windows 仮想マシンで "高速ネットワーク" がサポートされている場合は、その機能を有効にして最適なスループットを実現します。 詳細については、高速ネットワークを使用した Windows VM の作成に関する記事を参照してください。
他のすべての Windows VM では、Receive Side Scaling (RSS) を使うと、RSS を使わない VM より高い最大スループットを実現できます。 Windows VM では、RSS が既定で無効になっている場合があります。 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) の設定を変更します。 これにより、一時的に接続が失われます (約 1 分間)。 接続が失われている間、"再接続中" を示すダイアログが表示されます。 通常、3 回目の試行後に接続が復元されます。
再度
Get-NetAdapterRss
コマンドを入力して、VM で RSS が有効になっていることを確認します。 成功した場合は、次のような出力が返されます。Name : Ethernet InterfaceDescription : Microsoft Hyper-V Network Adapter Enabled : True
Linux 仮想マシン
AZURE の Linux 仮想マシン (VM) では、RSS は常に既定で有効になっています。 2017 年 10 月以降にリリースされた Linux カーネルには、Linux VM がより高いネットワーク スループットを実現できる新しいネットワーク最適化オプションが含まれています。
Azure Accelerated Networking を有効にして最適なスループットを実現する
Azure には高速ネットワークが用意されており、ネットワーク パフォーマンス、待機時間、ジッターを本当に向上させることができます。 現在、仮想マシンのサイズに応じて使用されるテクノロジは 2 つあります。 Mellanox は幅広く利用でき、 MANA は Microsoft によって開発されています。
Azure で調整されたカーネル
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 で一貫した転送速度を実現する
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 リング バッファーを最適化する:
/etc/udev/rules.d/99-azure-ring-buffer.rules
で udev ルールを作成して、ネットワーク インターフェイスに適用されるようにします。
# 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"
-
/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 をスケジュールしないように制限できます。 IRQBalance を使用する場合は、
/etc/default/irqbalance
を更新して、IRQ がスケジュールされないようにする CPU を指定し、次に除外する必要がある 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“
2 回遅延したパケットの場合
Linux パフォーマンス ネットワークに関しては、Mellanox ドライバー (mlx4 または mlx5) で SR-IOV を使用します。Azure に固有の点は、合成インターフェイスと仮想インターフェイスが 2 つのインターフェイスを作成することです。 詳細については、こちらを参照してください。
追加メモ
システム管理者は、 /etc/sysctl.d/
、 /etc/modules-load.d/
、 /etc/udev/rules.d/
などの構成ファイルを編集することで、これらのソリューションを実装できます。 カーネルドライバーの更新プログラムと systemd の設定を、潜在的な不具合がないか確認してください。
特定の構成とトラブルシューティングの詳細については、ネットワーク パフォーマンスに関する Azure ドキュメントを参照してください。
関連するコンテンツ
- 近接配置グループを使用して VM を互いに近い場所にデプロイし、待ち時間を短縮する。
- 自分のシナリオについて、最適化された結果を帯域幅/スループットのテストで確認する。
- 仮想マシンに帯域幅を割り当てる方法を確認する。
- Azure Virtual Network についてよく寄せられる質問を確認する。