Red Hat Training
A Red Hat training course is available for Red Hat OpenStack Platform
第10章 同じコンピュートノード上にある SR-IOV および DPDK インターフェースの設定
本項では、同じコンピュートノード上に SR-IOV および DPDK インターフェースをデプロイする方法について説明します。このデプロイメントには、network-environment.yaml
ファイルでロール固有のパラメーターを定義した、OVS-DPDK と SR-IOV 用のカスタムロールを使用します。カスタムロールの作成プロセスには以下が含まれます。
- 同じコンピュートノードで SR-IOV インターフェースと DPDK インターフェースをサポートするためのカスタムロールを定義します。
-
network_environment.yaml
ファイルで、SR-IOV ロールと OVS-DPDK ロール向けにロール固有のパラメーターを設定します。 -
compute.yaml
ファイルを SR-IOV インターフェースと DPDK インターフェースで設定します。 - 更新したロールセットでオーバークラウドをデプロイします。
- これらのインターフェース種別をサポートするのに適切な OpenStack フレーバー、ネットワーク、ポートを作成します。
オーバークラウドでコンピュートノードをデプロイする前に、アンダークラウドのインストールと設定が完了している必要があります。詳しくは、『director のインストールと使用方法』を参照してください。
このカスタムロールに対応した OpenStack フレーバーを作成するようにしてください。
OVS-DPDK 向けの OpenStack ネットワークを最適化するには、network-environment.yaml
ファイルで設定する OVS-DPDK パラメーターの最も適切な値を決定する必要があります。詳しくは、「ワークフローを使用した DPDK パラメーターの算出」を参照してください。
以下の例では、ComputeOvsDpdkSriov は、コンピュートノード用のカスタムロールで、適切な NIC が搭載されたノードでのみ DPDK と SR-IOV を有効にします。Red Hat OpenStack Platform によって提供される既存のデフォルトロールセットは、/usr/share/openstack-tripleo-heat-templates/roles_data.yaml
ファイルに保管されます。
10.1. ComputeOvsDpdkSriov コンポーザブルロールの作成
Red Hat OpenStack Platformは roles_data.yaml
ファイルでデフォルトロールのセットを提供しています。必要なロールをサポートするには、独自の roles_data.yaml
ファイルを作成することができます。
同じコンピュートノードで SR-IOV インターフェースと DPDK インターフェースをサポートする ComputeOvsDpdkSriov コンポーザブルロールを作成するには、以下の手順を実行します。
ローカルディレクトリーに
ComputeOvsDpdkSriov.yaml
ファイルを作成して、このロールの定義を追加します。############################################################################### # Role: ComputeOvsDpdkSriov # ############################################################################### - name: ComputeOvsDpdkSriov description: | Compute OvS DPDK Sriov Role CountDefault: 1 networks: - InternalApi - Tenant - Storage HostnameFormatDefault: 'computeovsdpdksriov-%index%' disable_upgrade_deployment: True ServicesDefault: - OS::TripleO::Services::AuditD - OS::TripleO::Services::CACerts - OS::TripleO::Services::CephClient - OS::TripleO::Services::CephExternal - OS::TripleO::Services::CertmongerUser - OS::TripleO::Services::Collectd - OS::TripleO::Services::ComputeCeilometerAgent - OS::TripleO::Services::ComputeNeutronCorePlugin - OS::TripleO::Services::ComputeNeutronL3Agent - OS::TripleO::Services::ComputeNeutronMetadataAgent - OS::TripleO::Services::ComputeNeutronOvsDpdk - OS::TripleO::Services::Docker - OS::TripleO::Services::FluentdClient - OS::TripleO::Services::Iscsid - OS::TripleO::Services::Kernel - OS::TripleO::Services::MySQLClient - OS::TripleO::Services::NovaCompute - OS::TripleO::Services::NovaLibvirt - OS::TripleO::Services::NovaMigrationTarget - OS::TripleO::Services::NeutronLinuxbridgeAgent - OS::TripleO::Services::NeutronSriovAgent - OS::TripleO::Services::NeutronVppAgent - OS::TripleO::Services::Ntp - OS::TripleO::Services::ContainersLogrotateCrond - OS::TripleO::Services::OpenDaylightOvs - OS::TripleO::Services::Securetty - OS::TripleO::Services::SensuClient - OS::TripleO::Services::Snmp - OS::TripleO::Services::Sshd - OS::TripleO::Services::Timezone - OS::TripleO::Services::TripleoFirewall - OS::TripleO::Services::TripleoPackages - OS::TripleO::Services::Tuned - OS::TripleO::Services::Vpp - OS::TripleO::Services::OVNController
ComputeOvsDpdkSriov ロールおよびデプロイメントに必要なその他のロール用の
roles_data.yaml
を生成します。# openstack overcloud roles generate --roles-path templates/openstack-tripleo-heat-templates/roles -o roles_data.yaml Controller ComputeOvsDpdkSriov
10.2. CPU アフィニティー向けの tuned の設定
以下の例では、サンプルの post-install.yaml ファイルを使用しています。
tuned
の設定で CPU アフィニティーを有効にするように設定します。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
10.3. SR-IOV と OVS-DPDK のロール固有のパラメーターの定義
network-environment.yaml ファイルを編集して SR-IOV と OVS-DPDK のロール固有のパラメーターを設定します。
network-environment.yaml
ファイルに OVS-DPDK および SR-IOV サービス向けのリソースマッピングと、それらのノードのネットワーク設定を追加します。resource_registry: # Specify the relative/absolute path to the config files you want to use for override the default. OS::TripleO::ComputeOvsDpdkSriov::Net::SoftwareConfig: nic-configs/computeovsdpdksriov.yaml OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml OS::TripleO::NodeExtraConfigPost: post-install.yaml
フレーバーを定義します。
OvercloudControllerFlavor: controller OvercloudComputeOvsDpdkSriovFlavor: compute
SR-IOV のロール固有のパラメーターを設定します。
#SR-IOV params NeutronMechanismDrivers: ['openvswitch','sriovnicswitch'] NovaSchedulerDefaultFilters: ['RetryFilter','AvailabilityZoneFilter','RamFilter','ComputeFilter','ComputeCapabilitiesFilter','ImagePropertiesFilter','ServerGroupAntiAffinityFilter','ServerGroupAffinityFilter','PciPassthroughFilter','NUMATopologyFilter'] NovaSchedulerAvailableFilters: ["nova.scheduler.filters.all_filters","nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter"] NeutronSupportedPCIVendorDevs: ['8086:154d', '8086:10ed'] NovaPCIPassthrough: - devname: "ens2f1" physical_network: "tenant" NeutronPhysicalDevMappings: "tenant:ens2f1" NeutronSriovNumVFs: "ens2f1:5"
OVS-DPDK のロール固有のパラメーターを設定します。
########################## # OVS DPDK configuration # # ######################## ComputeOvsDpdkSriovParameters: 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" # MTU global configuration NeutronGlobalPhysnetMtu: 9000 # DHCP provide metadata route to VM. NeutronEnableIsolatedMetadata: true # DHCP always provides metadata route to VM. NeutronEnableForceMetadata: true # Configure the classname of the firewall driver to use for implementing security groups. NeutronOVSFirewallDriver: openvswitch
注記DPDK PMD 向けに DPDK NIC のある場合またはない場合も、各 NUMA ノードで少なくとも 1 CPU を (シブリングスレッドとともに) 割り当てて、ゲストインスタンスの作成でエラーが発生するのを回避する必要があります。
-
network-environment.yaml
ファイルの残りを設定して、OpenStack デプロイメントの必要に応じてneutron-ovs-dpdk-agent.yaml
およびneutron-sriov-agent.yaml
のファイルからのデフォルトのパラメーターを上書きします。
network-environment.yaml
ファイルに設定する OVS-DPDK パラメーターの最適な値を決定する方法についての詳しい説明は、「OVS-DPDK デプロイメントのプランニング」を参照してください。
10.4. SR-IOV および DPDK インターフェース用のコンピュートノードの設定
以下の例では、compute.yaml ファイルを使用して、SR-IOV インターフェースと DPDK インターフェースをサポートするための computeovsdpdksriov.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
コントローラーにリンクするための DPDK ポートを使用したブリッジを設定します。
- type: ovs_user_bridge name: br-link0 use_dhcp: false members: - type: ovs_dpdk_port name: dpdk0 mtu: 9000 rx_queue: 2 members: - type: interface name: nic5
注記複数の DPDK デバイスが含まれるようにするには、追加する各 DPDK デバイスごとに
type
コードセクションを繰り返してください。注記OVS-DPDK を使用する場合には、同じコンピュートノード上の すべて のブリッジが
ovs_user_bridge
の種別である必要があります。director は設定を受け入れることができますが、Red Hat OpenStack Platform は同じノード上でovs_bridge
とovs_user_bridge
が混在する構成はサポートしていません。コントローラーに対する SR-IOV インターフェースを作成します。
- type: interface name: ens2f1 mtu: 9000 use_dhcp: false defroute: false nm_controlled: true hotplug: true
10.5. オーバークラウドのデプロイ
以下の例では、コンポーザブルロールを使用する openstack overcloud deploy
の Bash スクリプトを定義しています。
#!/bin/bash openstack overcloud deploy \ --templates \ -r /home/stack/ospd-12-vlan-dpdk-sriov-two-ports-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 /usr/share/openstack-tripleo-heat-templates/environments/neutron-sriov.yaml \ -e /home/stack/ospd-12-vlan-dpdk-sriov-two-ports-ctlplane-bonding/docker-images.yaml \ -e /home/stack/ospd-12-vlan-dpdk-sriov-two-ports-ctlplane-bonding/network-environment.yaml
ここで
-
/home/stack/ospd-12-vlan-dpdk-sriov-two-ports-ctlplane-bonding/roles_data.yaml
は更新されたroles_data.yaml
ファイルの場所です。このファイルが ComputeOvsDpdkSriov カスタムロールを定義します。 -
/home/stack/ospd-12-vlan-dpdk-sriov-two-ports-ctlplane-bonding/network-environment.yaml
には SR-IOV OVS-DPDK インターフェース用のロール固有のパラメーターが含まれています。
10.6. フレーバーの作成と SR-IOV および DPDK のインターフェースを使用したインスタンスのデプロイ
同じノード上で SR-IOV インターフェースと DPDK のインターフェースの設定が完了した後には、以下のステップを実行してフレーバーを作成し、インスタンスをデプロイする必要があります。
CPU ピニングされたインスタンスをピニングされていないインスタンスと分けるには、ホストアグリゲートを使用すべきです。CPU ピニングを使用していないインスタンスは、CPU ピニングを使用するインスタンスのリソース要件は順守しません。
フレーバーを作成します。
# openstack flavor create --vcpus 6 --ram 4096 --disk 40 compute
ここで
-
compute
はフレーバー名です。 -
4096
は MB 単位のメモリーの容量です。 -
40
は GB 単位のディスク容量です (デフォルトでは 0 G)。 -
6
は仮想 CPU の数です。
-
ラージページ用のフレーバーを設定します。
# openstack flavor set compute --property hw:mem_page_size=1GB
SR-IOV と DPDK 用のネットワークを作成します。
# openstack network create --name net-dpdk # openstack network create --name net-sriov # openstack subnet create --subnet-range <cidr/prefix> --network net-dpdk --gateway <gateway> net-dpdk-subnet # openstack subnet create --subnet-range <cidr/prefix> --network net-sriov --gateway <gateway> net-sriov-subnet
SR-IOV ポートを作成します。
vnic-type
direct を使用して SR-IOV VF ポートを作成します。# openstack port create --network net-sriov --vnic-type direct sriov_port
vnic-type
direct-physical を使用して SR-IOV PF ポートを作成します。# openstack port create --network net-sriov --vnic-type direct-physical sriov_port
インスタンスをデプロイします。
# openstack server create --flavor compute --image rhel_7.3 --nic port-id=sriov_port --nic net-id=net-dpdk vm1
ここで
- compute はフレーバー名または ID です。
-
rhel_7.3
はインスタンスの作成に使用するイメージ (名前または ID) です。 -
sriov_port
はコンピュートノード上の SR-IOV NIC です。 -
net-dpdk
は DPDK ネットワークです。 -
vm1
はインスタンス名です。
同じコンピュートノードで SR-IOV インターフェースと DPDK インターフェースを使用するインスタンスのデプロイが完了しました。