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 コンポーザブルロールを作成するには、以下の手順を実行します。

  1. ローカルディレクトリーに 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
  2. 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 ファイルを使用しています。

  1. 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 のロール固有のパラメーターを設定します。

  1. 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
  2. フレーバーを定義します。

      OvercloudControllerFlavor: controller
      OvercloudComputeOvsDpdkSriovFlavor: compute
  3. 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"
  4. 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 を (シブリングスレッドとともに) 割り当てて、ゲストインスタンスの作成でエラーが発生するのを回避する必要があります。

  5. 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 ファイルを作成します。

  1. 分離ネットワーク用にコントロールプレーンの 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
  2. この 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
  3. コントローラーにリンクするための 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_bridgeovs_user_bridge が混在する構成はサポートしていません。

  4. コントローラーに対する 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 ピニングを使用するインスタンスのリソース要件は順守しません。

  1. フレーバーを作成します。

    # openstack flavor create --vcpus 6 --ram 4096 --disk 40 compute

    ここで

    • compute はフレーバー名です。
    • 4096 は MB 単位のメモリーの容量です。
    • 40 は GB 単位のディスク容量です (デフォルトでは 0 G)。
    • 6 は仮想 CPU の数です。
  2. ラージページ用のフレーバーを設定します。

    # openstack flavor set compute --property hw:mem_page_size=1GB
  3. 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
  4. SR-IOV ポートを作成します。

    1. vnic-type direct を使用して SR-IOV VF ポートを作成します。

      # openstack port create --network net-sriov --vnic-type direct sriov_port
    2. vnic-type direct-physical を使用して SR-IOV PF ポートを作成します。

      # openstack port create --network net-sriov --vnic-type direct-physical sriov_port
  5. インスタンスをデプロイします。

    # 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 インターフェースを使用するインスタンスのデプロイが完了しました。