「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インターフェイスを切り離さないよう注意する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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-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
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
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 |
AzureでのLinux実務スキルを体系的に学べる場を用意しています。
>> AzureでのLinuxサーバー構築スキルを学ぶ
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:Azure仮想ネットワークゲートウェイのBGPルーティングを設定する|Terraformで経路広報を自動化
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます