Red Hat Training
A Red Hat training course is available for Red Hat OpenStack Platform
第6章 OVS-DPDK デプロイメントのプランニング
NFV 向けの OVS-DPDK デプロイメントを最適化するには、OVS-DPDK がコンピュートーノードのハードウェア (CPU、NUMA ノード、メモリー、NIC) をどのように使用するかと、コンピュートノードに応じた OVS-DPDK の各パラメーターを決定するにあたっての考慮事項を理解しておくべきです。
CPU と NUMA トポロジーの概要は 「NFV Performance Considerations」 を参照してください。
6.1. OVS-DPDK での CPU 分割と NUMA トポロジーの使用方法
OVS-DPDK はホスト、ゲスト、および OVS-DPDK 自体用にハードウェアリソースを分割します。OVS-DPDK Poll Mode Driver (PMD) は、専用のコアを必要とする DPDK アクティブループを実行します。これは、CPU 一覧とヒュージページが OVS-DPDK で専用であることを意味します。
サンプルの分割では、デュアルソケットのコンピュートノード上の 1 NUMA ノードにつき 18 コアが含まれます。ホストと OVS-DPDK では NIC を共有できないので、このトラフィックには追加の NIC が必要です。
OVS-DPDK のパフォーマンスは、NUMA ノードにローカルなメモリーブロックの確保にも左右されます。メモリーと CPU ピニングに使用する同じ NUMA ノードに関連付けられた NIC を使用してください。また、ボンディングを構成する両方のインターフェースには、同じ NUMA ノード上の NIC を必ず使用してください。
6.2. OVS-DPDK のパラメーターについての理解
本項では、OVS-DPDK が director の network_environment.yaml
HEAT テンプレート内のパラメーターを使用して CPU とメモリーを設定し、パフォーマンスを最適化する方法について説明します。この情報は、コンピュートノード上のハードウェアサポートと、そのハードウェアを分割して OVS-DPDK デプロイメントを最適化する最も有効な方法を評価するのに使用してください。
CPU コアを割り当てる際には必ず、同じ物理コア上の CPU シブリングスレッド (論理 CPU) をペアにしてください。
コンピュートノード上の CPU と NUMA ノードを特定するには、「NUMA ノードのトポロジーについての理解」を参照してください。この情報を使用して、CPU と他のパラメーターをマッピングして、ホスト、ゲストインスタンス、OVS-DPDK プロセスのニーズに対応します。
6.2.1. CPU パラメーター
OVS-DPDK は以下の CPU 分割パラメーターを使用します。
- NeutronDpdkCoreList
DPDK Poll Mode Driver (PMD) に使用する CPU コアを提供します。DPDK インターフェースのローカルの NUMA ノードに関連付けられた CPU コアを選択します。
NeutronDpdkCoreList
は、Open vSwitch のpmd-cpu-mask
の値に使用されます。- シブリングスレッドをペアにします。
-
HostCpusList
からすべてのコアを除外します。 -
両方の NUMA ノード上の 1 番目の物理コアの論理 CPU が割り当てられないようにしてください。これらは、
HostCpusList
パラメーターに使用する必要があります。 - パフォーマンスは、この PMD コアリストに割り当てられている物理コアの数によって異なります。DPDK 用の NIC に関連付けられている NUMA ノードで、必要なコアを割り当てます。
DPDK 用の NIC が 1 つある NUMA ノードの場合:
- パフォーマンス要件に基づいて、必要な物理コア数を決定し、各物理コアに全シブリングスレッド (論理 CPU) を追加します。
DPDK 用の NIC がない NUMA ノードの場合:
- 1 つの物理コアのシブリングスレッド (論理 CPU) を割り当てます (NUMA ノードの 1 番目の物理コアを除く)。DPDK 用の NIC がない場合でも、ゲストインスタンス作成が失敗するのを回避するために、NUMA ノード上に最小限の DPDK Poll Mode Driver が必要です。
- NovaVcpuPinSet
CPU ピニング用のコアを設定します。コンピュートノードは、ゲストインスタンスにこれらのコアを使用します。
NovaVcpuPinSet
はnova.conf
ファイルのvcpu_pin_set
値として使用されます。-
NeutronDpdkCoreList
およびHostCpusList
からすべてのコアを除外します。 - 残りのコアをすべて追加します。
- シブリングスレッドをペアにします。
-
- HostIsolatedCpuList
ホストのプロセスから分離される CPU コアのセット。このパラメーターは、
tuned-profiles-cpu-partitioning
コンポーネント用のcpu-partitioning-variable.conf
ファイルのisolated_cores
値として使用されます。-
NeutronDpdkCoreList
とNovaVcpuPinSet
のコア一覧が一致するようにします。 - シブリングスレッドをペアにします。
-
- HostCpusList
handler および revalidator スレッドなどの、データパス以外の OVS-DPDK プロセス用の CPU コアを提供します。このパラメーターは、マルチ NUMA ノードハードウェア上でのデータパスの全体的なパフォーマンスには影響は及ぼしません。このパラメーターは Open vSwitch の
dpdk-lcore-mask
値に使用されます。- 各 NUMA ノードから、1 番目のコア (およびシブリングスレッド) を割り当てます (NUMA に関連付けられている DPDK 用の NIC がない場合も)。
-
これらのコアは、
NeutronDpdkCoreList
およびNovaVcpuPinSet
のコアの一覧と相互に排他的である必要があります。
6.2.2. メモリーパラメーター
OVS-DPDK は、以下のメモリーパラメーターを使用します。
- NeutronDpdkMemoryChannels
NUMA ノードごとに、CPU 内のメモリーチャネルをマッピングします。
NeutronDpdkMemoryChannels
パラメーターは Open vSwitch によりother_config:dpdk-extra=”-n <value>”
値として使用されます。-
dmidecode -t memory
のコマンドで利用可能なメモリーチャネルの数を確認します。 -
ls /sys/devices/system/node/node* -d
のコマンドで NUMA ノードの数を確認します。 - 利用可能なメモリーチャネル数を NUMA ノード数で除算します。
-
- NeutronDpdkSocketMemory
NUMA ノードごとにヒュージページプールから事前に割り当てるメモリーの容量を MB 単位で指定します。この値は、Open vSwitch により
other_config:dpdk-socket-mem
値として使用されます。-
コンマ区切りリストで指定します。たとえば、DPDK PMD (
NeutronDpdkCoreList
) が 2 つの NUMA ノードを使用する場合には、NeutronDpdkSocketMemory
の設定は 1024,1024 となります。 DPDK 用の NIC が 1 つある NUMA ノードの場合:
-
この値は、
compute.yaml
HEAT テンプレートで定義されている DPDK インターフェースの MTU 値によって異なります。 - NUMA ノードの値 = (PER_MTU + 800) * (4096 * 64)。1 GB 未満を切り上げます。
- 800 はオーバーヘッドの値です。
- 4096 * 64 は mempool 内のパケット数です。
-
この値は、
DPDK 用の NIC がない NUMA ノードの場合:
- 静的な推奨値 1024 MB (1 GB) を使用します。
-
コンマ区切りリストで指定します。たとえば、DPDK PMD (
以下に例を示します。
- NUMA ノード 1 上に DPDK 用の NIC が 1 つあり MTU が 9000 の場合:
OvsDpdkSocketMemory: “1024,4096”
- NUMA ノード 0 上に DPDK 用の NIC が 1 つあり MTU が 9000 で、NUMA ノード 1 上に DPDK 用の NIC が 1 つあり MTU が 9000 の場合:
OvsDpdkSocketMemory: “4096,4096”
- NovaReservedHostMemory
ホスト上のタスク用にメモリーを MB 単位で確保します。この値は、コンピュートノードにより
nova.conf
のreserved_host_memory_mb
値として使用されます。- 静的な推奨値 4096 MB を使用します。
6.2.3. ネットワークパラメーター
- NeutronDpdkDriverType
-
DPDK によって使用されるドライバーの種別を設定します。
vfio-pci
のデフォルト値を使用してください。 - NeutronDatapathType
-
OVS ブリッジ用のデータパスの種別を設定します。DPDK は
netdev
のデフォルト値を使用してください。 - NeutronVhostuserSocketDir
-
OVS 向けに vhost-user ソケットディレクトリーを設定します。vhost クライアントモード用の
/var/lib/vhost_sockets
を使用してください。
6.2.4. その他のパラメーター
- NovaSchedulerDefaultFilters
- 要求されたゲストインスタンスに対してコンピュートノードが使用するフィルターの順序付きリストを指定します。
- ComputeKernelArgs
コンピュートノードのブート時用に、複数のカーネル引数を
/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 コアを設定します。この値はHostIsolatedCpuList
と一致します。
6.3. 2 NUMA ノード構成の OVS-DPDK デプロイメントの例
本項に例示するコンピュートノードは、以下のような 2 つの NUMA ノードで構成されます。
- NUMA 0 にはコア 0-7 がある (コア 1、3、5、7 はシブリングスレッド)。
- NUMA 1 にはコア 8-15 がある (コア 9、11、13、15 はシブリングスレッド)。
- 各 NUMA ノードが物理 NIC (NUMA 0 上の NIC1 と NUMA 1 上の NIC2) に接続されている。
各 NUMA ノード上の 1 番目の物理コア (0、1 および 8、9) は、データパス以外の DPDK プロセス (HostCpusList
) 用に確保します。
この例では、MTU が 1500 に設定されており、全ユースケースで OvsDpdkSocketMemory
が同じであることも前提です。
OvsDpdkSocketMemory: “1024,1024”
NIC 1 は DPDK 用で、1 つの物理コアは PMD 用です。
このユースケースでは、PMD 用の NUMA 0 に物理コアを 1 つ 割り当てます。NUMA 1 ノードでは NIC に DPDK が有効化されていませんが、NUMA 1 にも物理コアを 1 つ割り当てる必要があります。残りのコア (HostCpusList
用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
NeutronDpdkCoreList: “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 つ割り当てる必要があります。残りのコア (HostCpusList
用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
NeutronDpdkCoreList: “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 つ割り当てる必要があります。残りのコア (HostCpusList
用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
NeutronDpdkCoreList: “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 つ割り当てる必要があります。残りのコア (HostCpusList
用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
NeutronDpdkCoreList: “2,3,10,11,12,13” NovaVcpuPinSet: “4,5,6,7,14,15”
NIC 1 と NIC2 は DPDK 用で、2 つの物理コアは PMD 用
このユースケースでは、PMD 用の各 NUMA ノードに物理コアを 2 つ 割り当てます。残りのコア (HostCpusList
用に確保されていないコア) はゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
NeutronDpdkCoreList: “2,3,4,5,10,11,12,13” NovaVcpuPinSet: “6,7,14,15”
6.4. 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 のトポロジー
以下の図には、NFV のユースケース向けの OVS_DPDK のトポロジーを示しています。この環境は、1 Gbps または 10 の 1 Gbps の NIC を搭載したコンピュートノードおよびコントローラーノードと、director ノードで構成されます。