Red Hat Training
A Red Hat training course is available for Red Hat OpenStack Platform
7.4. 手動で計算した OVS-DPDK のパラメーターについての概要
本項では、Data Plane Development Kit 対応 Open vSwitch (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 番目の物理コアを除く)。
NUMA ノードに DPDK NIC が関連付けられていない場合でも、両方の NUMA ノードで DPDK PMD スレッドを確保する必要があります。
- NovaVcpuPinSet
CPU ピニング用のコアを設定します。コンピュートノードは、ゲストインスタンスにこれらのコアを使用します。
NovaVcpuPinSet
はnova.conf
ファイルのvcpu_pin_set
値として使用されます。-
OvsPmdCoreList
とOvsDpdkCoreList
のコアをすべて除外します。 - 残りのコアをすべて追加します。
- シブリングスレッドをペアにします。
-
- NovaComputeCpuSharedSet
-
エミュレータースレッドに使用するコアを設定します。これにより、nova.conf のパラメーター
cpu_shared_set
の値が定義されます。このパラメーターの値とOvsDpdkCoreList
に設定した値を一致させることを推奨します。 - IsolCpusList
ホストのプロセスから分離される CPU コアのセット。このパラメーターは、
tuned-profiles-cpu-partitioning
コンポーネント用のcpu-partitioning-variable.conf
ファイルのisolated_cores
値として使用されます。-
OvsPmdCoreList
とNovaVcpuPinSet
のコア一覧が一致するようにします。 - シブリングスレッドをペアにします。
-
- OvsDpdkCoreList
handler および revalidator スレッドなどの、データパス以外の OVS-DPDK プロセス用の CPU コアを提供します。このパラメーターは、マルチ NUMA ノードハードウェア上でのデータパスの全体的なパフォーマンスには影響は及ぼしません。このパラメーターは Open vSwitch の
dpdk-lcore-mask
値に使用され、それらのコアはホストと共有されます。- 各 NUMA ノードから、1 番目の物理コア (およびシブリングスレッド) を割り当てます (NUMA に関連付けられている DPDK 用の NIC がない場合も)。
-
これらのコアは、
OvsPmdCoreList
およびNovaVcpuPinSet
のコアの一覧と相互に排他的である必要があります。
- DerivePciWhitelistEnabled
仮想マシン用に Virtual Function (VF) を確保するには、
NovaPCIPassthrough
パラメーターを使用して Nova に渡される VF の一覧を作成します。一覧から除外された VF は、引き続きホスト用に利用することができます。Red Hat は、
DerivePciWhitelistEnabled
の値をデフォルトのtrue
からfalse
に変更し、NovaPCIPassthrough
パラメーターのリストを手動で設定することを推奨します。一覧内の 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
パラメーターは Open vSwitch によりother_config:dpdk-extra="-n <value>"
値として使用されます。-
dmidecode -t memory
のコマンドを使用するか、お使いのハードウェアのマニュアルを参照して、利用可能なメモリーチャネルの数を確認します。 -
ls /sys/devices/system/node/node* -d
のコマンドで NUMA ノードの数を確認します。 - 利用可能なメモリーチャネル数を NUMA ノード数で除算します。
-
- NovaReservedHostMemory
ホスト上のタスク用にメモリーを MB 単位で確保します。この値は、コンピュートノードにより
nova.conf
のreserved_host_memory_mb
値として使用されます。- 静的な推奨値 4096 MB を使用します。
- OvsDpdkSocketMemory
NUMA ノードごとにヒュージページプールから事前に割り当てるメモリーの容量を MB 単位で指定します。この値は、Open vSwitch により
other_config:dpdk-socket-mem
値として使用されます。-
コンマ区切りリストで指定します。NUMA ノード上の各 NIC の MTU 値から、
OvsDpdkSocketMemory
の値を計算します。 - DPDK NIC のない NUMA ノードの場合は、推奨される静的な値である 1024 MB (1GB) を使用します。
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 の倍数に丸めます。
-
コンマ区切りリストで指定します。NUMA ノード上の各 NIC の MTU 値から、
MTU サイズが 1500 でない場合は、/var/log/messages
に Failed to create memory pool
エラーメッセージが表示されることがあります。インスタンスの起動時にこのエラーメッセージが表示された場合は、無視できます。このメッセージを回避するには、OvsDpdkSocketMemory
の計算に 1500 MTU の余分な OvsDpdkSocketMemory
量を追加します。
計算例: 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 上にあり、それぞれ MTU 2000 と MTU 2000 で設定されています。必要なメモリーを算出する計算例を以下に示します。
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*
は、ovs-vswitchd および qemu プロセスが virtio-net デバイスの設定に使用される共有ヒュージページおよび unix ソケットにアクセスできるように、hugetlbfs
に設定する必要があります。この値はロールに固有で、OVS-DPDK を利用するすべてのロールに適用する必要があります。 - 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.4.5. インスタンスの追加仕様
NFV 環境でインスタンスをデプロイする前に、CPU ピニング、エミュレータースレッドピニング、およびヒュージページを活用するフレーバーを作成します。
- hw:cpu_policy
-
ゲストがピニングされた CPU を使用するように、このパラメーターの値を
dedicated
に設定します。このパラメーターセットのフレーバーから作成したインスタンスの有効オーバーコミット比は、1 : 1 です。デフォルトはshared
です。 - hw:mem_page_size
このパラメーターの値を、特定の値と標準の単位からなる有効な文字列に設定します (例:
4KB
、8MB
、または1GB
)。hugepagesz ブートパラメーターに一致させるには、1GB
を使用します。仮想マシンで使用可能なヒュージページの数は、ブートパラメーターからOvsDpdkSocketMemory
を引いた値です。これ以外の有効なパラメーター値を以下に示します。- small (デフォルト): 最少のページサイズが使用されます。
- large: 大型のページサイズだけを使用します。x86 アーキテクチャーでは、ページサイズは 2 MB または 1 GB です。
- any: コンピュートドライバーは大型ページの使用を試みますが、利用できるページがない場合にはデフォルトの小型ページが使用されます。
- hw:emulator_threads_policy
-
heat パラメーター
NovaComputeCpuSharedSet
で識別した CPU にエミュレータースレッドが固定されるように、このパラメーターの値をshare
に設定します。エミュレータースレッドが Poll Mode Driver (PMD) またはリアルタイム処理に使用されている vCPU 上で実行されている場合には、パケットロスまたはデッドラインの超過が生じる場合があります。