Red Hat Training
A Red Hat training course is available for Red Hat OpenStack Platform
第8章 OVS-DPDK デプロイメントの設定
本項では、DPDK (OVS-DPDK) を Open vSwitch とともに Red Hat OpenStack Platform 環境内にデプロイします。オーバークラウドは、通常コントローラーノードやコンピュートノードなどの事前定義済みロールのノードと、異なる種別のストレージノードで構成されます。これらのデフォルトロールにはそれぞれ、director ノード上のコア Heat テンプレートで定義されている一式のサービスが含まれます。
オーバークラウドをデプロイする前に、アンダークラウドのインストールと設定が完了している必要があります。詳しくは、『director のインストールと使用方法』を参照してください。
OVS-DPDK 向けの OpenStack ネットワークを最適化するには、network-environment.yaml
ファイルで設定する OVS-DPDK パラメーターの最も適切な値を決定する必要があります。
8.1. ワークフローを使用した DPDK パラメーターの算出
この機能は、本リリースでは テクノロジープレビュー として提供しているため、Red Hat では全面的にはサポートしていません。これは、テスト目的のみでご利用いただく機能で、実稼働環境にデプロイすべきではありません。テクノロジープレビューについての詳しい情報は「対象範囲の詳細」を参照してください。
DPDK 向けの Mistral ワークフローに関する概要は、「ワークフローと派生パラメーターについての概要」を参照してください。
前提条件
このワークフローで取得されるデータを提供するには、ハードウェア検査で追加情報を取得するための追加のパラメーター (inspection_extras
) を含むベアメタルのイントロスペクションを有効化しておく必要があります。ハードウェア検査の追加パラメーターはデフォルトで有効化されます。「ノードのハードウェアの検査」を参照してください。
DPDK 向けのワークフローと入力パラメーターの定義
OVS-DPDK ワークフローで指定することができる入力パラメーターの一覧を以下に示します。
- num_phy_cores_per_numa_node_for_pmd
- この入力パラメーターは、DPDK NIC に関連付けられた NUMA ノードの必要最小限のコア数を指定します。DPDK NIC に関連付けられていないその他の NUMA ノードには、物理コアが 1 つ割り当てられます。このパラメーターは 1 に設定すべきです。
- huge_page_allocation_percentage
-
この入力パラメーターは、ヒュージページとして設定可能な合計メモリー中 (
NovaReservedHostMemory
を除く) の必要なパーセンテージを指定します。KernelArgs
パラメーターは、指定したhuge_page_allocation_percentage
に基づいて計算されたヒュージページを使用して派生されます。このパラメーターは 50 に設定すべきです。
ワークフローは、これらの入力パラメーターとベアメタルのイントロスペクションの情報を使用して、適切な DPDK パラメーター値を算出します。
DPDK 用のワークフローと入力パラメーターを定義するには、以下の手順を実行します。
tripleo-heat-templates/plan-samples/plan-environment-derived-params.yaml
ファイルをローカルのディレクトリーにコピーして、お使いの環境に適した入力パラメーターを設定します。workflow_parameters: tripleo.derive_params.v1.derive_parameters: # DPDK Parameters # # Specifices the minimum number of CPU physical cores to be allocated for DPDK # PMD threads. The actual allocation will be based on network config, if # the a DPDK port is associated with a numa node, then this configuration # will be used, else 1. num_phy_cores_per_numa_node_for_pmd: 1 # Amount of memory to be configured as huge pages in percentage. Ouf the # total available memory (excluding the NovaReservedHostMemory), the # specified percentage of the remaining is configured as huge pages. huge_page_allocation_percentage: 50
update-plan-only
パラメーターを使用してオーバークラウドをデプロイし、派生パラメーターを計算します。$ openstack overcloud deploy --templates --update-plan-only -r /home/stack/ospd-12-sriov-dpdk-heterogeneous-cluster/roles_data.yaml -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml -e /home/stack/ospd-12-sriov-dpdk-heterogeneous-cluster/docker-images.yaml -e /usr/share/openstack-tripleo-heat-templates/environments/host-config-and-reboot.yaml -e /home/stack/ospd-12-sriov-dpdk-heterogeneous-cluster/network-environment.yaml -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-sriov.yaml -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dpdk.yaml -p /home/stack/plan-environment-derived-params.yaml
このコマンドの出力には、派生した結果が表示されます。これは、plan-environment.yaml
ファイルにもマージされます。
Started Mistral Workflow tripleo.validations.v1.check_pre_deployment_validations. Execution ID: 55ba73f2-2ef4-4da1-94e9-eae2fdc35535 Waiting for messages on queue 472a4180-e91b-4f9e-bd4c-1fbdfbcf414f with no timeout. Removing the current plan files Uploading new plan files Started Mistral Workflow tripleo.plan_management.v1.update_deployment_plan. Execution ID: 7fa995f3-7e0f-4c9e-9234-dd5292e8c722 Plan updated. Processing templates in the directory /tmp/tripleoclient-SY6RcY/tripleo-heat-templates Invoking workflow (tripleo.derive_params.v1.derive_parameters) specified in plan-environment file Started Mistral Workflow tripleo.derive_params.v1.derive_parameters. Execution ID: 2d4572bf-4c5b-41f8-8981-c84a363dd95b Workflow execution is completed. result: ComputeOvsDpdkParameters: IsolCpusList: 1,2,3,4,5,6,7,9,10,17,18,19,20,21,22,23,11,12,13,14,15,25,26,27,28,29,30,31 KernelArgs: default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on isolcpus=1,2,3,4,5,6,7,9,10,17,18,19,20,21,22,23,11,12,13,14,15,25,26,27,28,29,30,31 NovaReservedHostMemory: 4096 NovaVcpuPinSet: 2,3,4,5,6,7,18,19,20,21,22,23,10,11,12,13,14,15,26,27,28,29,30,31 OvsDpdkCoreList: 0,16,8,24 OvsDpdkMemoryChannels: 4 OvsDpdkSocketMemory: 1024,1024 OvsPmdCoreList: 1,17,9,25
OvsDpdkMemoryChannels
パラメーターはイントロスペクションの情報からは派生できません。大半の場合、この値は 4 に設定すべきです。
派生パラメーターを使用したオーバークラウドのデプロイ
これらの派生パラメーターを使用してオーバークラウドをデプロイするには、以下の手順を実行します。
派生パラメーターを
plan-environment.yaml
ファイルからnetwork-environment.yaml
ファイルにコピーします。# DPDK compute node. ComputeOvsDpdkParameters: KernelArgs: default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on TunedProfileName: "cpu-partitioning" IsolCpusList: "1,2,3,4,5,6,7,9,10,17,18,19,20,21,22,23,11,12,13,14,15,25,26,27,28,29,30,31" NovaVcpuPinSet: ['2,3,4,5,6,7,18,19,20,21,22,23,10,11,12,13,14,15,26,27,28,29,30,31'] NovaReservedHostMemory: 4096 OvsDpdkSocketMemory: "1024,1024" OvsDpdkMemoryChannels: "4" OvsDpdkCoreList: "0,16,8,24" OvsPmdCoreList: "1,17,9,25"
注記DPDK PMD 向けに DPDK NIC のある場合またはない場合も、各 NUMA ノードで少なくとも 1 CPU を (シブリングスレッドとともに) 割り当てて、ゲストインスタンスの作成でエラーが発生するのを回避する必要があります。
注記これらのパラメーターは、特定のロール (ComputeOvsDpdk) に適用されます。これらのパラメーターは、グローバルで適用可能ですが、グローバルパラメーターはロール固有のパラメーターによってオーバーライドされます。
- オーバークラウドをデプロイします。
#!/bin/bash openstack overcloud deploy \ --templates \ -r /home/stack/ospd-12-sriov-dpdk-heterogeneous-cluster/roles_data.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/host-config-and-reboot.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-sriov.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dpdk.yaml \ -e /home/stack/ospd-12-sriov-dpdk-heterogeneous-cluster/network-environment.yaml
- 注記
- Compute、ComputeOvsDpdk、ComputeSriov で構成されるクラスターでは、既存の派生パラメーターのワークフローにより ComputeOvsDpdk ロールの計算式のみが適用され、他のロールは影響を受けません。
8.2. OVS-DPDK のトポロジー
Red Hat OpenStack Platform では、コンポーザブルロール機能を使用し、各ロールにサービスを追加/削除してカスタムのデプロイメントロールを作成できます。コンポーザブルロールの詳しい情報は「コンポーザブルサービスとカスタムロール」を参照してください。
以下の図は、コントロールプレーンとデータプレーン用にポートが 2 つボンディングされている OVS-DPDK トポロジーの例を示しています。
OVS-DPDK の設定は、以下の作業で構成されます。
-
コンポーザブルロールを使用する場合には、
roles_data.yaml
ファイルをコピーして編集し、OVS-DPDK 用のカスタムロールを追加します。 -
適切な
network-environment.yaml
ファイルを更新して、カーネル引数と DPDK 引数のパラメーターを追加します。 -
compute.yaml
ファイルを更新して、DPDK インターフェース用のブリッジを追加します。 -
controller.yaml
ファイルを更新して、DPDK インターフェースパラメーター用の同じブリッジ情報を追加します。 -
overcloud_deploy.sh
スクリプトを実行して、DPDK パラメーターを使用してオーバークラウドをデプロイします。
本ガイドでは、CPU の割り当て、メモリーの確保、NIC の設定の例を紹介します。これらは、トポロジーとユースケースによって異なる場合があります。ハードウェアと設定のオプションについて理解するには、『ネットワーク機能仮想化 (NFV) の製品ガイド』 と「2章ハードウェア要件」を参照してください。
手順を開始する前に、以下の項目が揃っていることを確認します。
- Red Hat Enterprise Linux 7.4 をベースとした Red Hat OpenStack Platform 12
- OVS 2.7
- DPDK 16.11
- テスト済み NIC。NFV 向けのテスト済み NIC の一覧は、「テスト済みの NIC」を参照してください。
OVS-DPDK デプロイメントでは、Red Hat OpenStack Platform 12 は、OVS クライアントモードで稼働します。
8.3. VLAN トンネリングを使用し、OVS-DPDK のデータプレーンの 2 ポートをボンディングする設定
本項では、OVS-DPDK ボンディングで 2 つのデータプレーンポートをボンディングする OVS-DPDK の設定方法について説明します。
OVS-DPDK 向けの OpenStack ネットワークを最適化するには、network-environment.yaml
ファイルで設定する OVS-DPDK パラメーターの最も適切な値を決定する必要があります。詳しくは、「ワークフローを使用した DPDK パラメーターの算出」を参照してください。
8.3.1. ComputeOvsDpdk コンポーザブルロールの生成
ComputeOvsDpdk ロール用の roles_data.yaml
を生成します。
# openstack overcloud roles generate --roles-path templates/openstack-tripleo-heat-templates/roles -o roles_data.yaml Controller ComputeOvsDpdk
8.3.2. CPU アフィニティー向けの tuned の設定
以下の例では、サンプルの post-install.yaml ファイルを使用しています。
tuned
の設定で CPU アフィニティーを有効にするように設定します。resources: ExtraDeployments: type: OS::Heat::StructuredDeployments properties: servers: {get_param: servers} config: {get_resource: ExtraConfig} actions: ['CREATE','UPDATE'] ExtraConfig: type: OS::Heat::SoftwareConfig properties: group: script config: | #!/bin/bash set -x function tuned_service_dependency() { tuned_service=/usr/lib/systemd/system/tuned.service grep -q "network.target" $tuned_service if [ "$?" -eq 0 ]; then sed -i '/After=.*/s/network.target//g' $tuned_service fi grep -q "Before=.*network.target" $tuned_service if [ ! "$?" -eq 0 ]; then grep -q "Before=.*" $tuned_service if [ "$?" -eq 0 ]; then sed -i 's/^\(Before=.*\)/\1 network.target openvswitch.service/g' $tuned_service else sed -i '/After/i Before=network.target openvswitch.service' $tuned_service fi fi } if hiera -c /etc/puppet/hiera.yaml service_names | grep -q neutron_ovs_dpdk_agent; then tuned_service_dependency fi
8.3.3. OVS-DPDK パラメーターの設定
以下の例では、サンプルの network-environment.yaml ファイルを使用しています。
OVS-DPDK 向けの OpenStack ネットワークを最適化するには、network-environment.yaml
ファイルで設定する OVS-DPDK パラメーターの最も適切な値を決定する必要があります。詳しくは、「ワークフローを使用した DPDK パラメーターの算出」を参照してください。
resource_registry
の下に OVS-DPDK 用のカスタムリソースを追加します。resource_registry: # Specify the relative/absolute path to the config files you want to use for override the default. OS::TripleO::ComputeOvsDpdk::Net::SoftwareConfig: nic-configs/computeovsdpdk.yaml OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml OS::TripleO::NodeExtraConfigPost: post-install.yaml
parameter_defaults
の下でトンネルの種別を無効にして (値を""
に設定)、ネットワーク種別をvlan
に設定します。NeutronTunnelTypes: '' NeutronNetworkType: 'vlan'
parameter_defaults
の下で、物理ネットワークを仮想ブリッジにマッピングします。NeutronBridgeMappings: 'tenant:br-link0'
parameter_defaults
の下で、OpenStack Networking ML2 および Open vSwitch VLAN のマッピング範囲を指定します。NeutronNetworkVLANRanges: 'tenant:22:22,tenant:25:25'
parameter_defaults
下には、ComputeOvsDpdk
ロール向けにロール固有のパラメーターを設定します。########################## # OVS DPDK configuration # # ######################## ComputeOvsDpdkParameters: KernelArgs: default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on TunedProfileName: "cpu-partitioning" IsolCpusList: "1,2,3,4,5,6,7,9,10,17,18,19,20,21,22,23,11,12,13,14,15,25,26,27,28,29,30,31" NovaVcpuPinSet: ['2,3,4,5,6,7,18,19,20,21,22,23,10,11,12,13,14,15,26,27,28,29,30,31'] NovaReservedHostMemory: 4096 OvsDpdkSocketMemory: "1024,1024" OvsDpdkMemoryChannels: "4" OvsDpdkCoreList: "0,16,8,24" OvsPmdCoreList: "1,17,9,25"
注記DPDK PMD 向けに DPDK NIC のある場合またはない場合も、各 NUMA ノードで少なくとも 1 CPU を (シブリングスレッドとともに) 割り当てて、ゲストインスタンスの作成でエラーが発生するのを回避する必要があります。
これらのヒュージページは、仮想マシンにより消費されます。また、本手順に示したように OvsDpdkSocketMemory
パラメーターを使用すると OVS-DPDK により消費されます。仮想マシンが利用可能なヒュージページ数は、boot
パラメーターから OvsDpdkSocketMemory
を減算した値です。
DPDK インスタンスに関連付けたフレーバーにも hw:mem_page_size=1GB
を追加する必要があります。
OvsDPDKCoreList
と OvsDpdkMemoryChannels
は、この手順の 必須 の設定です。適切な値なしに DPDK をデプロイしようとすると、デプロイが失敗するか、デプロイが不安定になる可能性があります。
parameter_defaults
の下で、OVS 用の vhost-user ソケットディレクトリーを指定します。NeutronVhostuserSocketDir: "/var/lib/vhost_sockets"
DHCP メタデータのパラメーターを設定します。
# DHCP provide metadata route to VM. NeutronEnableIsolatedMetadata: true # DHCP always provides metadata route to VM. NeutronEnableForceMetadata: true
8.3.4. コントローラーノードの設定
以下の例では、サンプルの controller.yaml ファイルを使用しています。
分離ネットワーク用にコントロールプレーンの Linux ボンディングを作成します。
- type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: get_param: DnsServers addresses: - ip_netmask: list_join: - / - - get_param: ControlPlaneIp - get_param: ControlPlaneSubnetCidr routes: - ip_netmask: 169.254.169.254/32 next_hop: get_param: EC2MetadataIp members: - type: interface name: nic2 primary: true - type: interface name: nic3
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: get_param: InternalApiNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: InternalApiIpSubnet - type: vlan vlan_id: get_param: TenantNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: TenantIpSubnet - type: vlan vlan_id: get_param: StorageNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: StorageIpSubnet - type: vlan vlan_id: get_param: StorageMgmtNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: StorageMgmtIpSubnet - type: vlan vlan_id: get_param: ExternalNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: ExternalIpSubnet routes: - default: true next_hop: get_param: ExternalInterfaceDefaultRoute
クラウドネットワークへの接続を可能にする Floating IP にアクセスするための OVS ブリッジを作成します。
- type: ovs_bridge name: br-link0 use_dhcp: false members: - type: interface name: nic4 mtu: 9000
8.3.5. DPDK インターフェース用のコンピュートノードの設定
以下の例では、サンプルの compute.yaml ファイルを使用しています。
分離ネットワーク用にコントロールプレーンの Linux ボンディングを作成します。
- type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: get_param: DnsServers members: - type: interface name: nic3 primary: true - type: interface name: nic4
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: get_param: InternalApiNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: InternalApiIpSubnet - type: vlan vlan_id: get_param: TenantNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: TenantIpSubnet - type: vlan vlan_id: get_param: StorageNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: StorageIpSubnet
コントローラーにリンクする OVS-DPDK ボンディングに 2 つの DPDK ポートにブリッジを設定します。
- type: ovs_user_bridge name: br-link0 use_dhcp: false members: - type: ovs_dpdk_bond name: dpdkbond0 mtu: 9000 rx_queue: 2 members: - type: ovs_dpdk_port name: dpdk0 members: - type: interface name: nic5 - type: ovs_dpdk_port name: dpdk1 members: - type: interface name: nic6
注記複数の DPDK デバイスが含まれるようにするには、追加する各 DPDK デバイスごとに
type
コードセクションを繰り返してください。注記OVS-DPDK を使用する場合には、同じコンピュートノード上の すべて のブリッジが
ovs_user_bridge
の種別である必要があります。director は設定を受け入れることができますが、Red Hat OpenStack Platform は同じノード上でovs_bridge
とovs_user_bridge
が混在する構成はサポートしていません。
8.3.6. オーバークラウドのデプロイ
overcloud_deploy.sh スクリプトを実行してオーバークラウドをデプロイします。
#!/bin/bash openstack overcloud deploy \ --templates \ -r /home/stack/ospd-12-vlan-dpdk-two-ports-ctlplane-dataplane-bonding/roles_data.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/host-config-and-reboot.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dpdk.yaml \ -e /home/stack/ospd-12-vlan-dpdk-two-ports-ctlplane-dataplane-bonding/docker-images.yaml \ -e /home/stack/ospd-12-vlan-dpdk-two-ports-ctlplane-dataplane-bonding/network-environment.yaml
8.4. VXLAN トンネリングを使用する OVS-DPDK の設定
本項では、VXLAN トンネリングを使用する OVS-DPDK の設定方法について説明します。
OVS-DPDK 向けの OpenStack ネットワークを最適化するには、network-environment.yaml
ファイルで設定する OVS-DPDK パラメーターの最も適切な値を決定する必要があります。詳しくは、「ワークフローを使用した DPDK パラメーターの算出」を参照してください。
8.4.1. ComputeOvsDpdk コンポーザブルロールの生成
ComputeOvsDpdk ロール用の roles_data.yaml
を生成します。
# openstack overcloud roles generate --roles-path templates/openstack-tripleo-heat-templates/roles -o roles_data.yaml Controller ComputeOvsDpdk
8.4.2. CPU アフィニティー向けの tuned の設定
以下の例では、サンプルの post-install.yaml ファイルを使用しています。
tuned
の設定で CPU アフィニティーを有効にするように設定します。resources: ExtraDeployments: type: OS::Heat::StructuredDeployments properties: servers: {get_param: servers} config: {get_resource: ExtraConfig} actions: ['CREATE','UPDATE'] ExtraConfig: type: OS::Heat::SoftwareConfig properties: group: script config: | #!/bin/bash set -x function tuned_service_dependency() { tuned_service=/usr/lib/systemd/system/tuned.service grep -q "network.target" $tuned_service if [ "$?" -eq 0 ]; then sed -i '/After=.*/s/network.target//g' $tuned_service fi grep -q "Before=.*network.target" $tuned_service if [ ! "$?" -eq 0 ]; then grep -q "Before=.*" $tuned_service if [ "$?" -eq 0 ]; then sed -i 's/^\(Before=.*\)/\1 network.target openvswitch.service/g' $tuned_service else sed -i '/After/i Before=network.target openvswitch.service' $tuned_service fi fi } if hiera -c /etc/puppet/hiera.yaml service_names | grep -q neutron_ovs_dpdk_agent; then tuned_service_dependency fi
8.4.3. OVS-DPDK パラメーターの設定
以下の例では、サンプルの network-environment.yaml ファイルを使用しています。
OVS-DPDK 向けの OpenStack ネットワークを最適化するには、network-environment.yaml
ファイルで設定する OVS-DPDK パラメーターの最も適切な値を決定する必要があります。詳しくは、「ワークフローを使用した DPDK パラメーターの算出」を参照してください。
resource_registry
の下に OVS-DPDK 用のカスタムリソースを追加します。resource_registry: # Specify the relative/absolute path to the config files you want to use for override the default. OS::TripleO::ComputeOvsDpdk::Net::SoftwareConfig: nic-configs/compute-ovs-dpdk.yaml OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml OS::TripleO::NodeExtraConfigPost: post-install.yaml
parameter_defaults
の下で、トンネルの種別とテナントの種別をvxlan
に設定します。NeutronTunnelTypes: 'vxlan' NeutronNetworkType: 'vxlan'
parameter_defaults
下には、ComputeOvsDpdk
ロール向けにロール固有のパラメーターを設定します。# DPDK compute node. ComputeOvsDpdkParameters: KernelArgs: default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on TunedProfileName: "cpu-partitioning" IsolCpusList: "1,2,3,4,5,6,7,9,10,17,18,19,20,21,22,23,11,12,13,14,15,25,26,27,28,29,30,31" NovaVcpuPinSet: ['2,3,4,5,6,7,18,19,20,21,22,23,10,11,12,13,14,15,26,27,28,29,30,31'] NovaReservedHostMemory: 4096 OvsDpdkSocketMemory: "1024,1024" OvsDpdkMemoryChannels: "4" OvsDpdkCoreList: "0,16,8,24" OvsPmdCoreList: "1,17,9,25"
注記DPDK PMD 向けに DPDK NIC のある場合またはない場合も、各 NUMA ノードで少なくとも 1 CPU を (シブリングスレッドとともに) 割り当てて、ゲストインスタンスの作成でエラーが発生するのを回避する必要があります。
注記これらのヒュージページは、仮想マシンにより消費されます。また、本手順に示したように
OvsDpdkSocketMemory
パラメーターを使用すると OVS-DPDK により消費されます。仮想マシンが利用可能なヒュージページ数は、boot
パラメーターからOvsDpdkSocketMemory
を減算した値です。DPDK インスタンスに関連付けたフレーバーにも
hw:mem_page_size=1GB
を追加する必要があります。注記OvsDPDKCoreList
とOvsDpdkMemoryChannels
は、この手順の 必須 の設定です。適切な値なしに DPDK をデプロイしようとすると、デプロイが失敗するか、デプロイが不安定になる可能性があります。parameter_defaults
の下で、OVS 用の vhost-user ソケットディレクトリーを指定します。NeutronVhostuserSocketDir: "/var/lib/vhost_sockets"
DHCP メタデータのパラメーターを設定します。
# DHCP provide metadata route to VM. NeutronEnableIsolatedMetadata: true # DHCP always provides metadata route to VM. NeutronEnableForceMetadata: true
8.4.4. コントローラーノードの設定
以下の例では、サンプルの controller.yaml ファイルを使用しています。
分離ネットワーク用にコントロールプレーンの Linux ボンディングを作成します。
- type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: get_param: DnsServers addresses: - ip_netmask: list_join: - / - - get_param: ControlPlaneIp - get_param: ControlPlaneSubnetCidr routes: - ip_netmask: 169.254.169.254/32 next_hop: get_param: EC2MetadataIp members: - type: interface name: nic2 primary: true - type: interface name: nic3
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: get_param: InternalApiNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: InternalApiIpSubnet - type: vlan vlan_id: get_param: StorageNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: StorageIpSubnet - type: vlan vlan_id: get_param: StorageMgmtNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: StorageMgmtIpSubnet - type: vlan vlan_id: get_param: ExternalNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: ExternalIpSubnet routes: - default: true next_hop: get_param: ExternalInterfaceDefaultRoute
クラウドネットワークへの接続を可能にする Floating IP にアクセスするための OVS ブリッジを作成します。
- type: ovs_bridge name: br-link0 use_dhcp: false members: - type: interface name: nic4 mtu: 9000 - type: vlan vlan_id: get_param: TenantNetworkVlanID addresses: - ip_netmask: get_param: TenantIpSubnet
8.4.5. DPDK インターフェース用のコンピュートノードの設定
以下の例では、compute.yaml ファイルを使用しています。
デフォルトの compute.yaml
ファイルから compute-ovs-dpdk.yaml
を作成し、以下のように変更します。
分離ネットワーク用にコントロールプレーンの Linux ボンディングを作成します。
- type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: get_param: DnsServers members: - type: interface name: nic3 primary: true - type: interface name: nic4
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: get_param: InternalApiNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: InternalApiIpSubnet - type: vlan vlan_id: get_param: StorageNetworkVlanID device: bond_api addresses: - ip_netmask: get_param: StorageIpSubnet
コントローラーにリンクするための DPDK ポートを使用したブリッジを設定します。
- type: ovs_user_bridge name: br-link0 use_dhcp: false ovs_extra: - str_replace: template: set port br-link0 tag=_VLAN_TAG_ params: _VLAN_TAG_: get_param: TenantNetworkVlanID addresses: - ip_netmask: get_param: TenantIpSubnet members: - type: ovs_dpdk_bond name: dpdkbond0 mtu: 9000 rx_queue: 2 members: - type: ovs_dpdk_port name: dpdk0 members: - type: interface name: nic5 - type: ovs_dpdk_port name: dpdk1 members: - type: interface name: nic6
注記複数の DPDK デバイスが含まれるようにするには、追加する各 DPDK デバイスごとに
type
コードセクションを繰り返してください。注記OVS-DPDK を使用する場合には、同じコンピュートノード上の すべて のブリッジが
ovs_user_bridge
の種別である必要があります。director は設定を受け入れることができますが、Red Hat OpenStack Platform は同じノード上でovs_bridge
とovs_user_bridge
が混在する構成はサポートしていません。
8.4.6. オーバークラウドのデプロイ
overcloud_deploy.sh スクリプトを実行してオーバークラウドをデプロイします。
#!/bin/bash openstack overcloud deploy \ --templates \ -r /home/stack/ospd-12-vxlan-dpdk-single-port-ctlplane-bonding/roles_data.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/host-config-and-reboot.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dpdk.yaml \ -e /home/stack/ospd-12-vxlan-dpdk-single-port-ctlplane-bonding/docker-images.yaml \ -e /home/stack/ospd-12-vxlan-dpdk-single-port-ctlplane-bonding/network-environment.yaml
8.5. OVS-DPDK インターフェースの MTU 値の設定
Red Hat OpenStack Platform は OVS-DPDK 向けにジャンボフレームをサポートしています。ジャンボフレーム用の MTU 値を設定するには、以下の作業を行う必要があります。
-
network-environment.yaml
ファイルで、グローバルの MTU 値を設定します。 -
compute.yaml
ファイルで物理 DPDK ポートの MTU 値を設定します。この値は、vhost のユーザーインターフェースでも使用されます。 - コンピュートノード上の任意のゲストインスタンスで MTU 値を設定し、設定内でエンドツーエンドに同等の MTU 値が設定されるようにします。
VXLAN パケットには追加で 50 バイトがヘッダーに含まれます。MTU の必要値は、ヘッダーの追加バイト値に基づいて計算してください。たとえば、MTU 値 が 9000 の場合には、これらの追加バイト値を計算に入れると、VXLAN トンネルの MTU 値は 8950 となります。
物理 NIC は DPDK PMD によって制御され、compute.yaml
ファイルで設定されているのを同じ MTU 値が適用されるので、特別な設定は必要ありません。MTU 値には、物理 NIC でサポートされているよりも高い値を設定することはできません。
OVS-DPDK インターフェースの MTU 値を設定するには、以下の手順を実行します。
network-environment.yaml
ファイルでNeutronGlobalPhysnetMtu
パラメーターを設定します。parameter_defaults: # MTU global configuration NeutronGlobalPhysnetMtu: 9000
注記network-environment.yaml
ファイルの NeutronDpdkSocketMemory の値がジャンボフレームをサポートするのに十分に大きな値であることを確認します。詳しくは、「メモリーパラメーター」を参照してください。controller.yaml
ファイルでコンピュートノードへのブリッジ上の MTU 値を設定します。- type: ovs_bridge name: br-link0 use_dhcp: false members: - type: interface name: nic3 mtu: 9000
compute.yaml
ファイルで OVS-DPDK ボンディング用の MTU 値を設定します。- type: ovs_user_bridge name: br-link0 use_dhcp: false members: - type: ovs_dpdk_bond name: dpdkbond0 mtu: 9000 rx_queue: 2 members: - type: ovs_dpdk_port name: dpdk0 mtu: 9000 members: - type: interface name: nic4 - type: ovs_dpdk_port name: dpdk1 mtu: 9000 members: - type: interface name: nic5
8.6. セキュリティーグループの設定
Red Hat OpenStack Platform director で OVS ファイアウォールドライバーを使用するためのセキュリティーグループを設定することができます。NeutronOVSFirewallDriver
パラメーターで、どのファイアウォールドライバーを使用するかを制御することができます。
-
iptables_hybrid
: OpenStack Networking が iptables/ハイブリッドベースの実装を使用するように設定します。 -
openvswitch
: OpenStack Networking で OVS ファイアウォールのフローベースのドライバーを使用するように設定します。
openvswitch
OVS ファイアウォールドライバーはパフォーマンスがより高く、ゲストをプロジェクトネットワークに接続するためのインターフェースとブリッジの数を削減します。
iptables_hybrid
オプションは、OVS-DPDK との互換性はありません。
network-environment.yaml
ファイルで NeutronOVSFirewallDriver
パラメーターを設定します。
# Configure the classname of the firewall driver to use for implementing security groups. NeutronOVSFirewallDriver: openvswitch
セキュリティーグループの有効化/無効化についての情報は、「Basic security group operations」を参照してください。
8.7. OVS-DPDK インターフェース向けのマルチキューの設定
コンピュートノード上の OVS-DPDK のインターフェースに同じ数のキューを設定するには、compute.yaml
ファイルを以下のように変更します。
- type: ovs_user_bridge
name: br-link0
use_dhcp: false
members:
- type: ovs_dpdk_bond
name: dpdkbond0
mtu: 9000
rx_queue: 2
members:
- type: ovs_dpdk_port
name: dpdk0
mtu: 9000
members:
- type: interface
name: nic4
- type: ovs_dpdk_port
name: dpdk1
mtu: 9000
members:
- type: interface
name: nic5
8.8. 既知の制限事項
NFV のユースケース向けに Red Hat OpenStack Platform で OVS-DPDK を設定する場合には特定の制限事項があります。
- コントロールプレーンのネットワークには、Linux ボンディングを使用します。パフォーマンスを最適化するには、ボンディングに使用されている両方の PCI デバイスが同じ NUMA ノード上にあることを確認してください。Red Hat では、Neutron の Linux ブリッジ構成はサポートしていません。
- ヒュージページは OVS-DPDK を使用するホスト上で実行される全インスタンスに必要です。ゲストのヒュージページがない場合には、インターフェースは表示されても機能しません。
TAP デバイスは DPDK をサポートしていないため、それらのデバイスを使用するサービスのパフォーマンスが低下します。たとえば、DVR、FWaaS、LBaaS などのサービスは TAP デバイスを使用します。
-
OVS-DPDK では、
netdev datapath
で DVR を有効化することができますが、パフォーマンスが低いので、実稼働環境には適していません。DVR はカーネルの名前空間と TAP デバイスを使用してルーティングを実行します。 - OVS-DPDK で DVR ルーティングのパフォーマンスを良好な状態にするには、OpenFlow ルールとしてルーティングを実装する ODL などのコントローラーを使用する必要があります。OVS-DPDK では、 OpenFlow ルーティングは、Linux カーネルインターフェースによって生じるボトルネックをなくすので、データパスの完全なパフォーマンスが維持されます。
-
OVS-DPDK では、
-
OVS-DPDK を使用する場合には、同じコンピュートノード上の すべて のブリッジが
ovs_user_bridge
の種別である必要があります。director は設定を受け入れることができますが、Red Hat OpenStack Platform は同じノード上でovs_bridge
とovs_user_bridge
が混在する構成はサポートしていません。
8.9. OVS-DPDK 用のフレーバーの作成とインスタンスのデプロイ
NFV を実装する Red Hat OpenStack Platform デプロイメントの OVS-DPDK の設定を完了した後には、以下の手順に従ってフレーバーを作成してインスタンスをデプロイすることができます。
アグリゲートグループを作成して、OVS-DPDK 用にホストを追加します。
# openstack aggregate create --zone=dpdk dpdk # openstack aggregate add host dpdk compute-ovs-dpdk-0.localdomain
注記CPU ピニングされたインスタンスをピニングされていないインスタンスと分けるには、ホストアグリゲートを使用すべきです。CPU ピニングを使用していないインスタンスは、CPU ピニングを使用するインスタンスのリソース要件は順守しません。
フレーバーを作成します。
# openstack flavor create m1.medium_huge_4cpu --ram 4096 --disk 150 --vcpus 4
このコマンドでは、
m1.medium_huge_4cpu
はフレーバー名、4096
は MB 単位のメモリー容量、150
は GB 単位のディスク容量 (デフォルトでは 0 G)、4
は仮想 CPU 数を設定しています。フレーバーの追加のプロパティーを設定します。
# openstack flavor set --property hw:cpu_policy=dedicated --property hw:mem_page_size=1GB m1.medium_huge_4cpu --property hw:emulator_threads_policy=isolate
このコマンドでは、
m1.medium_huge_4cpu
はフレーバー名を指定しており、残りはそのフレーバーのその他のプロパティーを設定しています。
パフォーマンス向上のためのエミュレータースレッドポリシーについての詳しい情報は、「Configure Emulator Threads to run on a Dedicated Physical CPU」を参照してください。
ネットワークを作成します。
# openstack network create net1 --provider:network_type=vlan --provider:segmentation_id=<VLAN-ID> --provider:physical_network=tenant
インスタンスをデプロイします。
# openstack server create --flavor m1.medium_huge_4cpu --availability-zone dpdk --image rhel_7.3 --nic net-id=net1
ここで
-
m1.medium_huge_4cpu
はフレーバー名または ID です。 -
dpdk
はサーバーのアベイラビリティーゾーンです。 -
rhel_7.3
はインスタンスの作成に使用するイメージ (名前または ID) です。 -
net1
はサーバー上の NIC です。
-
これで、NFV ユースケースの OVS-DPDK 向けインスタンスのデプロイが完了しました。
multi-queue を OVS-DPDK で使用するには、上記の手順に数ステップを追加する必要があります。フレーバーを作成する前に、以下のステップを実行してください。
イメージのプロパティーを設定します。
# openstack image set --property hw_vif_multiqueue_enabled=true <image-id>
ここで、
hw_vif_multiqueue_enabled=true
はこのイメージ上でマルチキューを有効にするためのプロパティーで、<image-id>
は変更するイメージの名前または ID です。フレーバーの追加のプロパティーを設定します。
# openstack flavor set m1.vm_mq set hw:vif_multiqueue_enabled=true
ここで、
m1.vm_mq
はフレーバーの ID または名前で、残りのオプションはそのフレーバーのマルチキューを有効化します。
8.10. 設定のトラブルシューティング
本項では、DPDK-OVS 設定のトラブルシューティングの手順を説明します。
ブリッジの設定を見直して、ブリッジが
datapath_type=netdev
で作成されたことを確認します。# ovs-vsctl list bridge br0 _uuid : bdce0825-e263-4d15-b256-f01222df96f3 auto_attach : [] controller : [] datapath_id : "00002608cebd154d" datapath_type : netdev datapath_version : "<built-in>" external_ids : {} fail_mode : [] flood_vlans : [] flow_tables : {} ipfix : [] mcast_snooping_enable: false mirrors : [] name : "br0" netflow : [] other_config : {} ports : [52725b91-de7f-41e7-bb49-3b7e50354138] protocols : [] rstp_enable : false rstp_status : {} sflow : [] status : {} stp_enable : false
neutron-ovs-agent
が自動的に起動するように設定されていることを確認して、OVS サービスをレビューします。# systemctl status neutron-openvswitch-agent.service neutron-openvswitch-agent.service - OpenStack Neutron Open vSwitch Agent Loaded: loaded (/usr/lib/systemd/system/neutron-openvswitch-agent.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2015-11-23 14:49:31 AEST; 25min ago
サービスの起動に問題がある場合には、以下のコマンドを実行して関連のメッセージを表示することができます。
# journalctl -t neutron-openvswitch-agent.service
ovs-dpdk
の PMD CPU マスクが CPU にピニングされていることを確認します。HT の場合には、シブリング CPU を使用します。たとえば
CPU4
を例に取ります。# cat /sys/devices/system/cpu/cpu4/topology/thread_siblings_list 4,20
CPU 4 と 20 を使用します。
# ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x100010
ステータスを表示します。
# tuna -t ovs-vswitchd -CP thread ctxt_switches pid SCHED_ rtpri affinity voluntary nonvoluntary cmd 3161 OTHER 0 6 765023 614 ovs-vswitchd 3219 OTHER 0 6 1 0 handler24 3220 OTHER 0 6 1 0 handler21 3221 OTHER 0 6 1 0 handler22 3222 OTHER 0 6 1 0 handler23 3223 OTHER 0 6 1 0 handler25 3224 OTHER 0 6 1 0 handler26 3225 OTHER 0 6 1 0 handler27 3226 OTHER 0 6 1 0 handler28 3227 OTHER 0 6 2 0 handler31 3228 OTHER 0 6 2 4 handler30 3229 OTHER 0 6 2 5 handler32 3230 OTHER 0 6 953538 431 revalidator29 3231 OTHER 0 6 1424258 976 revalidator33 3232 OTHER 0 6 1424693 836 revalidator34 3233 OTHER 0 6 951678 503 revalidator36 3234 OTHER 0 6 1425128 498 revalidator35 *3235 OTHER 0 4 151123 51 pmd37* *3236 OTHER 0 20 298967 48 pmd38* 3164 OTHER 0 6 47575 0 dpdk_watchdog3 3165 OTHER 0 6 237634 0 vhost_thread1 3166 OTHER 0 6 3665 0 urcu2