第7章 OVS-DPDK デプロイメントのプランニング

NFV 向けの OVS-DPDK デプロイメントを最適化するには、OVS-DPDK がコンピュートーノードのハードウェア (CPU、NUMA ノード、メモリー、NIC) をどのように使用するかと、コンピュートノードに応じた OVS-DPDK の各パラメーターを決定するにあたっての考慮事項を理解しておくべきです。

CPU と NUMA トポロジーの概要は 「NFV のパフォーマンスの考慮事項」 を参照してください。

7.1. CPU 分割と NUMA トポロジーを使用する OVS-DPDK

OVS-DPDK はホスト、ゲスト、および OVS-DPDK 自体用にハードウェアリソースを分割します。OVS-DPDK Poll Mode Driver (PMD) は、専用のコアを必要とする DPDK アクティブループを実行します。これは、CPU 一覧とヒュージページが OVS-DPDK で専用であることを意味します。

サンプルの分割では、デュアルソケットのコンピュートノード上の 1 NUMA ノードにつき 16 コアが含まれます。ホストと OVS-DPDK では NIC を共有できないので、このトラフィックには追加の NIC が必要です。

OpenStack NFV Hardware Capacities 464931 0118 OVS DPDK
注記

NUMA ノードに DPDK NIC が関連付けられていない場合でも、両方の NUMA ノードで DPDK PMD スレッドを確保する必要があります。

OVS-DPDK のパフォーマンスは、NUMA ノードにローカルなメモリーブロックの確保にも左右されます。メモリーと CPU ピニングに使用する同じ NUMA ノードに関連付けられた NIC を使用してください。また、ボンディングを構成する両方のインターフェースには、同じ NUMA ノード上の NIC を必ず使用してください。

7.2. ワークフローと派生パラメーターについての概要

重要

この機能は、本リリースでは テクノロジープレビュー として提供しているため、Red Hat では全面的にはサポートしていません。これは、テスト目的のみでご利用いただく機能で、実稼働環境にデプロイすべきではありません。テクノロジープレビューについての詳しい情報は「対象範囲の詳細」を参照してください。

OpenStack Workflow (mistral) サービスを使用すると、利用可能なベアメタルノードのケイパビリティーに基づいてパラメーターを派生することができます。Openstack Workflow は .yaml ファイルを使用して実行するタスクとアクションのセットを定義します。tripleo-common/workbooks/ ディレクトリーにある derive_params.yaml という事前定義済みのワークブックを使用することができます。このワークブックは、ベアメタルのイントロスペクションで取得した結果から、サポートされる各パラメーターを派生するワークフローを提供します。derive_params.yaml のワークフローは、tripleo-common/workbooks/derive_params_formulas.yaml の計算式を使用して、派生パラメーターを計算します。

注記

derive_params_formulas.yaml の計算式は、お使いの環境に応じて変更することができます。

derive_params.yaml ワークブックは、given composable ロール用の全ノードのハードウェア仕様が同じであることを前提としています。ワークフローは、フレーバーとプロファイルの関連付けと、nova の配置スケジューラーを考慮して、ロールに関連付けられたノードを照合し、そのロールと一致する最初のロールのイントロスペクションデータを使用します。

OpenStack のワークフローに関する詳細は、「workflow および execution のトラブルシューティング」を参照してください。

-p または --plan-environment-file オプションを使用して、カスタムの plan_environment.yaml ファイルを openstack overcloud deploy コマンドに追加することができます。カスタムの plan_environment.yaml ファイルは、ワークブックの一覧と、ワークブックに渡す値を指定します。トリガーされるワークフローは派生パラメーターをマージしてカスタムの plan_environment.yaml に戻し、オーバークラウドのデプロイメントに利用できるようになります。これらの派生パラメーターの結果を使用して、オーバークラウドのイメージを準備することができます。

デプロイメントでの --plan-environment-file オプションの使用方法に関する詳しい情報は、『プランの環境メタデータ』を参照してください。

7.3. OVS-DPDK の派生パラメーター

derive_params.yaml のワークフローは、ComputeNeutronOvsDpdk サービスを使用する、対応するロールに関連付けられた DPDK パラメーターを派生します。

ワークフローによって、 自動的に派生できる OVS-DPDK のパラメーターの一覧は以下のとおりです。

  • IsolCpusList
  • KernelArgs
  • NovaReservedHostMemory
  • NovaVcpuPinSet
  • OvsDpdkCoreList
  • OvsDpdkSocketMemory
  • OvsPmdCoreList

OvsDpdkMemoryChannels パラメーターは、イントロスペクションのメモリーバンクデータからは派生できません。これは、メモリースロット名の形式がハードウェア環境によって異なるためです。

大半の場合には、OvsDpdkMemoryChannels は 4 (デフォルト) です。ハードウェアのマニュアルを参照して 1 ソケットあたりのメモリーチャネル数を確認し、その値でデフォルト値をオーバーライドしてください。

設定の詳細については、「ワークフローを使用した DPDK パラメーターの算出」を参照してください。

7.4. 手動で計算した OVS-DPDK のパラメーターについての概要

本項では、OVS-DPDK が director の network_environment.yaml HEAT テンプレート内のパラメーターを使用して CPU とメモリーを設定し、パフォーマンスを最適化する方法について説明します。この情報は、コンピュートノード上のハードウェアサポートと、そのハードウェアを分割して OVS-DPDK デプロイメントを最適化する最も有効な方法を評価するのに使用してください。

注記

derived_parameters.yaml ワークフローを使用してこれらのパラメーターの値を自動生成した場合には、手動で計算する必要はありません。「ワークフローと派生パラメーターについての概要」を参照してください。

注記

CPU コアを割り当てる際には必ず、同じ物理コア上の CPU シブリングスレッド (論理 CPU) をペアにしてください。

コンピュートノード上の CPU と NUMA ノードを特定するには、「NUMA ノードのトポロジーについての理解」を参照してください。この情報を使用して、CPU と他のパラメーターをマッピングして、ホスト、ゲストインスタンス、OVS-DPDK プロセスのニーズに対応します。

7.4.1. CPU パラメーター

OVS-DPDK は以下の CPU 分割パラメーターを使用します。

OvsPmdCoreList

DPDK Poll Mode Driver (PMD) に使用する CPU コアを提供します。DPDK インターフェースのローカルの NUMA ノードに関連付けられた CPU コアを選択します。OvsPmdCoreList は、Open vSwitch の pmd-cpu-mask の値に使用されます。

  • シブリングスレッドをペアにします。
  • OvsDpdkCoreList からすべてのコアを除外します。
  • 両方の NUMA ノード上の 1 番目の物理コアの論理 CPU (両方のスレッドシブリング) が割り当てられないようにしてください。これらは、OvsDpdkCoreList パラメーターに使用する必要があります。
  • パフォーマンスは、この PMD コアリストに割り当てられている物理コアの数によって異なります。DPDK 用の NIC に関連付けられている NUMA ノードで、必要なコアを割り当てます。
  • DPDK 用の NIC が 1 つある NUMA ノードの場合:

    • パフォーマンス要件に基づいて、必要な物理コア数を決定し、各物理コアに全シブリングスレッド (論理 CPU) を追加します。
  • DPDK 用の NIC がない NUMA ノードの場合:

    • 1 つの物理コアのシブリングスレッド (論理 CPU) を割り当てます (NUMA ノードの 1 番目の物理コアを除く)。DPDK 用の NIC がない場合でも、ゲストインスタンス作成が失敗するのを回避するために、NUMA ノード上に最小限の DPDK Poll Mode Driver が必要です。
注記

NUMA ノードに DPDK NIC が関連付けられていない場合でも、両方の NUMA ノードで DPDK PMD スレッドを確保する必要があります。

NovaVcpuPinSet

CPU ピニング用のコアを設定します。コンピュートノードは、ゲストインスタンスにこれらのコアを使用します。NovaVcpuPinSetnova.conf ファイルの vcpu_pin_set 値として使用されます。

  • OvsPmdCoreListOvsDpdkCoreList からすべてのコアを除外します。
  • 残りのコアをすべて追加します。
  • シブリングスレッドをペアにします。
IsolCpusList

ホストのプロセスから分離される CPU コアのセット。このパラメーターは、tuned-profiles-cpu-partitioning コンポーネント用の cpu-partitioning-variable.conf ファイルの isolated_cores 値として使用されます。

  • OvsPmdCoreListNovaVcpuPinSet のコア一覧が一致するようにします。
  • シブリングスレッドをペアにします。
OvsDpdkCoreList

handler および revalidator スレッドなどの、データパス以外の OVS-DPDK プロセス用の CPU コアを提供します。このパラメーターは、マルチ NUMA ノードハードウェア上でのデータパスの全体的なパフォーマンスには影響は及ぼしません。このパラメーターは Open vSwitch の dpdk-lcore-mask 値に使用され、それらのコアはホストと共有されます。

  • 各 NUMA ノードから、1 番目のコア (およびシブリングスレッド) を割り当てます (NUMA に関連付けられている DPDK 用の NIC がない場合も)。
  • これらのコアは、OvsPmdCoreList および NovaVcpuPinSet のコアの一覧と相互に排他的である必要があります。

7.4.2. メモリーパラメーター

OVS-DPDK は、以下のメモリーパラメーターを使用します。

OvsDpdkMemoryChannels

NUMA ノードごとに、CPU 内のメモリーチャネルをマッピングします。OvsDpdkMemoryChannels パラメーターは Open vSwitch により other_config:dpdk-extra=”-n <value>” 値として使用されます。

  • dmidecode -t memory のコマンドを使用するか、お使いのハードウェアのマニュアルを参照して、利用可能なメモリーチャネルの数を確認します。
  • ls /sys/devices/system/node/node* -d のコマンドで NUMA ノードの数を確認します。
  • 利用可能なメモリーチャネル数を NUMA ノード数で除算します。
NovaReservedHostMemory

ホスト上のタスク用にメモリーを MB 単位で確保します。この値は、コンピュートノードにより nova.confreserved_host_memory_mb 値として使用されます。

  • 静的な推奨値 4096 MB を使用します。
OvsDpdkSocketMemory

NUMA ノードごとにヒュージページプールから事前に割り当てるメモリーの容量を MB 単位で指定します。この値は、Open vSwitch により other_config:dpdk-socket-mem 値として使用されます。

  • コンマ区切りリストで指定します。OvsDpdkSocketMemory 値は NUMA ノード上の各 NIC の MTU 値から計算されます。
  • DPDK NIC のない NUMA ノードの場合は、推奨される静的な値である 1024 MB (1GB) を使用します。
  • OvsDpdkSocketMemory の値は、以下の等式で概算します。

    • MEMORY_REQD_PER_MTU = (ROUNDUP_PER_MTU + 800) * (4096 * 64) Bytes

      • 800 はオーバーヘッドの値です。
      • 4096 * 64 は mempool 内のパケット数です。
  • NUMA ノードで設定される各 MTU 値の MEMORY_REQD_PER_MTU を追加し、バッファーとして 512 MB をさらに加算します。その値を 1024 の倍数に丸めます。

計算例: MTU 2000 および MTU 9000

DPDK NIC dpdk0 と dpdk1 は同じ NUMA ノード上にあり、それぞれ MTU 9000 と MTU 2000 で設定されています。必要なメモリーを算出する計算例を以下に示します。

  1. MTU 値を 1024 バイトの倍数に丸めます。

    MTU 値 9000 は、丸めると 9216 バイトになります。
    MTU 値 2000 は、丸めると 2048 バイトになります。
  2. それらの丸めたバイト値に基づいて、各 MTU 値に必要なメモリーを計算します。

    MTU 値 9000 に必要なメモリー = (9216 + 800) * (4096*64) = 2625634304
    MTU 値 2000 に必要なメモリー = (2048 + 800) * (4096*64) = 746586112
  3. それらを合わせた必要なメモリーの合計を計算します (バイト単位)。

    2625634304 + 746586112 + 536870912 = 3909091328 バイト

    この計算は、 (MTU 値 9000 に必要なメモリー) + (MTU 値 2000 に必要なメモリー) + (512 MB バッファー) を示しています。

  4. 必要合計メモリーを MB に変換します。

    3909091328 / (1024*1024) = 3728 MB
  5. この値を 1024 の倍数に丸めます。

    3724 MB を丸めると 4096 MB になります。
  6. この値を使用して OvsDpdkSocketMemory を設定します。

        OvsDpdkSocketMemory: “4096,1024”

サンプルの計算 - MTU 2000

DPDK NIC dpdk0 と dpdk1 は同じ NUMA ノード 0 上にあり、それぞれ MTU 2000 と MTU 2000 で設定されています。必要なメモリーを算出する計算例を以下に示します。

  1. MTU 値を 1024 バイトの倍数に丸めます。

    MTU 値 2000 は 2048 バイトになります。
  2. それらの丸めたバイト値に基づいて、各 MTU 値に必要なメモリーを計算します。

    MTU 値 2000 に必要なメモリー = (2048 + 800) * (4096*64) = 746586112
  3. それらを合わせた必要なメモリーの合計を計算します (バイト単位)。

    746586112 + 536870912 = 1283457024 バイト

    この計算は、(MTU 値 2000 に必要なメモリー) + (512 MB バッファー) を示しています。

  4. 必要合計メモリーを MB に変換します。

    1283457024 / (1024*1024) = 1224 MB
  5. この値を 1024 の倍数に丸めます。

    1224 MB を丸めると 2048 MB になります。
  6. この値を使用して OvsDpdkSocketMemory を設定します。

        OvsDpdkSocketMemory: “2048,1024”

7.4.3. ネットワークパラメーター

NeutronDpdkDriverType
DPDK によって使用されるドライバーの種別を設定します。vfio-pci のデフォルト値を使用してください。
NeutronDatapathType
OVS ブリッジ用のデータパスの種別を設定します。DPDK は netdev のデフォルト値を使用してください。
NeutronVhostuserSocketDir
OVS 向けに vhost-user ソケットディレクトリーを設定します。vhost クライアントモード用の /var/lib/vhost_sockets を使用してください。

7.4.4. その他のパラメーター

NovaSchedulerDefaultFilters
要求されたゲストインスタンスに対してコンピュートノードが使用するフィルターの順序付きリストを指定します。
KernelArgs

コンピュートノードのブート時用に、複数のカーネル引数を /etc/default/grub に指定します。設定に応じて、以下のパラメーターを追加します。

  • hugepagesz: CPU 上のヒュージページのサイズを設定します。この値は、CPU のハードウェアによって異なります。OVS-DPDK デプロイメントには 1G に指定します (default_hugepagesz=1GB hugepagesz=1G)。pdpe1gb CPU フラグが出力されるかどうかをチェックして、CPU が 1G をサポートしていることを確認してください。

    lshw -class processor | grep pdpe1gb
  • hugepages count: ヒュージページの数を設定します。この値は、ホストの使用可能なメモリーの量によって異なります。利用可能なメモリーの大半を使用してください (NovaReservedHostMemory を除く)。ヒュージページ数の値は、お使いのコンピュートノードに関連付けられている OpenStack フレーバーの範囲内で設定する必要もあります。
  • iommu: Intel CPU の場合は、“intel_iommu=on iommu=pt”` を追加します。
  • isolcpus: チューニングされる CPU コアを設定します。この値は IsolCpusList と一致します。

7.5. 2 NUMA ノード構成の OVS-DPDK デプロイメントの例

本項に例示するコンピュートノードは、以下のような 2 つの NUMA ノードで構成されます。

  • NUMA 0 にはコア 0-7 があり、シブリングスレッドペアは (0,1)、(2,3)、(4,5)、(6,7)。
  • NUMA 1 にはコア 8-15 があり、シブリングスレッドペアは (8,9)、(10,11)、(12,13)、 (14,15)。
  • 各 NUMA ノードが物理 NIC (NUMA 0 上の NIC1 と NUMA 1 上の NIC2) に接続されている。
OpenStack NFV NUMA Nodes 453316 0717 ECE OVS DPDK Deployment
注記

各 NUMA ノード上の 1 番目の物理コアの両スレッドペア (0、1 および 8、9) は、データパス以外の DPDK プロセス (OvsDpdkCoreList) 用に確保します。

この例では、MTU が 1500 に設定されており、全ユースケースで OvsDpdkSocketMemory が同じであることも前提です。

OvsDpdkSocketMemory: “1024,1024”

NIC 1 は DPDK 用で、1 つの物理コアは PMD 用です。

このユースケースでは、PMD 用の NUMA 0 に物理コアを 1 つ 割り当てます。NUMA 1 ノードでは NIC に DPDK が有効化されていませんが、NUMA 1 にも物理コアを 1 つ割り当てる必要があります。残りのコア (OvsDpdkCoreList 用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。

OvsPmdCoreList: “2,3,10,11”
NovaVcpuPinSet: “4,5,6,7,12,13,14,15”

NIC 1 は DPDK 用で、2 つの物理コアは PMD 用

このユースケースでは、PMD 用の NUMA 0 に物理コアを 2 つ 割り当てます。NUMA 1 ノードでは NIC に DPDK が有効化されていませんが、NUMA 1 にも物理コアを 1 つ割り当てる必要があります。残りのコア (OvsDpdkCoreList 用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。

OvsPmdCoreList: “2,3,4,5,10,11”
NovaVcpuPinSet: “6,7,12,13,14,15”

NIC 2 は DPDK 用で、1 つの物理コアは PMD 用です。

このユースケースでは、PMD 用の NUMA 1 に物理コアを 1 つ 割り当てます。NUMA 0 ノードでは NIC に DPDK が有効化されていませんが、NUMA 0 にも物理コアを 1 つ割り当てる必要があります。残りのコア (OvsDpdkCoreList 用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。

OvsPmdCoreList: “2,3,10,11”
NovaVcpuPinSet: “4,5,6,7,12,13,14,15”

NIC 2 は DPDK 用で、2 つの物理コアは PMD 用

このユースケースでは、PMD 用の NUMA 1 に物理コアを 2 つ 割り当てます。NUMA 0 ノードでは NIC に DPDK が有効化されていませんが、NUMA 0 にも物理コアを 1 つ割り当てる必要があります。残りのコア (OvsDpdkCoreList 用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。

OvsPmdCoreList: “2,3,10,11,12,13”
NovaVcpuPinSet: “4,5,6,7,14,15”

NIC 1 と NIC2 は DPDK 用で、2 つの物理コアは PMD 用

このユースケースでは、PMD 用の各 NUMA ノードに物理コアを 2 つ 割り当てます。残りのコア (OvsDpdkCoreList 用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。

OvsPmdCoreList: “2,3,4,5,10,11,12,13”
NovaVcpuPinSet: “6,7,14,15”

7.6. NFV OVS-DPDK デプロイメントのトポロジー

この例の OVS-DPDK デプロイメントは 2 つの VNF で構成され、それぞれに 2 つのインターフェース (mgt で示されている管理インターフェースとデータプレーンインターフェース) があります。OVS-DPDK デプロイメントでは、VNF は、物理インターフェースをサポートする組み込みの DPDK で稼働します。OVS-DPDK は、vSwitch レベルでボンディングを管理します。OVS-DPDK デプロイメントでは、カーネルと OVS-DPDK の NIC を 混在させない ことを推奨します。混在させた場合には、パフォーマンスが低下する可能性があります。仮想マシン向けのベースプロバイダーネットワークに接続された管理 (mgt) ネットワークを分離するには、追加の NIC があることを確認する必要があります。コンピュートノードは、OpenStack API 管理向けの標準の NIC 2 つで構成されます。これは、Ceph API で再利用できますが、OpenStack テナントとは一切共有できません。

NFV OVS-DPDK deployment

NFV OVS-DPDK のトポロジー

以下の図には、NFV ユースケース向けの OVS_DPDK のトポロジーを示しています。この環境は、1 Gbps または 10 の 1 Gbps の NIC を搭載したコンピュートノードおよびコントローラーノードと、director ノードで構成されます。

NFV OVS-DPDK Topology