3.5. 使用 OVS-DPDK 支持安装 OpenDaylight


OpenDaylight 可能会通过 director 进行 Open vSwitch 数据平面开发套件 (DPDK)加速部署。当数据包在用户空间而不是内核中处理时,这种部署提供更高的数据平面性能。使用 OVS-DPDK 部署时,需要了解每个 Compute 节点的硬件物理布局,以利用潜在的性能提升。

您应该特别考虑:

  • 主机上的网络接口支持 DPDK
  • Compute 节点的 NUMA 节点拓扑(每个插槽、CPU 内核和内存的数量)
  • 每个 NUMA 节点的 DPDK NIC PCI 总线代理
  • Compute 节点上可用 RAM 量
  • 咨询 网络功能虚拟化规划和配置指南.

3.5.1. 准备 OVS-DPDK 部署文件

若要部署 OVS-DPDK,请使用不同的环境文件。该文件将覆盖 /usr/share/openstack-tripleo-heat-templates/environments/services-docker 目录中由 neutron-opendaylight.yaml 环境文件设置的一些参数。不要修改原始环境文件。反之,创建一个包含必要参数的新环境文件,如 neutron-opendaylight-dpdk.yaml

如果要使用默认设置的 OVS-DPDK 部署 OpenDaylight,请使用 /usr/share/openstack-tripleo-heat-templates/environments/services-docker 目录里的默认 neutron-opendaylight-dpdk.yaml 环境文件。

默认文件包含以下值:

# A Heat environment that can be used to deploy OpenDaylight with L3 DVR and DPDK.
# This file is to be used with neutron-opendaylight.yaml

parameter_defaults:
  NovaSchedulerDefaultFilters: "RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,NUMATopologyFilter"
  OpenDaylightSNATMechanism: 'controller'

  ComputeOvsDpdkParameters:
    OvsEnableDpdk: True

    ## Host configuration Parameters
    #TunedProfileName: "cpu-partitioning"
    #IsolCpusList: ""               # Logical CPUs list to be isolated from the host process (applied via cpu-partitioning tuned).
                                    # It is mandatory to provide isolated cpus for tuned to achive optimal performance.
                                    # Example: "3-8,12-15,18"
    #KernelArgs: ""                 # Space separated kernel args to configure hugepage and IOMMU.
                                    # Deploying DPDK requires enabling hugepages for the overcloud compute nodes.
                                    # It also requires enabling IOMMU when using the VFIO (vfio-pci) OvsDpdkDriverType.
                                    # This should be done by configuring parameters via host-config-and-reboot.yaml environment file.

    ## Attempting to deploy DPDK without appropriate values for the below parameters may lead to unstable deployments
    ## due to CPU contention of DPDK PMD threads.
    ## It is highly recommended to to enable isolcpus (via KernelArgs) on compute overcloud nodes and set the following parameters:
    #OvsDpdkSocketMemory: ""       # Sets the amount of hugepage memory to assign per NUMA node.
                                   # It is recommended to use the socket closest to the PCIe slot used for the
                                   # desired DPDK NIC.  Format should be comma separated per socket string such as:
                                   # "<socket 0 mem MB>,<socket 1 mem MB>", for example: "1024,0".
    #OvsDpdkDriverType: "vfio-pci" # Ensure the Overcloud NIC to be used for DPDK supports this UIO/PMD driver.
    #OvsPmdCoreList: ""            # List or range of CPU cores for PMD threads to be pinned to.  Note, NIC
                                   # location to cores on socket, number of hyper-threaded logical cores, and
                                   # desired number of PMD threads can all play a role in configuring this setting.
                                   # These cores should be on the same socket where OvsDpdkSocketMemory is assigned.
                                   # If using hyperthreading then specify both logical cores that would equal the
                                   # physical core.  Also, specifying more than one core will trigger multiple PMD
                                   # threads to be spawned, which may improve dataplane performance.
    #NovaVcpuPinSet: ""            # Cores to pin Nova instances to.  For maximum performance, select cores
                                   # on the same NUMA node(s) selected for previous settings.
Copy to Clipboard Toggle word wrap

3.5.2. 配置 OVS-DPDK 部署

您可以通过更改 neutron-opendaylight-dpdk.yaml 中的值来配置 OVS-DPDK 服务。

Expand

TunedProfileName

启用 IRQ 的固定,以便将它们与 OVS-DPDK 搭配使用的 CPU 核心进行隔离。默认配置集: cpu-partitioning

IsolCpusList

指定 CPU 内核列表,以防止内核调度程序使用这些内核,而是可以分配并专用于 OVS-DPDK。格式采用以逗号分隔的独立列表或一系列内核,例如 1,2,3,4-8,10-12

KernelArgs

列出在引导时要传递给内核的参数。对于 OVS-DPDK,需要启用 IOMMUHugepages,例如:

---- intel_iommu=on iommu=pt default_hugepagesz=1GB hugepagesz=1G hugepages=60 ----

请注意,指定的 RAM 量对于大页是 60 GB。在设置此值时,务必要考虑 Compute 节点上的可用 RAM 量。

OvsDpdkSocketMemory

指定要分配给每个 NUMA 节点的巨页内存量(以 MB 为单位)。要获得最佳性能,请将内存分配给最接近 DPDK NIC 的套接字。列出每个套接字的内存格式:

---- "<socket 0 mem MB>,<socket 1 mem MB>" ----

例如:"1024,0"

OvsDpdkDriverType

指定要用于 PMD 线程的 UIO 驱动程序类型。DPDK NIC 必须支持指定的驱动程序。Red Hat OpenStack Platform 部署支持驱动程序类型 vfio-pci。Red Hat OpenStack Platform 部署不支持 UIO 驱动程序,包括 uio_pci_genericigb_uio

OvsPmdCoreList

列出要固定到的 PMD 线程的单个内核数或范围。此处指定的内核应位于使用 OvsDpdkSocketMemory 设置分配的内存的同一 NUMA 节点上。如果使用超线程,请指定组成主机物理内核的逻辑内核。

OvsDpdkMemoryChannels

指定每个套接字的内存频道数。

NovaVcpuPinSet

使用 libvirtd 将 nova 实例固定到。为了获得最佳性能,在已固定 OVS PMD 核心相同的插槽上的内核。

3.5.3. 使用 OVS-DPDK 安装 OpenDaylight

开始前

流程

  1. 使用必要的环境文件运行部署命令,以启用 OpenDaylight 的 DPDK 功能。
$ openstack overcloud deploy --templates /usr/share/openstack-tripleo-heat-templates
-e <other environment files>
-e /usr/share/openstack-tripleo-heat-templates/environments/services-docker/neutron-opendaylight.yaml
-e /usr/share/openstack-tripleo-heat-templates/environments/services-docker/neutron-opendaylight-dpdk.yaml
-e network-environment.yaml --compute-scale 1 --ntp-server 0.se.pool.ntp.org --control-flavor control --compute-flavor compute -r my_roles_data.yaml
-e /home/stack/templates/docker-images.yaml
-e /home/stack/templates/odl-images.yaml
Copy to Clipboard Toggle word wrap
注意

部署命令中存在的环境文件会覆盖您在 命令中之前包含的环境文件。您必须注意您包括的环境文件顺序以避免意外覆盖参数。

提示

您可以通过创建一个最小的环境文件来覆盖一些参数,该文件只设置您要更改的参数并将其与默认环境文件合并。

本节介绍带有 ODL 和 VXLAN 隧道的 OVS-DPDK 配置示例。

重要

您必须确定 network-environment.yaml 文件中设置的 OVS-DPDK 参数的最佳值,以优化 OVS-DPDK 的 OpenStack 网络。详情请参阅使用 工作流 Deriving DPDK 参数

3.5.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
Copy to Clipboard Toggle word wrap

3.5.4.2. 配置 OVS-DPDK 参数

重要

您必须确定 network-environment.yaml 文件中设置的 OVS-DPDK 参数的最佳值,以优化 OVS-DPDK 的 OpenStack 网络。详情请查看 https://access.redhat.com/documentation/zh-cn/red_hat_openstack_platform/13/html/network_functions_virtualization_planning_and_configuration_guide/part-dpdk-configure#proc_derive-dpdk

  1. 将 OVS-DPDK 的自定义资源添加到 resource_registry 下:

      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
    Copy to Clipboard Toggle word wrap
  2. parameter_defaults 下,将隧道类型和租户类型设置为 vxlan

    NeutronTunnelTypes: 'vxlan'
    NeutronNetworkType: 'vxlan'
    Copy to Clipboard Toggle word wrap
  3. parameters_defaults 下,设置网桥映射:

    # The OVS logical->physical bridge mappings to use.
    NeutronBridgeMappings: 'tenant:br-link0'
    OpenDaylightProviderMappings: 'tenant:br-link0'
    Copy to Clipboard Toggle word wrap
  4. parameter_defaults 下,为 ComputeOvsDpdk 角色设置特定于角色的参数:

      ##########################
      # OVS DPDK configuration #
      ##########################
      ComputeOvsDpdkParameters:
        KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on isolcpus=2-19,22-39"
        TunedProfileName: "cpu-partitioning"
        IsolCpusList: "2-19,22-39"
        NovaVcpuPinSet: ['4-19,24-39']
        NovaReservedHostMemory: 4096
        OvsDpdkSocketMemory: "4096,4096"
        OvsDpdkMemoryChannels: "4"
        OvsDpdkCoreList: "0,20,1,21"
        OvsPmdCoreList: "2,22,3,23"
        OvsEnableDpdk: true
    Copy to Clipboard Toggle word wrap
    注意

    您必须在具有或没有 DPDK PMD 的 DPDK NIC 的每个 NUMA 节点上分配至少一个 CPU (具有同级线程),以避免创建客户机实例中失败。

    注意

    这些大页面由虚拟机消耗,以及使用 OvsDpdkSocketMemory 参数的 OVS-DPDK,如此流程所示。虚拟机的巨页数量是 引导参数 减去 OvsDpdkSocketMemory

    您还必须将 hw:mem_page_size=1GB 添加到与 DPDK 实例关联的类别中。

    注意

    OvsDPDKCoreListOvsDpdkMemoryChannels 是此流程所需的设置。在没有适当值的情况下尝试部署 DPDK 会导致部署失败,或导致部署不稳定。

3.5.4.3. 配置 Controller 节点

  1. 为隔离的网络创建 control plane 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: eth1
          primary: true
    Copy to Clipboard Toggle word wrap
  2. 将 VLAN 分配给此 Linux 绑定。

      - 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
    Copy to Clipboard Toggle word wrap
  3. 创建 OVS 网桥,以访问浮动 IP 到云网络中。

      - type: ovs_bridge
        name: br-link0
        use_dhcp: false
        mtu: 9000
        members:
        - type: interface
          name: eth2
          mtu: 9000
        - type: vlan
          vlan_id:
            get_param: TenantNetworkVlanID
          mtu: 9000
          addresses:
          - ip_netmask:
              get_param: TenantIpSubnet
    Copy to Clipboard Toggle word wrap

3.5.4.4. 为 DPDK 接口配置 Compute 节点

从默认的 compute.yaml 文件创建 compute-ovs-dpdk.yaml 文件,并进行以下更改:

  1. 为隔离的网络创建 control plane Linux 绑定。

      - type: linux_bond
        name: bond_api
        bonding_options: "mode=active-backup"
        use_dhcp: false
        dns_servers:
          get_param: DnsServers
        members:
        - type: interface
          name: nic7
          primary: true
        - type: interface
          name: nic8
    Copy to Clipboard Toggle word wrap
  2. 将 VLAN 分配给此 Linux 绑定。

      - 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
    Copy to Clipboard Toggle word wrap
  3. 使用 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: nic3
              - type: ovs_dpdk_port
                name: dpdk1
                members:
                  - type: interface
                    name: nic4
    Copy to Clipboard Toggle word wrap
    注意

    要包含多个 DPDK 设备,请为您要添加的每个 DPDK 设备重复 类型 代码部分。

    注意

    在使用 OVS-DPDK 时,同一计算节点上的 所有 网桥都应是 ovs_user_bridge 类型。director 可以接受配置,但 Red Hat OpenStack Platform 不支持同一节点上的 ovs_bridgeovs_user_bridge

3.5.4.5. 部署 overcloud

运行 overcloud_deploy.sh 脚本来部署 overcloud。

  #!/bin/bash

  openstack overcloud deploy \
--templates \
-r /home/stack/ospd-13-vxlan-dpdk-odl-ctlplane-dataplane-bonding-hybrid/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/services-docker/neutron-opendaylight.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/services-docker/neutron-opendaylight-dpdk.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/ovs-dpdk-permissions.yaml \
-e /home/stack/ospd-13-vxlan-dpdk-odl-ctlplane-dataplane-bonding-hybrid/docker-images.yaml \
-e /home/stack/ospd-13-vxlan-dpdk-odl-ctlplane-dataplane-bonding-hybrid/network-environment.yaml
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat