Linux 仮想マシンでの DPDK の設定

注意

この記事では、間もなくサポート終了 (EOL) 状態になる Linux ディストリビューションである CentOS について説明します。 適宜、使用と計画を検討してください。 詳細については、「CentOS のサポート終了に関するガイダンス」を参照してください。

Azure の Data Plane Development Kit (DPDK) では、パフォーマンス集中型アプリケーションに対して、より高速のユーザー空間パケット処理フレームワークを提供します。 このフレームワークは、仮想マシンのカーネル ネットワーク スタックをバイパスします。

カーネル ネットワーク スタックを使用する一般的なパケット処理では、このプロセスは割り込み駆動型です。 ネットワーク インターフェイスが着信したパケットを受信すると、カーネル空間からユーザー空間へのパケットとコンテキスト切り替えを処理するカーネル割り込みが発生します。 DPDK では、コンテキスト切り替えと割り込み駆動型の手法を利用せずに、高速パケット処理にポーリング モードを使用するユーザー空間の実装を採用しています。

DPDK は、下位レベルのリソースへのアクセスを提供しているユーザー空間ライブラリのセットで構成されています。 これらのリソースには、ハードウェア、論理コア、メモリ管理、およびネットワーク インターフェイス カードのポーリング モードのドライバーを含めることができます。

DPDK は、複数のオペレーティング システムの配布をサポートしている Azure 仮想マシンで実行できます。 DPDK は、ネットワーク関数の仮想化の実装を推進するにあたって、重要なパフォーマンスの差別化を実現します。 これらの実装は、仮想ルーター、ファイアウォール、VPN、ロード バランサー、進化したパケット コア、およびサービス拒否 (DDoS) アプリケーションなどのネットワーク仮想アプライアンス (NVA) の形式を取ることができます。

MANA VM での DPDK のセットアップ手順の一覧については、Microsoft Azure ネットワーク アダプター (MANA) と Linux 上の DPDK に関するページを参照してください

長所

1 秒あたりのパケット数 (PPS) の向上: カーネルをバイパスしてユーザー空間でパケットを制御すると、コンテキスト切り替えが無くなることでサイクル数が減少します。 また、Azure Linux 仮想マシンで毎秒処理されるパケットのレートも向上します。

サポートされているオペレーティング システムの最小バージョン

Azure Marketplace の次のディストリビューションがサポートされています。

Linux OS カーネル バージョン
Ubuntu 18.04 4.15.0-1014-azure+
SLES 15 SP1 4.12.14-8.19-azure+
RHEL 7.5 3.10.0-862.11.6.el7.x86_64+
CentOS 7.5 3.10.0-862.11.6.el7.x86_64+
Debian 10 4.19.0-1-cloud+

記載されているバージョンは最小要件です。 より新しいバージョンもサポートされています。

MANA VM での DPDK の要件の一覧については、Microsoft Azure ネットワーク アダプター (MANA) と Linux 上の DPDK に関するページを参照してください

カスタムのカーネル サポート

一覧に示されていない Linux カーネルのバージョンについては、Azure で調整された Linux カーネルを作成するためのパッチに関するページを参照してください。 また、詳細情報については、aznetdpdk@microsoft.com にお問い合わせください。

リージョンのサポート

すべての Azure リージョンで DPDK をサポートしています。

前提条件

Linux 仮想マシン上で高速ネットワークを有効にする必要があります。 仮想マシンは、管理用の 1 つのインターフェイスに加えて、少なくとも 2 つのネットワーク インターフェイスを保持している必要があります。 管理インターフェイスで高速ネットワークを有効にすることは推奨されません。 高速ネットワークを有効にした Linux 仮想マシンを作成する方法について説明します。

さらに、DPDK は RDMA 動詞を使用して、ネットワーク アダプターにデータ キューを作成します。 VM で、正しい RDMA カーネル ドライバーが読み込まれたことを確認します。 これらは、VM のサイズに応じて、mlx4_ib、mlx5_ib、または mana_ib となります。

MANA VM での DPDK インストール手順については、Microsoft Azure ネットワーク アダプター (MANA) と Linux 上の DPDK に関するページを参照してください

ビルドの依存関係をインストールする

RHEL7.5/CentOS 7.5

yum -y groupinstall "Infiniband Support"
sudo dracut --add-drivers "mlx4_en mlx4_ib mlx5_ib" -f
yum install -y gcc kernel-devel-`uname -r` numactl-devel.x86_64 librdmacm-devel libmnl-devel meson

手動で DPDK をコンパイルしてインストールする

  1. 最新 DPDK をダウンロードします。 Azure には、バージョン 22.11 LTS 以降が推奨されます。

  2. meson builddir を使って既定の構成を構築します。

  3. ninja -C builddir を使ってコンパイルします。

  4. DESTDIR=<output folder> ninja -C builddir install を使ってインストールします。

ランタイム環境を構成する

再起動後に 1 回、次のコマンドを実行します。

  1. hugepage

    • NUMA ノードごとに 1 回ずつ次のコマンドを実行して、hugepage を構成します。
     echo 1024 | sudo tee /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages
    
    • mkdir /mnt/huge を使って、マウント用のディレクトリを作成します。

    • mount -t hugetlbfs nodev /mnt/huge を使って hugepage をマウントします。

    • grep Huge /proc/meminfo を使って、hugepage が予約されていることを確認します。

    • 上記の例は、2M の大型ページ用です。 1G の大型ページも使用できます。

    Note

    DPDK の手順に従って、hugepage がブートで予約されるように、grub ファイルを変更する方法があります。 ページの下部に手順があります。 Azure Linux 仮想マシンで実行している場合は、複数のリブートに及ぶ hugepage を予約するために、代わりに /etc/config/grub.d 下のファイルを変更してください。

  2. MAC および IP アドレス: ifconfig –a を使用して、ネットワーク インターフェイスの MAC および IP アドレスを表示します。 VF ネットワーク インターフェイスおよび NETVSC ネットワーク インターフェイスは、同一の MAC アドレスを保持しますが、NETVSC ネットワーク インターフェイスだけが IP アドレスを保持します。 VF インターフェイスは、NETVSC インターフェイスの下位インターフェイスとして実行されています。

  3. PCI アドレス

    • ethtool -i <vf interface name> を使って ethtool -i <vf interface name> で使用される PCI アドレスを調べます。

    • eth0 で高速ネットワークが有効化されている場合、testpmd が誤って eth0VF PCI デバイスを引き継ぐことのないようにしてください。 DPDK アプリケーションが誤って管理ネットワーク インターフェイスを引き継ぎ、SSH 接続が失われた場合、シリアル コンソールを使用して DPDK アプリケーションを停止します。 また、シリアル コンソールを使用して仮想マシンを停止または起動することもできます。

  4. modprobe -a ib_uverbs を使って、各リブートで ibuverbs を読み込みます。 SLES 15 の場合のみ、modprobe -a mlx4_ib を使って mlx4_ib も読み込みます。

マスター PMD

DPDK アプリケーションは、Azure で公開されたマスター PMD 経由で実行される必要があります。 VF PMD 経由でアプリケーションが直接実行される場合、一部のパケットは統合インターフェイス経由で表示されるので、VM を宛先とするすべてのパケットが受信されるわけではありません。 DPDK では、NetVSC PMD とフェールセーフ PMD の 2 種類のマスター PMD がサポートされています。 マスター PMD により、該当のアプリケーションを宛先とするすべてのパケットが、そのアプリケーションで受信されることが保証されます。 また、ホストがサービス提供されている場合に VF が取り消されたとしても、アプリケーションは確実に、マスター PMD 経由で引き続き DPDK モードで実行されます。

NetVSC PMD

NetVSC は、Azure のマスター PMD として実行するのに推奨される PMD です。 これにより、該当のアプリケーションを宛先とするすべてのパケットが、そのアプリケーションで受信されることが保証されます。 また、ホストがサービス提供されている場合に VF が取り消されたとしても、アプリケーションは確実に、引き続き DPDK モードで実行されます。 NetVSC PMD の使用方法と構成方法の詳細については、(https://doc.dpdk.org/guides/nics/netvsc.html) を参照してください。

フェールセーフの PMD

注: Azure では、フェールセーフ PMD で実行することは推奨されません。 DPDK バージョンが 22.11 LTS 以降の場合は、NetVSC PMD を使用することをお勧めします。

別の方法として、フェールセーフ PMD を介して DPDK アプリケーションを実行することもできます。 フェールセーフの PMD の詳細については、フェールセーフでのポーリング モードのドライバー ライブラリを参照してください。

testpmd を実行する

testpmd をルート モードで実行するには、sudo コマンドの前に sudo を使用します。

基本: サニティ チェック、フェールセーフ アダプターの初期化

  1. 次のコマンドを実行して、単一ポートの testpmd アプリケーションを起動します。

    testpmd -w <pci address from previous step> \
      -- -i \
      --port-topology=chained
    
  2. 次のコマンドを実行して、デュアル ポートの testpmd アプリケーションを起動します。

    testpmd -w <pci address nic1> \
    -w <pci address nic2> \
    -- -i
    

起動されたら、show port info all を実行してポート情報をチェックします。 net_netvsc になっている 1 つまたは 2 つの DPDK ポートを確認する必要があります。

  1. start <port> /stop <port> を使用してトラフィックを開始します。

上記のコマンドでは、対話モードで testpmd を開始しています。testpmd コマンドを試すためには、このモードが推奨されています。

基本: 単一の送信者/単一の受信者

次のコマンドは、毎秒のパケットの統計情報を定期的に出力します。

  1. TX 側で、次のコマンドを実行します。

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. RX 側で、次のコマンドを実行します。

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=rxonly \
      --eth-peer=<port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

仮想マシン上で上記のコマンドを実行する場合、コンパイルする前に仮想マシンの実際の IP アドレスと一致するように、app/test-pmd/txonly.cIP_SRC_ADDR および IP_DST_ADDR を変更します。 これを行わない場合、受信者に到着する前に、パケットが削除されます。

詳細: 単一の送信者/単一の転送者

次のコマンドは、毎秒のパケットの統計情報を定期的に出力します。

  1. TX 側で、次のコマンドを実行します。

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. FWD 側で、次のコマンドを実行します。

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address NIC1> \
      -w <pci address NIC2> \
      -- --nb-cores <number of cores to use for test pmd> \
      --forward-mode=io \
      --eth-peer=<recv port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

仮想マシン上で上記のコマンドを実行する場合、コンパイルする前に仮想マシンの実際の IP アドレスと一致するように、app/test-pmd/txonly.cIP_SRC_ADDR および IP_DST_ADDR を変更します。 これを行わない場合、転送者に到着する前に、パケットが削除されます。 testpmd 転送者はレイヤー 3 のアドレスを変更しないため、コードに変更を加えない限り、第 3 のマシンで転送されたトラフィックを受信することはできません。

sudo yum install -y dpdk

References