azure高速ネットワーク有効化後のDPDKをLinux VMで設定する|SR-IOVとethtoolで動作確認

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Azure > azure高速ネットワーク有効化後のDPDKをLinux VMで設定する|SR-IOVとethtoolで動作確認
「Azureの高速ネットワークを有効にしたのに、DPDKが認識されない」
「SR-IOVのVFデバイスはどれを指定すればいいのか判断できない」

こういった状況で手が止まるLinuxエンジニアは多いです。
Azure高速ネットワーク(Accelerated Networking)はSR-IOVによってホスト側のvSwitchをバイパスする仕組みですが、DPDKと組み合わせるには「VFの特定→ドライバーの確認→NICバインド」という順番を押さえる必要があります。

この記事では、Azure Linux VM(RHEL 9系~10系/Ubuntu 22.04 LTSを想定環境)でDPDKをセットアップする具体的な手順を解説します。ethtoolによるSR-IOVドライバーの確認、ヒューページメモリの設定、dpdk-devbindを使ったVFのバインドまでをカバーします。

この記事のポイント

・ ethtoolとlspciでSR-IOVのVFデバイスとドライバーを確認できる
・ DPDKにはヒューページメモリとvfio-pciモジュールの事前設定が必要
・ dpdk-devbindでVFをvfio-pciにバインドしてからtestpmdを起動する
・ Azureでは管理用のnetvscインターフェイスを切り離さないよう注意する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Azure高速ネットワークとSR-IOVの仕組み

AzureのVMで高速ネットワークを有効にすると、VM内部に2種類のネットワークインターフェイスが現れます。

・合成インターフェイス(netvsc):Hypervisor経由の通常経路。SSH接続など管理用途に使います。
・VF(Virtual Function):SR-IOVによって直接公開される高性能インターフェイス。Mellanox ConnectX-4以降のドライバー(mlx5_core)が使われます。

DPDKはこのVFインターフェイスを使って、カーネルのネットワークスタックを経由せずにパケットを処理します。処理速度は合成インターフェイス経由と比べて大幅に向上しますが、設定を誤るとSSH接続が切れる場合があるため、管理インターフェイスとVFを混同しないことが重要です。

Azureで高スループットを要件とするLinuxサーバーを構築する方法については、Azure上でのLinuxサーバー構築・運用の基礎もあわせて参照してください。

前提条件と高速ネットワークの有効化確認

1. 高速ネットワーク対応VMサイズの確認

高速ネットワークはすべてのVMサイズで使えるわけではありません。対応しているのはvCPUが2個以上の汎用・コンピューティング最適化シリーズです。代表的なものを以下に示します。

・汎用:D2s_v3以上、E2s_v3以上、D4as_v5以上
・コンピューティング最適化:F2s_v2以上
・メモリ最適化:E4s_v3以上

VMサイズを確認するには、VM内部からIMDSエンドポイントを呼び出します。

# IMDS(インスタンスメタデータサービス)からVMサイズを取得する curl -s -H Metadata:true "http://169.254.169.254/metadata/instance/compute/vmSize?api-version=2021-02-01&format=text"

出力例(環境により異なります):

Standard_D4s_v3

2. Azure CLIで有効化状態を確認する

VMのNICに高速ネットワークが有効かどうかは、az network nic showで確認できます。

# NIC名を確認する(例: myVMのNIC一覧) az vm show -g myResourceGroup -n myVM --query "networkProfile.networkInterfaces[].id" -o tsv # NICの高速ネットワーク設定を確認する az network nic show -g myResourceGroup -n myVM-nic1 --query "enableAcceleratedNetworking"

出力例(環境により異なります):

true

trueが返れば高速ネットワークが有効です。falseのままであれば、Portalまたはaz network nic update --accelerated-networking trueで有効にしてからVMを再起動してください。

SR-IOVのVFデバイスをethtoolで確認する

1. lspciでVFデバイスを特定する

VM内部でSR-IOVのVFが見えているかどうかをlspciで確認します。

# PCI接続されているネットワークデバイスを一覧表示する lspci | grep -i ethernet

出力例(環境により異なります):

0001:00:02.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5 Virtual Function] 0002:00:02.0 Ethernet controller: Microsoft Corporation Hyper-V virtual network adapter

ConnectX-5 Virtual Functionと表示されているデバイスがSR-IOVのVFです。PCI IDの形式(例:0001:00:02.0)はdpdk-devbindのバインド操作で使用します。

2. ethtoolでドライバー情報を取得する

ethtool -iでインターフェイスのドライバー情報を取得します。VFに対応しているインターフェイスはmlx5_coreドライバーが使われています。

# インターフェイス一覧を確認する ip link show # 各インターフェイスのドライバー情報を取得する ethtool -i eth0 ethtool -i eth1

出力例(環境により異なります):

# eth0(合成インターフェイス)の例 driver: hv_netvsc version: 5.15.0 firmware-version: N/A bus-info: 0002:00:02.0 # eth1(VFインターフェイス)の例 driver: mlx5_core version: 5.15.0 firmware-version: 20.31.1014 (...) bus-info: 0001:00:02.0

driver: mlx5_coreと表示されているインターフェイスがSR-IOVのVFです。このインターフェイスをDPDKが使います。

合成インターフェイス(hv_netvsc)はSSH接続に使われているため、DPDKのバインド操作から除外してください。

3. SR-IOVのオフロード機能をethtoolで確認する

ethtool -kでSR-IOV関連のオフロード機能を確認できます。

# VFインターフェイスのオフロード機能を確認する ethtool -k eth1 | grep -E "rx-vlan-offload|tx-vlan-offload|scatter-gather"

出力例(環境により異なります):

rx-vlan-offload: on tx-vlan-offload: on scatter-gather: on

DPDKのインストールと事前設定

1. DPDKパッケージのインストール

RHEL 9系/Ubuntu 22.04 LTSでのインストールコマンドを示します。

# RHEL 9系の場合 sudo dnf install -y dpdk dpdk-tools dpdk-devel # Ubuntu 22.04 LTSの場合 sudo apt-get install -y dpdk dpdk-dev libdpdk-dev

インストール後、DPDKのバージョンを確認します。

dpdk-devbind.py --version # またはライブラリのバージョンを確認する pkg-config --modversion libdpdk

出力例(環境により異なります):

22.11.1

2. ヒューページメモリの設定

DPDKは大きなメモリページ(ヒューページ)を使ってパケットバッファを確保します。2MBのヒューページを設定します。

# ヒューページ数を確認する(現在の設定) cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # ヒューページを1024個(合計2GB)確保する echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # 確保できたページ数を確認する cat /sys/kernel/mm/hugepages/hugepages-2048kB/free_hugepages

確保したヒューページをマウントします。

# /mnt/hugeが存在しない場合は作成する sudo mkdir -p /mnt/huge # ヒューページファイルシステムをマウントする sudo mount -t hugetlbfs nodev /mnt/huge # 再起動後も有効にするには /etc/fstab に追記する echo "nodev /mnt/huge hugetlbfs defaults 0 0" | sudo tee -a /etc/fstab

3. vfio-pciモジュールの読み込み

DPDKがVFに直接アクセスするためにvfio-pciカーネルモジュールが必要です。

# vfio-pciモジュールを読み込む sudo modprobe vfio-pci # 読み込まれたか確認する lsmod | grep vfio_pci

出力例(環境により異なります):

vfio_pci 20480 0 vfio_pci_core 73728 1 vfio_pci vfio 49152 3 vfio_pci_core,vfio_iommu_type1,vfio_pci

dpdk-devbindでVFをバインドする

1. バインド前のデバイス一覧確認

dpdk-devbind.py --statusで現在のバインド状態を確認します。

sudo dpdk-devbind.py --status

出力例(環境により異なります):

Network devices using kernel driver ==================================== 0001:00:02.0 'MT27800 Family [ConnectX-5 Virtual Function]' if=eth1 drv=mlx5_core active 0002:00:02.0 'Hyper-V virtual network adapter' if=eth0 drv=hv_netvsc active

VFデバイス(0001:00:02.0)がmlx5_coreドライバーでアクティブになっています。これをvfio-pciに切り替えます。

2. VFをvfio-pciにバインドする

バインド操作の前に、インターフェイスを無効にしておきます。

# VFインターフェイスを無効にする(eth0の合成インターフェイスは触らない) sudo ip link set eth1 down # VFをvfio-pciにバインドする sudo dpdk-devbind.py --bind=vfio-pci 0001:00:02.0 # バインド後の状態を確認する sudo dpdk-devbind.py --status

出力例(環境により異なります):

Network devices using DPDK-compatible driver ============================================ 0001:00:02.0 'MT27800 Family [ConnectX-5 Virtual Function]' drv=vfio-pci unused=mlx5_core Network devices using kernel driver ==================================== 0002:00:02.0 'Hyper-V virtual network adapter' if=eth0 drv=hv_netvsc active

VFがDPDK-compatible driver欄に移動し、drv=vfio-pciになればバインド成功です。

testpmdでDPDKの動作を確認する

testpmdはDPDKに付属するパケット処理テストツールです。バインドしたVFが正常に使えるかどうかを確認します。

# testpmdをiofwdモードで起動する # -l: 使用するCPUコア(例: コア0とコア1) # --socket-mem: ヒューページから確保するメモリ(MB単位) sudo testpmd -l 0,1 --socket-mem=256 -- -i --nb-cores=1 --port-topology=loop

起動するとtestpmd>のプロンプトが表示されます。

# パケット転送を開始する testpmd> start # ポートの統計情報を確認する testpmd> show port stats all # 停止する testpmd> stop testpmd> quit

出力例(環境により異なります):

######################## NIC statistics for port 0 ######################## RX-packets: 1024 RX-missed: 0 RX-bytes: 65536 RX-errors: 0 RX-nombuf: 0 TX-packets: 1024 TX-errors: 0 TX-bytes: 65536 Throughput (since last show) Rx-pps: 1234 Rx-bps: 79000 Tx-pps: 1234 Tx-bps: 79000 ############################################################################

RX-errors: 0かつTX/RXのパケット数が増えていれば、DPDKがVFを通じてパケットを処理できています。

なお、DPDKはカーネルのネットワークスタックを経由しないため、ssやnetstatなどの一般的なツールではDPDKが処理するトラフィックを表示できません(Linux ポート確認の全コマンド)。動作確認にはtestpmdの統計情報を使ってください。

トラブルシュート・エラー対処

「EAL: No ports were found」が出た場合

dpdk-devbindでのバインドが失敗している可能性があります。sudo dpdk-devbind.py --statusでVFがdrv=vfio-pciになっているか確認してください。バインドが反映されていない場合は、いったんVFを無効にしてから再度バインド操作を実行してください。

「Cannot get hugepage information」が出た場合

ヒューページが確保されていないか、マウントされていない可能性があります。以下で状態を確認します。

# ヒューページの確保数を確認する grep HugePages /proc/meminfo # マウント状態を確認する mount | grep huge

vfio-pciのバインドで「Failed to allocate device」が出た場合

IOMMUが無効の環境ではvfio-pciの代わりにuio_pci_genericを試してください。ただし本番環境ではセキュリティ上の理由からvfio-pciを使うことを推奨します。

# IOMMU状態を確認する dmesg | grep -i iommu | head -10 # uio_pci_genericを使う場合(開発・検証環境向け) sudo modprobe uio_pci_generic sudo dpdk-devbind.py --bind=uio_pci_generic 0001:00:02.0

本記事のまとめ

Azure高速ネットワーク有効化後にDPDKを使うための手順をまとめます。
やりたいこと コマンド
高速ネットワークの有効化確認 az network nic show --query enableAcceleratedNetworking
VFデバイスのPCI ID確認 lspci | grep -i ethernet
ドライバー情報の確認 ethtool -i <インターフェイス名>
ヒューページの確保 echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
vfio-pciモジュールの読み込み sudo modprobe vfio-pci
VFをDPDKにバインド sudo dpdk-devbind.py --bind=vfio-pci <PCI ID>
バインド状態の確認 sudo dpdk-devbind.py --status
DPDKの動作確認 sudo testpmd -l 0,1 --socket-mem=256 -- -i
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
AzureでのLinux実務スキルを体系的に学べる場を用意しています。
>> AzureでのLinuxサーバー構築スキルを学ぶ

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。