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.
3.5.2. 配置 OVS-DPDK 部署 复制链接链接已复制到粘贴板!
您可以通过更改 neutron-opendaylight-dpdk.yaml 中的值来配置 OVS-DPDK 服务。
|
|
启用 IRQ 的固定,以便将它们与 OVS-DPDK 搭配使用的 CPU 核心进行隔离。默认配置集: |
|
|
指定 CPU 内核列表,以防止内核调度程序使用这些内核,而是可以分配并专用于 OVS-DPDK。格式采用以逗号分隔的独立列表或一系列内核,例如 |
|
|
列出在引导时要传递给内核的参数。对于 OVS-DPDK,需要启用
---- 请注意,指定的 RAM 量对于大页是 60 GB。在设置此值时,务必要考虑 Compute 节点上的可用 RAM 量。 |
|
| 指定要分配给每个 NUMA 节点的巨页内存量(以 MB 为单位)。要获得最佳性能,请将内存分配给最接近 DPDK NIC 的套接字。列出每个套接字的内存格式: ---- "<socket 0 mem MB>,<socket 1 mem MB>" ---- 例如:"1024,0" |
|
|
指定要用于 PMD 线程的 UIO 驱动程序类型。DPDK NIC 必须支持指定的驱动程序。Red Hat OpenStack Platform 部署支持驱动程序类型 |
|
|
列出要固定到的 PMD 线程的单个内核数或范围。此处指定的内核应位于使用 |
|
| 指定每个套接字的内存频道数。 |
|
| 使用 libvirtd 将 nova 实例固定到。为了获得最佳性能,在已固定 OVS PMD 核心相同的插槽上的内核。 |
3.5.3. 使用 OVS-DPDK 安装 OpenDaylight 复制链接链接已复制到粘贴板!
开始前
- 安装 undercloud。如需更多信息 ,请参阅安装 undercloud。
- 创建环境文件,并链接到 overcloud 容器镜像。如需更多信息,请参阅使用 OpenDaylight 准备 overcloud 安装。
- 准备角色文件,以在具有 SR-IOV 支持的自定义角色中配置 OpenDaylight。如需更多信息,请参阅准备 OVS-DPDK 部署文件。
流程
- 使用必要的环境文件运行部署命令,以启用 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
部署命令中存在的环境文件会覆盖您在 命令中之前包含的环境文件。您必须注意您包括的环境文件顺序以避免意外覆盖参数。
您可以通过创建一个最小的环境文件来覆盖一些参数,该文件只设置您要更改的参数并将其与默认环境文件合并。
3.5.4. 示例:使用 ODL 和 VXLAN 隧道处理配置 OVS-DPDK 复制链接链接已复制到粘贴板!
本节介绍带有 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
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。
将 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在
parameter_defaults下,将隧道类型和租户类型设置为vxlan:NeutronTunnelTypes: 'vxlan' NeutronNetworkType: 'vxlan'在
parameters_defaults下,设置网桥映射:# The OVS logical->physical bridge mappings to use. NeutronBridgeMappings: 'tenant:br-link0' OpenDaylightProviderMappings: 'tenant:br-link0'在
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注意您必须在具有或没有 DPDK PMD 的 DPDK NIC 的每个 NUMA 节点上分配至少一个 CPU (具有同级线程),以避免创建客户机实例中失败。
注意这些大页面由虚拟机消耗,以及使用
OvsDpdkSocketMemory参数的 OVS-DPDK,如此流程所示。虚拟机的巨页数量是引导参数减去OvsDpdkSocketMemory。您还必须将
hw:mem_page_size=1GB添加到与 DPDK 实例关联的类别中。注意OvsDPDKCoreList和OvsDpdkMemoryChannels是此流程所需的设置。在没有适当值的情况下尝试部署 DPDK 会导致部署失败,或导致部署不稳定。
3.5.4.3. 配置 Controller 节点 复制链接链接已复制到粘贴板!
为隔离的网络创建 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将 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创建 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
3.5.4.4. 为 DPDK 接口配置 Compute 节点 复制链接链接已复制到粘贴板!
从默认的 compute.yaml 文件创建 compute-ovs-dpdk.yaml 文件,并进行以下更改:
为隔离的网络创建 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将 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使用 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注意要包含多个 DPDK 设备,请为您要添加的每个 DPDK 设备重复
类型代码部分。注意在使用 OVS-DPDK 时,同一计算节点上的 所有 网桥都应是
ovs_user_bridge类型。director 可以接受配置,但 Red Hat OpenStack Platform 不支持同一节点上的ovs_bridge和ovs_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