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 コアを選択します。OVS の
pmd-cpu-maskの値にOvsPmdCoreListを使用します。OvsPmdCoreListに関する以下の推奨事項に従ってください。- シブリングスレッドをペアにします。
- パフォーマンスは、この PMD コアリストに割り当てられている物理コアの数によって異なります。DPDK NIC に関連付けられている NUMA ノードで、必要なコアを割り当てます。
- DPDK NIC を持つ NUMA ノードの場合には、パフォーマンス要件に基づいて、必要な物理コア数を決定し、各物理コアの全シブリングスレッド (あるいは論理 CPU) を追加します。
- DPDK NIC を持たない NUMA ノードの場合には、任意の物理コア (ただし NUMA ノードの 1 番目の物理コアを除く) のシブリングスレッド (あるいは論理 CPU) を割り当てます。
NUMA ノードに DPDK NIC が関連付けられていない場合でも、両方の NUMA ノードで DPDK PMD スレッドを確保する必要があります。
- NovaComputeCpuDedicatedSet
ピニングされたインスタンス CPU のプロセスをスケジューリングできる物理ホスト CPU 番号のコンマ区切りリストまたは範囲。たとえば、
NovaComputeCpuDedicatedSet: [4-12,^8,15]は、コア 4 - 12 の範囲 (ただし 8 を除く) および 15 を確保します。-
OvsPmdCoreListのコアをすべて除外します。 - 残りのコアをすべて追加します。
- シブリングスレッドをペアにします。
-
- NovaComputeCpuSharedSet
- 物理ホスト CPU 番号のコンマ区切りリストまたは範囲。インスタンスエミュレータースレッド用のホスト CPU を決定するのに使用します。
- IsolCpusList
ホストのプロセスから分離される CPU コアのセット。
IsolCpusListは、tuned-profiles-cpu-partitioningコンポーネント用のcpu-partitioning-variable.confファイルのisolated_coresの値として使用されます。IsolCpusListに関する以下の推奨事項に従ってください。-
OvsPmdCoreListおよびNovaComputeCpuDedicatedSetのコアリストと一致するようにします。 - シブリングスレッドをペアにします。
-
- DerivePciWhitelistEnabled
仮想マシン用に Virtual Function (VF) を確保するには、
NovaPCIPassthroughパラメーターを使用して Nova に渡される VF のリストを作成します。リストから除外された VF は、引き続きホスト用に利用することができます。リスト内の VF ごとに、アドレス値に解決する正規表現でアドレスパラメーターを反映させます。
手動でリストを作成するプロセスの例を以下に示します。
eno2という名前のデバイスで NIC の分割が有効な場合は、以下のコマンドで VF の PCI アドレスをリスト表示します。[heat-admin@compute-0 ~]$ ls -lh /sys/class/net/eno2/device/ | grep virtfn lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn0 -> ../0000:18:06.0 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn1 -> ../0000:18:06.1 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn2 -> ../0000:18:06.2 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn3 -> ../0000:18:06.3 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn4 -> ../0000:18:06.4 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn5 -> ../0000:18:06.5 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn6 -> ../0000:18:06.6 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn7 -> ../0000:18:06.7この場合、VF 0、4、および 6 が NIC の分割用に
eno2で使用されます。以下の例に示すように、NovaPCIPassthroughを手動で設定して VF 1 - 3、5、および 7 を含めます。したがって、VF 0、4、および 6 は除外します。NovaPCIPassthrough: - physical_network: "sriovnet2" address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[1-3]"} - physical_network: "sriovnet2" address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[5]"} - physical_network: "sriovnet2" address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[7]"}
7.4.2. メモリーパラメーター リンクのコピーリンクがクリップボードにコピーされました!
OVS-DPDK は、以下のメモリーパラメーターを使用します。
- OvsDpdkMemoryChannels
NUMA ノードごとに、CPU 内のメモリーチャネルをマッピングします。
OvsDpdkMemoryChannelsは、OVS のother_config:dpdk-extra="-n <value>"の値に使用されます。OvsDpdkMemoryChannelsに関する以下の推奨事項を確認してください。-
dmidecode -t memoryのコマンドを使用するか、お使いのハードウェアのマニュアルを参照して、利用可能なメモリーチャネルの数を確認します。 -
ls /sys/devices/system/node/node* -dのコマンドで NUMA ノードの数を確認します。 - 利用可能なメモリーチャネル数を NUMA ノード数で除算します。
-
- NovaReservedHostMemory
ホスト上のタスク用にメモリーを MB 単位で確保します。
NovaReservedHostMemoryは、Compute ノードのnova.confのreserved_host_memory_mbの値に使用されます。NovaReservedHostMemoryに関する以下の推奨事項を確認してください。- 静的な推奨値 4096 MB を使用します。
- OvsDpdkSocketMemory
NUMA ノードごとにヒュージページプールから事前に割り当てるメモリーの容量を MB 単位で指定します。
OvsDpdkSocketMemoryは、OVS のother_config:dpdk-socket-memの値に使用されます。OvsDpdkSocketMemoryに関する以下の推奨事項を確認してください。- コンマ区切りリストで指定します。
- DPDK NIC のない NUMA ノードの場合は、推奨される静的な値である 1024 MB (1 GB) を使用します。
-
NUMA ノード上の各 NIC の MTU 値から、
OvsDpdkSocketMemoryの値を計算します。 OvsDpdkSocketMemoryの値は、以下の式で概算します。MEMORY_REQD_PER_MTU = (ROUNDUP_PER_MTU + 800) x (4096 x 64) バイト
- 800 はオーバーヘッドの値です。
- 4096 x 64 は mempool 内のパケット数です。
- NUMA ノードで設定される各 MTU 値の MEMORY_REQD_PER_MTU を追加し、バッファーとして 512 MB をさらに加算します。その値を 1024 の倍数に丸めます。
計算例: MTU 2000 および MTU 9000
DPDK NIC dpdk0 と dpdk1 は同じ NUMA ノード 0 上にあり、それぞれ MTU 9000 と MTU 2000 で設定されています。必要なメモリーを算出する計算例を以下に示します。
MTU 値を 1024 バイトの倍数に丸めます。
The MTU value of 9000 becomes 9216 bytes. The MTU value of 2000 becomes 2048 bytes.それらの丸めたバイト値に基づいて、各 MTU 値に必要なメモリーを計算します。
Memory required for 9000 MTU = (9216 + 800) * (4096*64) = 2625634304 Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112それらを合わせた必要なメモリーの合計を計算します (バイト単位)。
2625634304 + 746586112 + 536870912 = 3909091328 bytes.この計算は、(MTU 値 9000 に必要なメモリー) + (MTU 値 2000 に必要なメモリー) + (512 MB バッファー) を示しています。
必要合計メモリーを MB に変換します。
3909091328 / (1024*1024) = 3728 MB.この値を 1024 の倍数に丸めます。
3724 MB rounds up to 4096 MB.この値を使用して
OvsDpdkSocketMemoryを設定します。OvsDpdkSocketMemory: "4096,1024"
計算例: MTU 2000
DPDK NIC dpdk0 と dpdk1 は同じ NUMA ノード 0 上にあり、共に 2000 の MTU が設定されています。必要なメモリーを算出する計算例を以下に示します。
MTU 値を 1024 バイトの倍数に丸めます。
The MTU value of 2000 becomes 2048 bytes.それらの丸めたバイト値に基づいて、各 MTU 値に必要なメモリーを計算します。
Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112それらを合わせた必要なメモリーの合計を計算します (バイト単位)。
746586112 + 536870912 = 1283457024 bytes.この計算は、(MTU 値 2000 に必要なメモリー) + (512 MB バッファー) を示しています。
必要合計メモリーを MB に変換します。
1283457024 / (1024*1024) = 1224 MB.この値を 1024 の倍数に丸めます。
1224 MB rounds up to 2048 MB.この値を使用して
OvsDpdkSocketMemoryを設定します。OvsDpdkSocketMemory: "2048,1024"
7.4.3. ネットワークパラメーター リンクのコピーリンクがクリップボードにコピーされました!
- OvsDpdkDriverType
-
DPDK によって使用されるドライバーの種別を設定します。
vfio-pciのデフォルト値を使用してください。 - NeutronDatapathType
-
OVS ブリッジ用のデータパスの種別を設定します。DPDK は
netdevのデフォルト値を使用してください。 - NeutronVhostuserSocketDir
-
OVS 向けに vhost-user ソケットディレクトリーを設定します。vhost クライアントモード用の
/var/lib/vhost_socketsを使用してください。
7.4.4. その他のパラメーター リンクのコピーリンクがクリップボードにコピーされました!
- NovaSchedulerDefaultFilters
- 要求されたゲストインスタンスに対してコンピュートノードが使用するフィルターの順序付きリストを指定します。
- VhostuserSocketGroup
-
vhost-user ソケットディレクトリーのグループを設定します。デフォルト値は
qemuです。VhostuserSocketGroupをhugetlbfsに設定します。これにより、ovs-vswitchdおよびqemuプロセスが、共有ヒュージページおよび virtio-net デバイスを設定する unix ソケットにアクセスすることができます。この値はロールに固有で、OVS-DPDK を利用するすべてのロールに適用する必要があります。 - KernelArgs
Compute ノードのブート時用に、複数のカーネル引数を
/etc/default/grubに指定します。設定に応じて、以下の値を追加します。hugepagesz: CPU 上のヒュージページのサイズを設定します。この値は、CPU のハードウェアによって異なります。OVS-DPDK デプロイメントには 1G に指定します (default_hugepagesz=1GB hugepagesz=1G)。このコマンドを使用してpdpe1gbCPU フラグが出力されるかどうかをチェックして、CPU が 1 G をサポートしていることを確認してください。lshw -class processor | grep pdpe1gb-
hugepages count: 利用可能なホストメモリーに基づいてヒュージページの数を設定します。利用可能なメモリーの大半を使用してください (NovaReservedHostMemoryを除く)。ヒュージページ数の値は、Compute ノードのフレーバーの範囲内で設定する必要もあります。 -
iommu: Intel CPU の場合は、"intel_iommu=on iommu=pt"を追加します。 -
isolcpus: チューニングする CPU コアを設定します。この値はIsolCpusListと一致します。
CPU 分離の詳細については、Red Hat ナレッジベースソリューションOpenStack CPU isolation guidance for RHEL 8 and RHEL 9を参照してください。
7.4.5. インスタンスの追加仕様 リンクのコピーリンクがクリップボードにコピーされました!
NFV 環境でインスタンスをデプロイする前に、CPU ピニング、ヒュージページ、およびエミュレータースレッドピニングを活用するフレーバーを作成します。
- hw:cpu_policy
-
このパラメーターを
dedicatedに設定すると、ゲストはピニングされた CPU を使用します。このパラメーターセットのフレーバーから作成したインスタンスの有効オーバーコミット比は、1 : 1 です。デフォルト値はsharedです。 - hw:mem_page_size
このパラメーターを、特定の値と標準の単位からなる有効な文字列に設定します (例:
4KB、8MB、または1GB)。hugepageszブートパラメーターに一致させるには、1GB を使用します。ブートパラメーターからOvsDpdkSocketMemoryを減算して、仮想マシンが利用可能なヒュージページ数を計算します。以下の値も有効です。- small (デフォルト): 最少のページサイズが使用されます。
- large: 大型のページサイズだけを使用します。x86 アーキテクチャーでは、ページサイズは 2 MB または 1 GB です。
- any: Compute ドライバーは大型ページの使用を試みることができますが、利用できるページがない場合にはデフォルトの小型ページが使用されます。
- hw:emulator_threads_policy
-
heat パラメーター
NovaComputeCpuSharedSetで識別した CPU にエミュレータースレッドが固定されるように、このパラメーターの値をshareに設定します。エミュレータースレッドが Poll Mode Driver (PMD) またはリアルタイム処理用の仮想 CPU 上で実行されている場合には、パケットロスなどの悪影響が生じる場合があります。