网络功能虚拟化规划和配置指南
规划和配置网络功能虚拟化(NFV)OpenStack 部署
OpenStack Documentation Team
rhos-docs@redhat.com摘要
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
对红帽文档提供反馈
我们感谢您对文档提供反馈信息。与我们分享您的成功秘诀。
使用直接文档反馈(DDF)功能
使用 添加反馈 DDF 功能,用于特定句子、段落或代码块上的直接注释。
- 以 Multi-page HTML 格式查看文档。
- 请确定您看到文档右上角的 反馈 按钮。
- 用鼠标指针高亮显示您想评论的文本部分。
- 点 添加反馈。
- 使用您的评论 完成 Add feedback 字段。
- 可选:添加您的电子邮件地址,以便文档团队可以联系您的问题。
- 点 Submit。
第 1 章 NFV 概述
网络功能虚拟化(NFV)是一种能虚拟化网络功能(如网络交换机、基于云的基础架构)的软件解决方案。NFV 允许通信服务提供商脱离传统或专有硬件。
有关 NFV 概念的高级概述,请参阅 网络功能虚拟化产品指南。
OVS-DPDK 和 SR-IOV 配置取决于您的硬件和拓扑。本指南提供了与拓扑和用例不同的 CPU 分配、内存分配和 NIC 配置的示例。
使用 Red Hat OpenStack Platform director 来隔离特定的网络类型,如外部、项目、内部 API 等。您可以在单个网络接口上部署网络,或者通过多主机网络接口分发。使用 Open vSwitch,您可以通过为单个网桥分配多个接口来创建绑定。使用模板文件在 Red Hat OpenStack Platform 安装中配置网络隔离。如果没有提供模板文件,则服务网络会在 provisioning 网络上部署。模板配置文件有两种类型:
-
network-environment.yaml- 此文件包含用于 overcloud 节点的网络详细信息,如子网和 IP 地址范围。此文件还包含不同的设置,用于覆盖不同场景的默认参数值。 -
主机网络模板,如
compute.yaml和controller.yaml- 定义 overcloud 节点的网络接口配置。网络详情的值由network-environment.yaml文件提供。
这些 heat 模板文件位于 undercloud 节点上的 /usr/share/openstack-tripleo-heat-templates/。
硬件要求和软件要求部分提供了有关如何使用 Red Hat OpenStack Platform director 规划和配置 NFV 的 heat 模板文件的更多详细信息。
您可以编辑 YAML 文件来配置 NFV。有关 YAML 文件格式的介绍,请参阅 Nutshell 中的 YAML。
第 2 章 硬件要求
本节介绍 NFV 的硬件要求。
有关 Red Hat OpenStack Platform 认证硬件的完整列表,请参阅 Red Hat OpenStack Platform 认证硬件。
2.1. 测试的 NIC
有关 NFV 测试 NIC 列表,请查看红帽知识库解决方案 网络适配器 Fast Datapath 功能支持列表。
如果在 Mellanox ConnectX-4 或 ConnectX-5 网络接口中配置 OVS-DPDK,则必须在 compute-ovs-dpdk.yaml 文件中设置对应的内核驱动程序:
members
- type: ovs_dpdk_port
name: dpdk0
driver: mlx5_core
members:
- type: interface
name: enp3s0f02.2. 硬件卸载故障排除
在 Red Hat OpenStack Platform(RHOSP)16.2 部署中,OVS 硬件 Offload 可能不会卸载带有 switchdev- 支持端口和 Mellanox ConnectX5 NIC 的虚拟机的流。要排除并配置卸载流,请禁用 ESWITCH_IPV4_TTL_MODIFY_ENABLE Mellanox 固件参数。有关 RHOSP 16.2 中的 OVS 硬件卸载的更多信息,请参阅 OpenStack Platform 16.2 中带有 Mellanox NIC 的 Red Hat Knowledgebase 解决方案 OVS 硬件卸载。
流程
- 在 RHOSP 部署中登录到具有您要配置的 Mellanox NIC 的 Compute 节点。
使用
mstflint程序查询ESWITCH_IPV4_TTL_MODIFY_ENABLEMellanox 固件参数。[root@compute-1 ~]# yum install -y mstflint [root@compute-1 ~]# mstconfig -d <PF PCI BDF> q ESWITCH_IPV4_TTL_MODIFY_ENABLE
如果
ESWITCH_IPV4_TTL_MODIFY_ENABLE参数已启用并设置为1,则将值设为0来禁用它。[root@compute-1 ~]# mstconfig -d <PF PCI BDF> s ESWITCH_IPV4_TTL_MODIFY_ENABLE=0`
- 重新引导节点。
2.3. 发现 NUMA 节点拓扑
在计划部署时,您必须了解 Compute 节点的 NUMA 拓扑,以对 CPU 和内存资源进行分区,以实现最佳性能。要确定 NUMA 信息,请执行以下任务之一:
- 启用硬件内省以从裸机节点中检索此信息。
- 登录到每个裸机节点来手动收集信息。
您必须安装和配置 undercloud,然后才能通过硬件内省来检索 NUMA 信息。有关 undercloud 配置的更多信息,请参阅: Director 安装和使用指南。
获取硬件内省详细信息
裸机服务 hardware-inspection-extras 功能默认启用,您可以使用它来检索 overcloud 配置的硬件详情。有关 undercloud.conf 文件中的 inspection_extras 参数的更多信息,请参阅配置 Director。
例如,numa_topology 收集程序就是硬件检查额外功能的一部分,包括每个 NUMA 节点的以下信息:
- RAM(单位为 KB)
- 物理 CPU 内核数和同级线程数
- 和 NUMA 节点关联的 NIC
要获得以上列出的信息,请使用裸机节点的 UUID 替换 <UUID> 来完成以下命令:
# openstack baremetal introspection data save <UUID> | jq .numa_topology
以下示例显示获取的裸机节点 NUMA 信息:
{
"cpus": [
{
"cpu": 1,
"thread_siblings": [
1,
17
],
"numa_node": 0
},
{
"cpu": 2,
"thread_siblings": [
10,
26
],
"numa_node": 1
},
{
"cpu": 0,
"thread_siblings": [
0,
16
],
"numa_node": 0
},
{
"cpu": 5,
"thread_siblings": [
13,
29
],
"numa_node": 1
},
{
"cpu": 7,
"thread_siblings": [
15,
31
],
"numa_node": 1
},
{
"cpu": 7,
"thread_siblings": [
7,
23
],
"numa_node": 0
},
{
"cpu": 1,
"thread_siblings": [
9,
25
],
"numa_node": 1
},
{
"cpu": 6,
"thread_siblings": [
6,
22
],
"numa_node": 0
},
{
"cpu": 3,
"thread_siblings": [
11,
27
],
"numa_node": 1
},
{
"cpu": 5,
"thread_siblings": [
5,
21
],
"numa_node": 0
},
{
"cpu": 4,
"thread_siblings": [
12,
28
],
"numa_node": 1
},
{
"cpu": 4,
"thread_siblings": [
4,
20
],
"numa_node": 0
},
{
"cpu": 0,
"thread_siblings": [
8,
24
],
"numa_node": 1
},
{
"cpu": 6,
"thread_siblings": [
14,
30
],
"numa_node": 1
},
{
"cpu": 3,
"thread_siblings": [
3,
19
],
"numa_node": 0
},
{
"cpu": 2,
"thread_siblings": [
2,
18
],
"numa_node": 0
}
],
"ram": [
{
"size_kb": 66980172,
"numa_node": 0
},
{
"size_kb": 67108864,
"numa_node": 1
}
],
"nics": [
{
"name": "ens3f1",
"numa_node": 1
},
{
"name": "ens3f0",
"numa_node": 1
},
{
"name": "ens2f0",
"numa_node": 0
},
{
"name": "ens2f1",
"numa_node": 0
},
{
"name": "ens1f1",
"numa_node": 0
},
{
"name": "ens1f0",
"numa_node": 0
},
{
"name": "eno4",
"numa_node": 0
},
{
"name": "eno1",
"numa_node": 0
},
{
"name": "eno3",
"numa_node": 0
},
{
"name": "eno2",
"numa_node": 0
}
]
}2.4. NFV BIOS 设置
下表描述了 NFV 所需的 BIOS 设置:
您必须在 BIOS 中启用 SR-IOV 全局和 NIC 设置,否则带有 SR-IOV Compute 节点的 Red Hat OpenStack Platform (RHOSP)部署将失败。
表 2.1. BIOS 设置
| 参数 | 设置 |
|---|---|
|
| 已禁用。 |
|
| 已禁用。 |
|
| 已启用。 |
|
| 已启用。 |
|
| 已启用。 |
|
| 已启用。 |
|
| 性能。 |
|
| 已启用。 |
|
|
在需要确定性能的 NFV 部署中禁用。 |
|
| 如果需要 VFIO 功能,为 Intel 卡启用。 |
|
| 已禁用。 |
在使用 intel_idle 驱动程序的处理器上,Red Hat Enterprise Linux 可以忽略 BIOS 设置并重新启用处理器 C-state。
您可以通过在内核引导命令行中指定键值对 intel_idle .max_cstate=0 来禁用 intel_idle,而是使用 驱动程序。
acpi_ idle
通过检查 current_driver 的内容来确认处理器正在使用 acpi_idle 驱动程序:
# cat /sys/devices/system/cpu/cpuidle/current_driver acpi_idle
更改驱动程序后会出现一些延迟,因为它需要时间进行 Tuned 守护进程启动。但是,在 Tuned 加载后,处理器不使用更深入的 C-state。
第 3 章 软件要求
本节介绍 NFV 所需的受支持配置和驱动程序,以及 NFV 所需的订阅详情。
3.1. 注册并启用软件仓库
要安装 Red Hat OpenStack Platform,您必须使用 Red Hat Subscription Manager 注册 Red Hat OpenStack Platform director,并订阅所需的频道。有关注册和更新 undercloud 的更多信息,请参阅 注册您的系统。
流程
使用 Content Delivery Network 注册您的系统,在提示时输入您的客户门户网站用户名和密码。
[stack@director ~]$ sudo subscription-manager register
确定 Red Hat OpenStack Platform director 的权利池 ID,如以下命令中的 {Pool ID} 和输出:
[stack@director ~]$ sudo subscription-manager list --available --all --matches="Red Hat OpenStack" Subscription Name: Name of SKU Provides: Red Hat Single Sign-On Red Hat Enterprise Linux Workstation Red Hat CloudForms Red Hat OpenStack Red Hat Software Collections (for RHEL Workstation) Red Hat Virtualization SKU: SKU-Number Contract: Contract-Number Pool ID: {Pool-ID}-123456 Provides Management: Yes Available: 1 Suggested: 1 Service Level: Support-level Service Type: Service-Type Subscription Type: Sub-type Ends: End-date System Type: Physical在以下命令中包括
池 ID值来附加 Red Hat OpenStack Platform 16.2 权利。[stack@director ~]$ sudo subscription-manager attach --pool={Pool-ID}-123456禁用默认软件仓库。
subscription-manager repos --disable=*
使用 NFV 启用 Red Hat OpenStack Platform 所需的软件仓库。
$ sudo subscription-manager repos --enable=rhel-8-for-x86_64-baseos-eus-rpms \ --enable=rhel-8-for-x86_64-appstream-eus-rpms \ --enable=rhel-8-for-x86_64-highavailability-eus-rpms \ --enable=ansible-2.9-for-rhel-8-x86_64-rpms \ --enable=openstack-16.2-for-rhel-8-x86_64-rpms \ --enable=rhel-8-for-x86_64-nfv-rpms \ --enable=fast-datapath-for-rhel-8-x86_64-rpms
更新您的系统,以便您拥有最新的基本系统软件包。
[stack@director ~]$ sudo dnf update -y [stack@director ~]$ sudo reboot
要注册 overcloud 节点,请参阅 基于 Ansible 的注册。
3.2. NFV 部署支持的配置
Red Hat OpenStack Platform(RHOSP)支持以下 NFV 部署,使用 director:
- 单根 I/O 虚拟化(SR-IOV)
- 带有 Data Plane Development Kit(OVS-DPDK)的 Open vSwitch
另外,您可以使用以下功能部署 RHOSP:
3.2.1. 使用 OVS 机制驱动程序部署 RHOSP
使用 OVS 机制驱动程序部署 RHOSP:
流程
修改
containers-prepare-parameter.yaml文件,使neutron_driver参数设置为ovs。parameter_defaults: ContainerImagePrepare: - push_destination: true set: neutron_driver: ovs ...将
neutron-ovs.yaml环境文件包含到/usr/share/openstack-tripleo-heat-templates/environments/services目录中。TEMPLATES=/usr/share/openstack-tripleo-heat-templates openstack overcloud deploy --templates \ -e ${TEMPLATES}/environments/network-environment.yaml \ -e ${TEMPLATES}/environments/network-isolation.yaml \ -e ${TEMPLATES}/environments/services/neutron-ovs.yaml \ -e ${TEMPLATES}/environments/services/neutron-ovs-dpdk.yaml \ -e ${TEMPLATES}/environments/services/neutron-sriov.yaml \ -e /home/stack/containers-prepare-parameter.yaml
3.2.2. 使用 OVS-DPDK 和 SR-IOV 部署 OVN
在与 OVN 相同的节点上部署 DPDK 和 SRIOV 虚拟机。
流程
生成
ComputeOvsDpdkSriov角色:openstack overcloud roles generate -o roles_data.yaml Controller ComputeOvsDpdkSriov
-
将
OS::TripleO::Services::OVNMetadataAgent添加到 Controller 角色。 使用
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::ComputeOvsDpdkSriov::Net::SoftwareConfig: nic-configs/computeovsdpdksriov.yaml OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml在 parameter_defaults 部分中,将 tunnel type 参数的值编辑为
geneve:NeutronTunnelTypes: 'geneve' NeutronNetworkType: ['geneve', 'vlan']
可选:如果您使用集中式路由模型,请禁用分布式虚拟路由(DVR):
NeutronEnableDVR: false
在
parameters_defaults下,设置网桥映射:# The OVS logical-to-physical bridge mappings to use. NeutronBridgeMappings: "datacentre:br-ex,data1:br-link0,data2:br-link1"
在
computeovsdpdksriov.yaml文件中配置网络接口:- 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_port name: br-link0-dpdk-port0 rx_queue: 1 members: - type: interface name: eno3 - type: sriov_pf name: eno4 use_dhcp: false numvfs: 5 defroute: false nm_controlled: true hotplug: true promisc: false在部署脚本中包含以下 yaml 文件:
- neutron-ovn-dpdk.yaml
- neutron-ovn-sriov.yaml
Open Virtual Networking (OVN) 是 Red Hat OpenStack Platform 16.2 中的默认网络机制驱动程序。如果要将 OVN 与分布式虚拟路由 (DVR) 搭配使用,则必须在 openstack overcloud deploy 命令中包含 environments/services/neutron-ovn-dvr-ha.yaml 文件。如果要在没有 DVR 的情况下使用 OVN,则必须在 openstack overcloud deploy 命令中包含 environments/services/neutron-ovn-ha.yaml 文件,并将 NeutronEnableDVR 参数设置为 false。如果要将 OVN 与 SR-IOV 搭配使用,您必须将 environments/services/neutron-ovn-sriov.yaml 文件作为 openstack overcloud deploy 命令的最后一个 OVN 环境文件中找到。
3.2.3. 使用 OVS TC 流程序卸载部署 OVN
在与 OVN 相同的节点上部署 OVS TC 流程序卸载。
Red Hat Enterprise Linux 流量控制(TC)子系统不支持连接跟踪(conntrack)帮助程序或应用程序层网关(ALG)。因此,如果您使用 ALG,则必须禁用 TC Flower 卸载。
流程
生成
ComputeOvsDpdkSriov角色:openstack overcloud roles generate -o roles_data.yaml ControllerSriov ComputeSriov
配置与部署相关的
physical_network参数设置。-
对于 VLAN,将
physical_network参数设置为部署后您在 neutron 中创建的网络的名称。还对NeutronBridgeMappings参数使用这个值。 在特定于角色的参数下,如
ComputeSriovOffloadParameters,确保OvsHwOffload参数的值为true。parameter_defaults: NeutronBridgeMappings: 'datacentre:br-ex,tenant:br-offload' NeutronNetworkVLANRanges: 'tenant:502:505' NeutronFlatNetworks: 'datacentre,tenant' NeutronPhysicalDevMappings: - tenant:ens1f0 - tenant:ens1f1 NovaPCIPassthrough: - address: "0000:17:00.1" physical_network: "tenant" - address: "0000:3b:00.1" physical_network: "tenant" NeutronTunnelTypes: '' NeutronNetworkType: 'vlan' ComputeSriovOffloadParameters: OvsHwOffload: True KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32 intel_iommu=on iommu=pt isolcpus=1-11,13-23" IsolCpusList: "1-11,13-23" NovaReservedHostMemory: 4096 NovaComputeCpuDedicatedSet: ['1-11','13-23'] NovaComputeCpuSharedSet: ['0','12']
-
对于 VLAN,将
在
computeovsdpdksriov.yaml文件中配置网络接口:- type: ovs_bridge name: br-offload mtu: 9000 use_dhcp: false addresses: - ip_netmask: get_param: TenantIpSubnet members: - type: linux_bond name: bond-pf bonding_options: "mode=active-backup miimon=100" members: - type: sriov_pf name: ens1f0 numvfs: 3 primary: true promisc: true use_dhcp: false defroute: false link_mode: switchdev - type: sriov_pf name: ens1f1 numvfs: 3 promisc: true use_dhcp: false defroute: false link_mode: switchdev在部署脚本中包含以下 yaml 文件:
- ovs-hw-offload.yaml
neutron-ovn-sriov.yaml
TEMPLATES_HOME=”/usr/share/openstack-tripleo-heat-templates” CUSTOM_TEMPLATES=”/home/stack/templates” openstack overcloud deploy --templates \ -r ${CUSTOM_TEMPLATES}/roles_data.yaml \ -e ${TEMPLATES_HOME}/environments/services/neutron-ovn-sriov.yaml \ -e ${TEMPLATES_HOME}/environments/ovs-hw-offload.yaml \ -e ${CUSTOM_TEMPLATES}/network-environment.yaml
3.3. 支持的驱动程序
有关支持的驱动程序的完整列表,请参阅 Red Hat OpenStack Platform 中的组件、插件和驱动程序支持 。
有关使用 NFV 为 Red Hat OpenStack Platform 部署测试的 NIC 列表,请参阅 Tested NIC。
3.4. 与第三方软件兼容
有关已测试、受支持且已通过 Red Hat OpenStack Platform 执行的产品和服务的完整列表,请参阅 与 Red Hat OpenStack Platform 兼容的第三方软件。您可以根据产品版本和软件类别过滤列表。
有关使用 Red Hat Enterprise Linux 执行的产品和服务的完整列表,请参阅 第三方软件与 Red Hat Enterprise Linux 兼容。您可以根据产品版本和软件类别过滤列表。
第 4 章 网络注意事项
undercloud 主机至少需要以下网络:
- Provisioning 网络 - 提供 DHCP 和 PXE 引导功能,以帮助发现 overcloud 中使用的裸机系统。
- 外部网络 - 一个单独的网络,用于远程连接所有节点。连接到此网络的接口需要静态定义的可路由 IP 地址,或者从外部 DHCP 服务动态生成。
最小 overcloud 网络配置包括以下 NIC 配置:
- 单 NIC 配置 - 一个 NIC 在原生 VLAN 中用于 provisioning 网络,并带有标记的 VLAN(将子网用于不同的 overcloud 网络类型)。
- 双 NIC 配置 - 一个 NIC 用于 provisioning 网络,为外部网络使用其他 NIC。
- 双 NIC 配置 - 一个 NIC 在原生 VLAN 上用于 provisioning 网络,另一个 NIC 用于带有标记的 VLAN,子网用于不同的 overcloud 网络类型。
- 多 NIC 配置 - 每个 NIC 都使用一个子网来分别处理 overcloud 中不同的网络类型。
有关网络要求的更多信息,请参阅 网络要求。
第 5 章 规划 SR-IOV 部署
通过根据您的 Compute 节点硬件设置个别参数,为 NFV 优化单个根 I/O 虚拟化(SR-IOV)部署。
请参阅 发现 NUMA 节点拓扑,以评估影响 SR-IOV 参数的硬件。
5.1. SR-IOV 部署的硬件分区
要使用 SR-IOV 实现高性能,请对主机和客户机之间的资源进行分区。

典型的拓扑包括每个 NUMA 节点在双套接字 Compute 节点上的 14 个内核。支持超线程(HT)和非HT 内核。每个内核有两个同级线程。一个核心专用于每个 NUMA 节点上的主机。虚拟网络功能(VNF)处理 SR-IOV 接口绑定。所有中断请求(IRQ)都路由到主机内核。VNF 核心专用于 VNF。它们与其他 VNF 和与主机隔离提供隔离。每个 VNF 都必须使用单一 NUMA 节点上的资源。VNF 使用的 SR-IOV NIC 还必须与相同的 NUMA 节点关联。这个拓扑没有虚拟化开销。主机、OpenStack Networking(neutron)和计算(nova)配置参数在单一文件中公开,以便简化、一致性和避免致使严重隔离、导致抢占和数据包丢失。主机和虚拟机隔离依赖于 tuned 配置集,它根据隔离 CPU 的列表定义引导参数和任何 Red Hat OpenStack Platform 修改。
5.2. NFV SR-IOV 部署的拓扑
以下镜像有两个 VNF,各自具有 mgt 和 data plane 接口代表的管理接口。管理接口管理 ssh 访问,以此类推。data plane 接口将 VNF 绑定到 DPDK 以确保高可用性,因为 VNF 会使用 DPDK 库绑定 data plane 接口。该镜像还有两个提供商网络来实现冗余。Compute 节点有两个常规 NIC 绑定,在 VNF 管理和红帽 OpenStack 平台 API 管理间共享。

镜像显示在应用程序级别使用 DPDK,并可访问 SR-IOV 虚拟功能(VF)和物理功能(PF),以便根据 fabric 配置获得更好的可用性或性能。DPDK 提高了性能,而 VF/PF DPDK 绑定为故障转移和高可用性提供支持。VNF 供应商必须确保 DPDK 轮询模式驱动程序(PMD)支持作为 VF/PF 公开的 SR-IOV 卡。管理网络使用 OVS,因此 VNF 使用标准 virtIO 驱动程序查看 mgmt 网络设备。您可以使用该设备最初连接到 VNF,并确保 DPDK 应用绑定两个 VF/PF。
5.2.1. 用于没有 HCI 的 NFV SR-IOV 拓扑
观察下镜像中 NFV 的 SR-IOV 的拓扑。它由具有 1 Gbps NIC 的计算节点和 director 节点组成。

第 6 章 部署 SR-IOV 技术
在 Red Hat OpenStack Platform NFV 部署中,当您通过虚拟资源从实例直接访问共享 PCIe 资源时,您可以使用单一根 I/O 虚拟化(SR-IOV)实现更高的性能。
6.1. 部署 SR-IOV 技术的先决条件
- 有关在部署 overcloud 前如何安装和配置 undercloud 的详情,请查看 Director 安装和使用指南。
不要手动编辑 director heat 模板修改的 /etc/tuned/cpu-partitioning-variables.conf 中的任何值。
6.2. 配置 SR-IOV
要使用单一根 I/O 虚拟化(SR-IOV)部署 Red Hat OpenStack Platform(RHOSP),请配置具有 SR-IOV 功能的共享 PCIe 资源,以便实例可以请求直接访问。
以下 CPU 分配、内存分配和 NIC 配置是示例,可能与您的用例不同。
流程
-
以
stack用户的身份登录 undercloud。 Source
stackrc文件:[stack@director ~]$ source ~/stackrc
生成一个名为
roles_data_compute_sriov.yaml的新角色数据文件,其中包含Controller和ComputeSriov角色:(undercloud)$ openstack overcloud roles \ generate -o /home/stack/templates/roles_data_compute_sriov.yaml \ Controller ComputeSriov
ComputeSriov是由 RHOSP 安装提供的自定义角色,它还包含NeutronSriovAgent、NeutronSriovHostConfig服务,以及默认的计算服务。要准备 SR-IOV 容器,请在生成
overcloud_images.yaml文件时包括neutron-sriov.yaml和roles_data_compute_sriov.yaml文件。$ sudo openstack tripleo container image prepare \ --roles-file ~/templates/roles_data_compute_sriov.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-sriov.yaml \ -e ~/containers-prepare-parameter.yaml \ --output-env-file=/home/stack/templates/overcloud_images.yaml
如需有关容器镜像准备的更多信息,请参阅 Director 安装和使用指南中的准备容器镜像。
在环境文件目录中,创建
/usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml文件的副本:$ cp /usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml /home/stack/templates/network-environment-sriov.yaml
在您的
network-environment-sriov.yaml文件的parameter_defaults下添加以下参数,为您的集群和硬件配置 SR-IOV 节点:NeutronNetworkType: 'vlan' NeutronNetworkVLANRanges: - tenant:22:22 - tenant:25:25 NeutronTunnelTypes: ''要确定每个 PCI 设备类型的
vendor_id和product_id,请在具有 PCI 卡的物理服务器中使用以下命令之一:要从部署的 overcloud 返回
vendor_id和product_id,请使用以下命令:# lspci -nn -s <pci_device_address> 3b:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ [<vendor_id>: <product_id>] (rev 02)
如果您尚未部署 overcloud,返回
vendor_id和product_id(PF),请使用以下命令:(undercloud) [stack@undercloud-0 ~]$ openstack baremetal introspection data save <baremetal_node_name> | jq '.inventory.interfaces[] | .name, .vendor, .product'
在
network-environment-sriov.yaml文件中为 SR-IOV 计算节点配置角色特定参数:ComputeSriovParameters: IsolCpusList: "1-19,21-39" KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on isolcpus=1-19,21-39" TunedProfileName: "cpu-partitioning" NeutronBridgeMappings: - tenant:br-link0 NeutronPhysicalDevMappings: - tenant:p7p1 NovaComputeCpuDedicatedSet: '1-19,21-39' NovaReservedHostMemory: 4096注意NovaVcpuPinSet参数现已弃用,并被用于专用固定工作负载的NovaComputeCpuDedicatedSet替代。在
network-environment-sriov.yaml文件中为 SR-IOV 计算节点配置 PCI 透传设备:ComputeSriovParameters: ... NovaPCIPassthrough: - vendor_id: "<vendor_id>" product_id: "<product_id>" address: <NIC_address> physical_network: "<physical_network>" ...-
将
<vendor_id> 替换为 PCI 设备的厂商 ID。 -
将
<product_id> 替换为 PCI 设备的产品 ID。 -
将
<NIC_address> 替换为 PCI 设备的地址。有关如何配置address参数的详情,请参考 Configuring the Compute Service for Instance Creation 中的 Guidelines for configuringNovaPCIPassthrough部分。 使用 PCI 设备所在的物理网络的名称替换
<physical_network>。注意在配置 PCI 透传时不要使用
devname参数,因为 NIC 的设备名称可能会改变。要在 PF 上创建 Networking 服务(neutron)端口,请指定vendor_id、product_id以及NovaPCIPassthrough中的 PCI 设备地址,并使用--vnic-type direct-physical选项创建端口。要在虚拟功能(VF)上创建网络服务端口,在NovaPCIPassthrough中指定vendor_id和product_id,并使用--vnic-type direct选项创建端口。vendor_id和product_id参数的值可能在物理功能(PF)和 VF 上下文之间不同。有关如何配置NovaPCIPassthrough的更多信息,请参阅 Configuring the Compute Service for Instance Creation 指南中的 Guidelines for configuringNovaPCIPassthrough。
-
将
在
compute.yaml网络配置模板中配置启用了 SR-IOV 的接口。要创建 SR-IOV VF,将接口配置为独立 NIC:- type: sriov_pf name: p7p3 mtu: 9000 numvfs: 10 use_dhcp: false defroute: false nm_controlled: true hotplug: true promisc: false - type: sriov_pf name: p7p4 mtu: 9000 numvfs: 10 use_dhcp: false defroute: false nm_controlled: true hotplug: true promisc: false注意numvfs参数取代了网络配置模板中的 NeutronSriovNumVFs 参数。红帽不支持在部署后修改NeutronSriovNumVFs参数或numvfs参数。如果在部署后修改任一参数,这可能会给该 PF 上带有 SR-IOV 端口的运行实例造成中断。在这种情况下,您必须硬重启这些实例,以便 SR-IOV PCI 设备再次可用。确保默认过滤器列表包含
AggregateInstanceExtraSpecsFilter的值:NovaSchedulerDefaultFilters: ['AvailabilityZoneFilter','ComputeFilter','ComputeCapabilitiesFilter','ImagePropertiesFilter','ServerGroupAntiAffinityFilter','ServerGroupAffinityFilter','PciPassthroughFilter','AggregateInstanceExtraSpecsFilter']
-
运行
overcloud_deploy.sh脚本。
6.3. NIC 分区
此功能通常通过 Red Hat OpenStack Platform(RHOSP)16.1.2 提供,并在 Intel Fortville NIC 和 Mellanox CX-5 NIC 上进行验证。
您可以配置单一根 I/O 虚拟化(SR-IOV)以便 RHOSP 主机可以使用虚拟功能(VF)。
当您将单个高速 NIC 划分为多个 VF 时,您可以将 NIC 用于 control 和 data plane 流量。
流程
- 为您选择的角色打开 NIC 配置文件。
为接口类型
sriov_pf添加一个条目,以配置主机可使用的物理功能:- type: sriov_pf name: <interface name> use_dhcp: false numvfs: <number of vfs> promisc: <true/false> #optional (Defaults to true)注意numvfs参数取代了网络配置模板中的 NeutronSriovNumVFs 参数。红帽不支持在部署后修改NeutronSriovNumVFs参数或numvfs参数。如果在部署后修改任一参数,这可能会给该物理功能(PF)上运行 SR-IOV 端口的正在运行的实例造成中断。在这种情况下,您必须硬重启这些实例,以便 SR-IOV PCI 设备再次可用。为接口类型
sriov_vf添加条目,以配置主机可以使用的虚拟功能:- type: <bond_type> name: internal_bond bonding_options: mode=<bonding_option> use_dhcp: false members: - type: sriov_vf device: <pf_device_name> vfid: <vf_id> - type: sriov_vf device: <pf_device_name> vfid: <vf_id> - type: vlan vlan_id: get_param: InternalApiNetworkVlanID spoofcheck: false device: internal_bond addresses: - ip_netmask: get_param: InternalApiIpSubnet routes: list_concat_unique: - get_param: InternalApiInterfaceRoutes-
将
<bond_type> 替换为所需的绑定类型,如linux_bond。您可以在绑定中为其他绑定应用 VLAN 标签,如ovs_bond。 将
<bonding_option> 替换为以下支持的绑定模式之一:-
active-backup balance-slb注意不支持 LACP 绑定。
-
在
members部分中,指定sriov_vf作为绑定的接口类型。注意如果将 OVS 网桥用作接口类型,则可以在 sriov_pf 设备的 sriov_vf 上配置一个 OVS 网桥。单个 sriov_pf 设备中的多个 OVS 网桥可能会导致跨 VF 进行数据包重复,并降低性能。
-
将
<pf_device_name> 替换为 PF 设备的名称。 -
如果使用
linux_bond,则必须分配 VLAN 标签。 -
将
<vf_id> 替换为 VF 的 ID。适用的 VF ID 范围从零开始,并以最大 VF 数结束。
-
将
-
禁用 spoof 检查,并在
sriov_vf上针对 VF 上的linux_bond应用 VLAN 标签。 要为实例保留 VF,请在环境文件中包括
NovaPCIPassthrough参数,例如:NovaPCIPassthrough: - address: "0000:19:0e.3" trusted: "true" physical_network: "sriov1" - address: "0000:19:0e.0" trusted: "true" physical_network: "sriov2"
director 识别主机 VF,并生成可供实例使用的 VF 的 PCI 地址。
在所有需要 NIC 分区的节点中启用
IOMMU。例如,如果要为 Compute 节点进行 NIC 分区,请在该角色中使用KernelArgs参数启用 IOMMU。parameter_defaults: ComputeParameters: KernelArgs: "intel_iommu=on iommu=pt"注意当您首次在角色配置中添加
KernelArgs参数时,overcloud 节点会自动重启。如果需要,您可以禁用自动重新引导节点,然后在每个 overcloud 部署后手动执行节点重启。如需更多信息,请参阅配置手动节点重新引导以定义KernelArgs。将您的角色文件和环境文件添加到堆栈中,使用其他环境文件并部署 overcloud:
(undercloud)$ openstack overcloud deploy --templates \ -r os-net-config.yaml -e [your environment files] \ -e /home/stack/templates/<compute_environment_file>.yaml
NIC 分区配置示例
要通过 VF 配置 Linux 绑定,请禁用
spoofcheck,并将 VLAN 标签应用到sriov_vf:- type: linux_bond name: bond_api bonding_options: "mode=active-backup" members: - type: sriov_vf device: eno2 vfid: 1 vlan_id: get_param: InternalApiNetworkVlanID spoofcheck: false - type: sriov_vf device: eno3 vfid: 1 vlan_id: get_param: InternalApiNetworkVlanID spoofcheck: false addresses: - ip_netmask: get_param: InternalApiIpSubnet routes: list_concat_unique: - get_param: InternalApiInterfaceRoutes使用以下示例在 VF 上配置 OVS 网桥:
- type: ovs_bridge name: br-bond use_dhcp: true members: - type: vlan vlan_id: get_param: TenantNetworkVlanID addresses: - ip_netmask: get_param: TenantIpSubnet routes: list_concat_unique: - get_param: ControlPlaneStaticRoutes - type: ovs_bond name: bond_vf ovs_options: "bond_mode=active-backup" members: - type: sriov_vf device: p2p1 vfid: 2 - type: sriov_vf device: p2p2 vfid: 2要在 VF 上配置 OVS 用户桥接,请将 VLAN 标签应用到
ovs_user_bridge参数:- type: ovs_user_bridge name: br-link0 use_dhcp: false mtu: 9000 ovs_extra: - str_replace: template: set port br-link0 tag=_VLAN_TAG_ params: _VLAN_TAG_: get_param: TenantNetworkVlanID addresses: - ip_netmask: get_param: TenantIpSubnet routes: list_concat_unique: - get_param: TenantInterfaceRoutes members: - type: ovs_dpdk_bond name: dpdkbond0 mtu: 9000 ovs_extra: - set port dpdkbond0 bond_mode=balance-slb members: - type: ovs_dpdk_port name: dpdk0 members: - type: sriov_vf device: eno2 vfid: 3 - type: ovs_dpdk_port name: dpdk1 members: - type: sriov_vf device: eno3 vfid: 3
验证
检查 VF 的数量。
[root@overcloud-compute-0 heat-admin]# cat /sys/class/net/p4p1/device/sriov_numvfs 10 [root@overcloud-compute-0 heat-admin]# cat /sys/class/net/p4p2/device/sriov_numvfs 10
检查 Linux 绑定。
[heat-admin@overcloud-computeovsdpdksriov-1 ~]$ cat /proc/net/bonding/<bond_name> Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011) Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eno3v1 MII Status: up MII Polling Interval (ms): 0 Up Delay (ms): 0 Down Delay (ms): 0 Peer Notification Delay (ms): 0 Slave Interface: eno3v1 MII Status: up Speed: 10000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 4e:77:94:bd:38:d2 Slave queue ID: 0 Slave Interface: eno4v1 MII Status: up Speed: 10000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 4a:74:52:a7:aa:7c Slave queue ID: 0
列出 OVS 绑定。
[heat-admin@overcloud-computeovsdpdksriov-1 ~]# sudo ovs-appctl bond/show ---- dpdkbond0 ---- bond_mode: balance-slb bond may use recirculation: no, Recirc-ID : -1 bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms next rebalance: 9491 ms lacp_status: off lacp_fallback_ab: false active slave mac: ce:ee:c7:58:8e:b2(dpdk1) slave dpdk0: enabled may_enable: true slave dpdk1: enabled active slave may_enable: true
显示 OVS 连接。
[root@overcloud-compute-0 heat-admin]# ovs-vsctl show b6567fa8-c9ec-4247-9a08-cbf34f04c85f Manager "ptcp:6640:127.0.0.1" is_connected: true Bridge br-sriov2 Controller "tcp:127.0.0.1:6633" is_connected: true fail_mode: secure datapath_type: netdev Port phy-br-sriov2 Interface phy-br-sriov2 type: patch options: {peer=int-br-sriov2} Port br-sriov2 Interface br-sriov2 type: internal Bridge br-sriov1 Controller "tcp:127.0.0.1:6633" is_connected: true fail_mode: secure datapath_type: netdev Port phy-br-sriov1 Interface phy-br-sriov1 type: patch options: {peer=int-br-sriov1} Port br-sriov1 Interface br-sriov1 type: internal Bridge br-ex Controller "tcp:127.0.0.1:6633" is_connected: true fail_mode: secure datapath_type: netdev Port br-ex Interface br-ex type: internal Port phy-br-ex Interface phy-br-ex type: patch options: {peer=int-br-ex} Bridge br-tenant Controller "tcp:127.0.0.1:6633" is_connected: true fail_mode: secure datapath_type: netdev Port br-tenant tag: 305 Interface br-tenant type: internal Port phy-br-tenant Interface phy-br-tenant type: patch options: {peer=int-br-tenant} Port dpdkbond0 Interface dpdk0 type: dpdk options: {dpdk-devargs="0000:18:0e.0"} Interface dpdk1 type: dpdk options: {dpdk-devargs="0000:18:0a.0"} Bridge br-tun Controller "tcp:127.0.0.1:6633" is_connected: true fail_mode: secure datapath_type: netdev Port vxlan-98140025 Interface vxlan-98140025 type: vxlan options: {df_default="true", egress_pkt_mark="0", in_key=flow, local_ip="152.20.0.229", out_key=flow, remote_ip="152.20.0.37"} Port br-tun Interface br-tun type: internal Port patch-int Interface patch-int type: patch options: {peer=patch-tun} Port vxlan-98140015 Interface vxlan-98140015 type: vxlan options: {df_default="true", egress_pkt_mark="0", in_key=flow, local_ip="152.20.0.229", out_key=flow, remote_ip="152.20.0.21"} Port vxlan-9814009f Interface vxlan-9814009f type: vxlan options: {df_default="true", egress_pkt_mark="0", in_key=flow, local_ip="152.20.0.229", out_key=flow, remote_ip="152.20.0.159"} Port vxlan-981400cc Interface vxlan-981400cc type: vxlan options: {df_default="true", egress_pkt_mark="0", in_key=flow, local_ip="152.20.0.229", out_key=flow, remote_ip="152.20.0.204"} Bridge br-int Controller "tcp:127.0.0.1:6633" is_connected: true fail_mode: secure datapath_type: netdev Port int-br-tenant Interface int-br-tenant type: patch options: {peer=phy-br-tenant} Port int-br-ex Interface int-br-ex type: patch options: {peer=phy-br-ex} Port int-br-sriov1 Interface int-br-sriov1 type: patch options: {peer=phy-br-sriov1} Port patch-tun Interface patch-tun type: patch options: {peer=patch-int} Port br-int Interface br-int type: internal Port int-br-sriov2 Interface int-br-sriov2 type: patch options: {peer=phy-br-sriov2} Port vhu4142a221-93 tag: 1 Interface vhu4142a221-93 type: dpdkvhostuserclient options: {vhost-server-path="/var/lib/vhost_sockets/vhu4142a221-93"} ovs_version: "2.13.2"
如果您使用 NovaPCIPassthrough 将 VF 传递给实例,请通过 部署 SR-IOV 实例 来测试。
6.4. 配置 OVS 硬件卸载
OVS 硬件卸载配置共享许多与配置 SR-IOV 相同的步骤。
从 Red Hat OpenStack Platform 16.2.3 开始,若要从带有 OVS 硬件卸载和 ML2/OVS 的 Compute 节点卸载流量,您必须在 openvswitch_agent.ini 配置文件中将 disable_packet_marking 参数设置为 true,然后重启 neutron_ovs_agent 容器。
cat /var/lib/config-data/puppet-generated/neutron/etc/neutron/plugins/ml2/openvswitch_agent.ini [ovs] disable_packet_marking=True
流程
为基于 Compute 角色的 OVS 硬件卸载生成 overcloud 角色:
openstack overcloud roles generate -o roles_data.yaml Controller Compute:ComputeOvsHwOffload
-
可选:更改
HostnameFormatDefault: '%stackname%-compute-%index%'名称,用于ComputeOvsHwOffload角色。 -
将
OvsHwOffload参数添加到角色特定参数下,值设为true。 -
要将 neutron 配置为使用 iptables/hybrid 驱动实现,请包括:
NeutronOVSFirewallDriver: iptables_hybrid。有关NeutronOVSFirewallDriver的更多信息,请参阅高级 Overcloud 自定义指南中的 使用 Open vSwitch 防火墙。 配置
physical_network参数以匹配您的环境。-
对于 VLAN,将
physical_network参数设置为部署后您在 neutron 中创建的网络名称。这个值也应在NeutronBridgeMappings中。 对于 VXLAN,将
physical_network参数设置为null。例如:
parameter_defaults: NeutronOVSFirewallDriver: iptables_hybrid ComputeSriovParameters: IsolCpusList: 2-9,21-29,11-19,31-39 KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=128 intel_iommu=on iommu=pt" OvsHwOffload: true TunedProfileName: "cpu-partitioning" NeutronBridgeMappings: - tenant:br-tenant NovaPCIPassthrough: - vendor_id: <vendor-id> product_id: <product-id> address: <address> physical_network: "tenant" - vendor_id: <vendor-id> product_id: <product-id> address: <address> physical_network: "null" NovaReservedHostMemory: 4096 NovaComputeCpuDedicatedSet: 1-9,21-29,11-19,31-39-
将
<vendor-id> 替换为物理 NIC 的供应商 ID。 -
将
<product-id> 替换为 NIC VF 的产品 ID。 将
<address> 替换为物理 NIC 的地址。有关如何配置
NovaPCIPassthrough的更多信息,请参阅 Configuring the Compute Service for Instance Creation 指南中的 Guidelines for configuringNovaPCIPassthrough。
-
对于 VLAN,将
确保默认过滤器列表包含
NUMATopologyFilter:NovaSchedulerDefaultFilters: [\'AvailabilityZoneFilter',\'ComputeFilter',\'ComputeCapabilitiesFilter',\'ImagePropertiesFilter',\'ServerGroupAntiAffinityFilter',\'ServerGroupAffinityFilter',\'PciPassthroughFilter',\'NUMATopologyFilter']
注意可选: 有关如何在带有 Mellanox ConnectX5 NIC 的 RHOSP 16.2 中排除和配置 OVS 硬件卸载问题的详细信息,请参阅 2.2 故障排除硬件卸载。
在
compute-sriov.yaml配置文件中配置用于硬件卸载的一个或多个网络接口:- type: ovs_bridge name: br-tenant mtu: 9000 members: - type: sriov_pf name: p7p1 numvfs: 5 mtu: 9000 primary: true promisc: true use_dhcp: false link_mode: switchdev注意-
在配置 Open vSwitch 硬件卸载时,不要使用
NeutronSriovNumVFs参数。使用os-net-config使用的网络配置文件中的numvfs参数来指定虚拟功能的数量。红帽不支持在更新或重新部署过程中修改numvfs设置。 -
不要将 Mellanox 网络接口配置为 nic-config 接口类型
ovs-vlan,因为这可防止 VXLAN 等隧道端点因为驱动程序限制而传递流量。
-
在配置 Open vSwitch 硬件卸载时,不要使用
在
overcloud deploy命令中包含ovs-hw-offload.yaml文件:TEMPLATES_HOME=”/usr/share/openstack-tripleo-heat-templates” CUSTOM_TEMPLATES=”/home/stack/templates” openstack overcloud deploy --templates \ -r ${CUSTOM_TEMPLATES}/roles_data.yaml \ -e ${TEMPLATES_HOME}/environments/ovs-hw-offload.yaml \ -e ${CUSTOM_TEMPLATES}/network-environment.yaml \ -e ${CUSTOM_TEMPLATES}/neutron-ovs.yaml
6.4.1. 验证 OVS 硬件卸载
确认 PCI 设备处于
switchdev模式:# devlink dev eswitch show pci/0000:03:00.0 pci/0000:03:00.0: mode switchdev inline-mode none encap enable
验证 OVS 中是否启用了卸载:
# ovs-vsctl get Open_vSwitch . other_config:hw-offload “true”
6.5. OVS 硬件卸载的调优示例
要获得最佳性能,您必须完成额外的配置步骤。
调整每个网络接口的频道数以提高性能
频道包括中断请求(IRQ)以及触发 IRQ 的队列集合。当您将 mlx5_core 驱动程序设置为 switchdev 模式时,mlx5_core 驱动程序默认为一个组合频道,它们可能无法提供最佳性能。
流程
在 PF 代表器上,输入以下命令来调整主机可用的 CPU 数量。使用您要可用的 CPU 数量替换 $(nproc):
$ sudo ethtool -L enp3s0f0 combined $(nproc)
CPU 固定
为防止性能从跨 NUMA 操作中造成降级,请在同一 NUMA 节点中找到 NIC、其应用程序、VF 客户机和 OVS。如需更多信息,请参阅配置实例创建指南中的在 Compute 节点上配置 CPU 固定。
6.6. OVS 硬件卸载的组件
使用 Mellanox 智能 NIC 配置和排除 OVS HW Offload 组件的引用。
Nova
将 Nova 调度程序配置为使用 NovaPCIPassthrough 过滤器以及 NUMATopologyFilter 和 DerivePciWhitelistEnabled 参数。当您启用 OVS HW Offload 时,Nova 调度程序与生成实例的 SR-IOV 透传类似。
Neutron
当您启用 OVS HW Offload 时,使用 devlink cli 工具将 NIC e-switch 模式设置为 switchdev。Switchdev 模式在映射到 VF 的 NIC 上建立代表端口。
流程
要从一个启用了
switchdev的 NIC 中分配一个端口,以 admin 用户身份登录,创建一个带有值为binding-profile的capabilities,并禁用端口安全性:$ openstack port create --network private --vnic-type=direct --binding-profile '{"capabilities": ["switchdev"]}' direct_port1 --no-security-group --disable-port-security
在创建实例时传递此端口信息。您可以将代表端口与实例 VF 接口关联,并将代表端口连接到 OVS 网桥 br-int,用于一次性 OVS 数据路径处理。VF 端口代表或类似物理"补丁面板"前端的软件版本。有关新实例创建的更多信息,请参阅: 为 SR-IOV 部署实例
OVS
在配置了硬件卸载的环境中,传输的第一个数据包会遍历 OVS 内核路径,此数据包过程负责为实例流量传入和传出流量建立 ml2 OVS 规则。在建立了流量流时,OVS 使用流量控制(TC)流程序程序在 NIC 硬件上推送这些流。
流程
使用 director 在 OVS 上应用以下配置:
$ sudo ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
- 重新启动 以启用 HW Offload。
流量控制(TC)子系统
当您启用 hw-offload 标志时,OVS 将使用 TC 数据路径。TC Flower 是一个 iproute2 工具,用于在硬件上写入数据路径流。这样可确保在硬件和软件数据路径上为冗余编程流程。
流程
应用以下配置:如果您没有显式配置
tc-policy,则这是默认选项:$ sudo ovs-vsctl set Open_vSwitch . other_config:tc-policy=none
- 重启 OVS。
NIC PF 和 VF 驱动程序
Mlx5_core 是 Mellanox ConnectX-5 NIC 的 PF 和 VF 驱动程序。mlx5_core 驱动程序执行以下任务:
- 在硬件上创建路由表。
- 管理网络流管理。
-
配置以太网交换机设备驱动程序模型,
switchdev。 - 创建块设备。
流程
使用以下
devlink命令,以查询 PCI 设备的模式。$ sudo devlink dev eswitch set pci/0000:03:00.0 mode switchdev $ sudo devlink dev eswitch show pci/0000:03:00.0 pci/0000:03:00.0: mode switchdev inline-mode none encap enable
NIC 固件
NIC 固件执行以下任务:
- 维护路由表和规则。
- 修复表的管道。
- 管理硬件资源。
- 创建 VF。
固件可与驱动程序配合使用,以获得最佳性能。
虽然 NIC 固件不是易失性,但重启后会保留下来,您可以在运行时修改配置。
流程
在接口和代表端口中应用以下配置,以确保 TC 流程序在端口级别推送流编程:
$ sudo ethtool -K enp3s0f0 hw-tc-offload on
确保您保持固件更新。Yum 或 dnf 更新可能不会完成固件更新。如需更多信息,请参阅厂商文档。
6.7. OVS 硬件卸载故障排除
先决条件
- Linux 内核 4.13 或更新版本
- OVS 2.8 或更新版本
- RHOSP 12 或更新版本
- iproute 4.12 或更新版本
- Mellanox NIC 固件,如 FW ConnectX-5 16.21.0338 或更新版本
有关支持的先决条件的更多信息,请参阅红帽知识库解决方案 网络适配器 Fast Datapath 功能支持列表。
在 OVS HW 卸载部署中配置网络
在 HW 卸载部署中,您可以根据您的要求选择以下场景之一:
- 您可以使用附加到绑定的同一接口集合,或为每个类型使用一组不同的 NIC,在 VXLAN 和 VLAN 上使用一组不同的 NIC。
- 您可以使用 Linux 绑定绑定 Mellanox NIC 的两个端口。
- 您可以在 Mellanox Linux 绑定之上的 VLAN 接口上托管租户 VXLAN 网络。
确保单独的 NIC 和绑定是 ovs-bridge 的成员。
请参阅以下示例网络配置:
- type: ovs_bridge
name: br-offload
mtu: 9000
use_dhcp: false
members:
- type: linux_bond
name: bond-pf
bonding_options: "mode=active-backup miimon=100"
members:
- type: sriov_pf
name: p5p1
numvfs: 3
primary: true
promisc: true
use_dhcp: false
defroute: false
link_mode: switchdev
- type: sriov_pf
name: p5p2
numvfs: 3
promisc: true
use_dhcp: false
defroute: false
link_mode: switchdev
- type: vlan
vlan_id:
get_param: TenantNetworkVlanID
device: bond-pf
addresses:
- ip_netmask:
get_param: TenantIpSubnet支持以下绑定配置:
- active-backup - mode=1
- active-active 或 balance-xor - mode=2
- 802.3ad(LACP)- mode=4
不支持以下绑定配置:
- xmit_hash_policy=layer3+4
验证接口配置
通过以下步骤验证接口配置。
流程
-
在部署过程中,使用主机网络配置工具
os-net-config启用hw-tc-offload。 -
每当您重新引导 Compute 节点时,在
sriov_config服务上启用hw-tc-offload。 将附加到绑定的 NIC 的
hw-tc-offload参数设置为on:[root@overcloud-computesriov-0 ~]# ethtool -k ens1f0 | grep tc-offload hw-tc-offload: on
验证接口模式
使用以下步骤验证接口模式。
流程
-
将 eswitch 模式设置为
switchdev用于 HW 卸载的接口。 -
使用主机网络配置工具
os-net-config在部署期间启用eswitch。 每当您重新引导 Compute 节点时,在
sriov_config服务中启用eswitch。[root@overcloud-computesriov-0 ~]# devlink dev eswitch show pci/$(ethtool -i ens1f0 | grep bus-info | cut -d ':' -f 2,3,4 | awk '{$1=$1};1')
PF 接口的驱动程序设置为 "mlx5e_rep",以表明它是 e-switch uplink 端口的代表器。这不会影响功能。
验证 OVS 中的卸载状态
通过下列步骤,验证 OVS 中的卸载状态。
在 Compute 节点上的 OVS 中启用硬件卸载。
[root@overcloud-computesriov-0 ~]# ovs-vsctl get Open_vSwitch . other_config:hw-offload "true"
验证 VF 代表端口的名称
为确保 VF 代表器端口的一致性命名,os-net-config 使用 udev 规则重命名 <PF-name>_<VF_id> 格式的端口。
流程
在部署后,验证 VF 代表端口是否正确命名。
root@overcloud-computesriov-0 ~]# cat /etc/udev/rules.d/80-persistent-os-net-config.rules # This file is autogenerated by os-net-config SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}!="", ATTR{phys_port_name}=="pf*vf*", ENV{NM_UNMANAGED}="1" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="0000:65:00.0", NAME="ens1f0" SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}=="98039b7f9e48", ATTR{phys_port_name}=="pf0vf*", IMPORT{program}="/etc/udev/rep-link-name.sh $attr{phys_port_name}", NAME="ens1f0_$env{NUMBER}" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="0000:65:00.1", NAME="ens1f1" SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}=="98039b7f9e49", ATTR{phys_port_name}=="pf1vf*", IMPORT{program}="/etc/udev/rep-link-name.sh $attr{phys_port_name}", NAME="ens1f1_$env{NUMBER}"
检查网络流量流
HW 卸载的网络流功能与具有特定于应用集成电路(ASIC)芯片的物理交换机或路由器类似。您可以访问交换机或路由器的 ASIC shell,以检查路由表和其他调试。以下流程使用 Cumulus Linux 交换机中的 Broadcom 芯片组作为示例。替换适合您环境的值。
流程
要获得 Broadcom 芯片表内容,请使用
bcmcmd命令。root@dni-7448-26:~# cl-bcmcmd l2 show mac=00:02:00:00:00:08 vlan=2000 GPORT=0x2 modid=0 port=2/xe1 mac=00:02:00:00:00:09 vlan=2000 GPORT=0x2 modid=0 port=2/xe1 Hit
检查流量控制(TC)层。
# tc -s filter show dev p5p1_1 ingress … filter block 94 protocol ip pref 3 flower chain 5 filter block 94 protocol ip pref 3 flower chain 5 handle 0x2 eth_type ipv4 src_ip 172.0.0.1 ip_flags nofrag in_hw in_hw_count 1 action order 1: mirred (Egress Redirect to device eth4) stolen index 3 ref 1 bind 1 installed 364 sec used 0 sec Action statistics: Sent 253991716224 bytes 169534118 pkt (dropped 0, overlimits 0 requeues 0) Sent software 43711874200 bytes 30161170 pkt Sent hardware 210279842024 bytes 139372948 pkt backlog 0b 0p requeues 0 cookie 8beddad9a0430f0457e7e78db6e0af48 no_percpu-
检查此输出中的
in_hw标志和统计数据。词语硬件表示硬件处理网络流量。如果使用tc-policy=none,您可以检查此输出或 tcpdump 以调查硬件或软件处理数据包的时间。当驱动程序无法卸载数据包时,您可以在dmesg或ovs-vswitch.log中看到对应的日志消息。 例如,在 Mellanox 中,日志条目与
dmesg中的 syndrome 消息类似。[13232.860484] mlx5_core 0000:3b:00.0: mlx5_cmd_check:756:(pid 131368): SET_FLOW_TABLE_ENTRY(0x936) op_mod(0x0) failed, status bad parameter(0x3), syndrome (0x6b1266)
在本例中,错误代码(0x6b1266)代表以下行为:
0x6B1266 | set_flow_table_entry: pop vlan and forward to uplink is not allowed
验证系统
通过以下步骤验证您的系统。
流程
- 确定系统上已启用 SR-IOV 和 VT-d。
-
通过在内核参数中添加
intel_iommu=on来启用 IOMMU,例如使用 GRUB。
限制
您不能将 OVS 防火墙驱动程序用于 HW 卸载,因为 OVS 2.11 中的卸载路径不支持流的连接跟踪属性。
6.8. 调试 HW Offload 流
如果您在 ovs-vswitch.log 文件中遇到以下信息,您可以使用以下步骤:
2020-01-31T06:22:11.257Z|00473|dpif_netlink(handler402)|ERR|failed to offload flow: Operation not supported: p6p1_5
流程
要启用卸载模块的日志记录,并获取此故障的额外日志信息,请在 Compute 节点上使用以下命令:
ovs-appctl vlog/set dpif_netlink:file:dbg # Module name changed recently (check based on the version used ovs-appctl vlog/set netdev_tc_offloads:file:dbg [OR] ovs-appctl vlog/set netdev_offload_tc:file:dbg ovs-appctl vlog/set tc:file:dbg
再次检查
ovs-vswitchd日志,以查看与该问题相关的其他详细信息。在以下示例中,因为不支持的属性标记,卸载会失败。
2020-01-31T06:22:11.218Z|00471|dpif_netlink(handler402)|DBG|system@ovs-system: put[create] ufid:61bd016e-eb89-44fc-a17e-958bc8e45fda recirc_id(0),dp_hash(0/0),skb_priority(0/0),in_port(7),skb_mark(0),ct_state(0/0),ct_zone(0/0),ct_mark(0/0),ct_label(0/0),eth(src=fa:16:3e:d2:f5:f3,dst=fa:16:3e:c4:a3:eb),eth_type(0x0800),ipv4(src=10.1.1.8/0.0.0.0,dst=10.1.1.31/0.0.0.0,proto=1/0,tos=0/0x3,ttl=64/0,frag=no),icmp(type=0/0,code=0/0), actions:set(tunnel(tun_id=0x3d,src=10.10.141.107,dst=10.10.141.124,ttl=64,tp_dst=4789,flags(df|key))),6 2020-01-31T06:22:11.253Z|00472|netdev_tc_offloads(handler402)|DBG|offloading attribute pkt_mark isn't supported 2020-01-31T06:22:11.257Z|00473|dpif_netlink(handler402)|ERR|failed to offload flow: Operation not supported: p6p1_5
调试 Mellanox NIC
Mellanox 提供了系统信息脚本,类似于 Red Hat SOS 报告。
https://github.com/Mellanox/linux-sysinfo-snapshot/blob/master/sysinfo-snapshot.py
当您运行此命令时,您可以为相关日志信息创建 zip 文件,这对于支持问题单很有用。
流程
您可以使用以下命令运行这个系统信息脚本:
# ./sysinfo-snapshot.py --asap --asap_tc --ibdiagnet --openstack
您还可以安装 Mellanox Firmware Tools(MFT)、mlxconfig、mlxlink 和 OpenFabrics Enterprise Distribution(OFED)驱动程序。
有用的 CLI 命令
使用 ethtool 实用程序收集诊断信息:
- ethtool -l <uplink representor> : 查看频道数
- ethtool -I <uplink/VFs> : Check statistics
- ethtool -i <uplink rep> : View driver information
- ethtool -g <uplink rep> : Check ring size
- ethtool -k <uplink/VFs> : View enabled 的功能
在 representor 和 PF 端口中使用 tcpdump 程序来相似检查流量流。
- 您对代表端口的链接状态所做的任何更改都会影响 VF 链接状态。
- Representor 端口统计数据显示 VF 统计数据还显示 VF 统计数据。
使用以下命令获取有用的诊断信息:
$ ovs-appctl dpctl/dump-flows -m type=offloaded $ ovs-appctl dpctl/dump-flows -m $ tc filter show dev ens1_0 ingress $ tc -s filter show dev ens1_0 ingress $ tc monitor
6.9. 为 SR-IOV 部署实例
使用主机聚合来分隔高性能计算主机。有关创建用于调度的主机聚合和相关类别的信息,请参阅创建主机聚合。
固定 CPU 实例可以位于与未固定实例相同的 Compute 节点上。如需更多信息,请参阅配置实例创建指南中的在 Compute 节点上配置 CPU 固定。
通过执行以下步骤,为单根 I/O 虚拟化(SR-IOV)部署实例:
创建类别。
$ openstack flavor create <flavor> --ram <MB> --disk <GB> --vcpus <#>
提示您可以通过在您的类别中添加额外 spec
hw:pci_numa_affinity_policy来为 PCI 透传设备和 SR-IOV 接口指定 NUMA 关联性策略。有关更多信息,请参阅配置实例创建 指南中的 类别服务元数据。创建 网络。
$ openstack network create net1 --provider-physical-network tenant --provider-network-type vlan --provider-segment <VLAN-ID> $ openstack subnet create subnet1 --network net1 --subnet-range 192.0.2.0/24 --dhcp
创建端口。
使用 vnic-type
direct创建 SR-IOV 虚拟功能(VF)端口。$ openstack port create --network net1 --vnic-type direct sriov_port
使用以下命令来创建带有硬件卸载的虚拟功能。您必须是一个 admin 用户来设置
--binding-profile。$ openstack port create --network net1 --vnic-type direct --binding-profile '{"capabilities": ["switchdev"]} sriov_hwoffload_port使用 vnic-type
direct-physical创建专用于单个实例的 SR-IOV 物理功能(PF)端口。这个 PF 端口是 Networking 服务(neutron)端口,但不由网络服务控制,不作为网络适配器可见,因为它是一个通过实例传递给实例的 PCI 设备。$ openstack port create --network net1 --vnic-type direct-physical sriov_port
部署实例。
$ openstack server create --flavor <flavor> --image <image> --nic port-id=<id> <instance name>
6.10. 创建主机聚合
为获得更好的性能,部署具有 cpu pinning 和 hugepages 的客户机。您可以通过使用类别元数据匹配聚合元数据,将高性能实例调度到主机的子集。
您可以通过部署模板中的 heat 参数
NovaSchedulerDefaultFilters(在parameter_defaultsin your deployment templates. 下),配置AggregateInstanceExtraSpecsFilter值和其他必要的过滤。parameter_defaults: NovaSchedulerDefaultFilters: ['AggregateInstanceExtraSpecsFilter','AvailabilityZoneFilter','ComputeFilter','ComputeCapabilitiesFilter','ImagePropertiesFilter','ServerGroupAntiAffinityFilter','ServerGroupAffinityFilter','PciPassthroughFilter','NUMATopologyFilter']注意要将此参数添加到现有集群的配置中,您可以将其添加到 heat 模板,然后再次运行原始部署脚本。
为 SR-IOV 创建聚合组,并添加相关主机。定义与定义的类别元数据匹配的元数据,如
sriov=true。# openstack aggregate create sriov_group # openstack aggregate add host sriov_group compute-sriov-0.localdomain # openstack aggregate set --property sriov=true sriov_group
创建类别。
# openstack flavor create <flavor> --ram <MB> --disk <GB> --vcpus <#>
设置其他类别属性。请注意,定义的元数据
sriov=true与 SR-IOV 聚合上的定义元数据匹配。# openstack flavor set --property sriov=true --property hw:cpu_policy=dedicated --property hw:mem_page_size=1GB <flavor>
第 7 章 规划 OVS-DPDK 部署
要使用 NFV 的 Data Plane Development Kit(OVS-DPDK)部署优化 Open vSwitch,您应该了解 OVS-DPDK 如何使用 Compute 节点硬件(CPU、NUMA 节点、内存、NIC)以及根据您的 Compute 节点确定各个 OVS-DPDK 参数的注意事项。
使用 OVS-DPDK 和 OVS 原生防火墙(基于 conntrack 的有状态防火墙)时,您只能跟踪使用 ICMPv4、ICMPv6、TCP 和 UDP 协议的数据包。OVS 将所有其他网络流量类型标记为无效。
红帽不支持将 OVS-DPDK 用于非 NFV 工作负载。如果您需要用于非 NFV 工作负载的 OVS-DPDK 功能,请联络您的大客户经理(TAM)或打开客户服务请求案例,来讨论支持例外和其他选项。要创建一个客户服务请求案例,请访问创建一个问题单,然后选择 Account > Customer Service Request。https://access.redhat.com/support/cases/new
有关 CPU 和 NUMA 拓扑的高级介绍,请参阅 NFV 性能注意事项。
7.1. 带有 CPU 分区和 NUMA 拓扑的 OVS-DPDK
OVS-DPDK 对主机、客户机和本身的硬件资源进行分区。OVS-DPDK 轮询模式驱动程序(PMD)运行 DPDK 活跃循环,这需要专用的 CPU 内核。因此,您必须将一些 CPU 和巨页分配给 OVS-DPDK。
示例分区包括在双插槽 Compute 节点上每个 NUMA 节点的 16 个内核。流量需要额外的 NIC,因为您无法在主机和 OVS-DPDK 间共享 NIC。

您必须在两个 NUMA 节点上保留 DPDK PMD 线程,即使 NUMA 节点没有关联的 DPDK NIC。
为获得最佳 OVS-DPDK 性能,请为 NUMA 节点保留本地内存块。选择与用于内存和 CPU 固定相同 NUMA 节点关联的 NIC。确保两个绑定的接口都来自同一 NUMA 节点上的 NIC。
7.2. 工作流和派生参数
该功能在此发行版本中作为技术预览提供,因此不享有红帽的全面支持。它只应用于测试,不应部署在生产环境中。有关技术预览功能的更多信息,请参阅覆盖范围详细信息。
您可以使用 Red Hat OpenStack Platform Workflow(mistral)服务根据可用裸机节点的功能生成参数。工作流使用 YAML 文件来定义一组要执行的任务和操作。您可以在 tripleo-common/workbooks/ 目录中使用一个预先定义的 practice: derive_params.yaml。此工作簿提供了从裸机内省的结果中获取每个支持的参数的工作流。derive_params.yaml 工作流使用 tripleo-common/workbooks/derive_params_formulas.yaml 中的公式来计算派生参数。
您可以修改 derive_params_formulas.yaml 来适合您的环境。
derive_params.yaml worker 假设特定可组合角色的所有节点具有相同的硬件规格。工作流认为 flavor-profile 关联和 nova 放置调度程序以匹配与角色关联的节点,然后使用与角色匹配的第一个节点的内省数据。
有关工作流的更多信息,请参阅故障排除工作流和执行
您可以使用 -p 或 --plan-environment-file 选项,将自定义 plan_environment.yaml 文件添加到 openstack overcloud deploy 命令中。结果工作流将派生的参数合并到自定义 plan_environment.yaml 中,在其中供 overcloud 部署使用。
有关如何在部署中使用 --plan-environment-file 选项的详细信息,请参阅 计划环境元数据。
7.3. 派生 OVS-DPDK 参数
derived _params.yaml 中的工作流派生与使用 ComputeNeutronOvsDpdk 服务的角色关联的 DPDK 参数。
工作流可以自动生成 OVS-DPDK 的以下参数。NovaVcpuPinSet 参数现已弃用,并被用于专用固定工作流的 NovaComputeCpuDedicatedSet 替代:
- IsolCpusList
- KernelArgs
- NovaReservedHostMemory
- NovaComputeCpuDedicatedSet
- OvsDpdkSocketMemory
- OvsPmdCoreList
要避免错误,您必须为特定于角色的参数配置角色特定的标记。
OvsDpdkMemoryChannels 参数不能源自内省内存银行数据,因为内存插槽名称格式在不同的硬件环境中不一致。
在大多数情况下,OvsDpdkMemoryChannels 的默认数量是四。请咨询您的硬件手册,以确定每个插槽的内存频道数,并使用这个值更新默认号码。
有关工作流参数的详情,请参考 第 8.1 节 “使用工作流划分 DPDK 参数”。
7.4. 手动计算 OVS-DPDK 参数
本节介绍 OVS-DPDK 如何使用 director network_environment.yaml heat 模板中的参数来配置 CPU 和内存,以实现最佳性能。使用此信息评估您的 Compute 节点上的硬件支持以及如何对硬件进行分区以优化 OVS-DPDK 部署。
如需有关如何使用 derived_parameters.yaml 工作流生成这些值的更多信息,请参阅 工作流概述和派生参数。
在分配 CPU 内核时,始终将 CPU 同级线程或逻辑 CPU 分组到物理内核中。
有关如何确定 Compute 节点上的 CPU 和 NUMA 节点的详情,请参考 发现 NUMA 节点拓扑。使用此信息映射 CPU 和其他参数,以支持主机、虚拟客户机实例和 OVS-DPDK 进程需求。
7.4.1. CPU 参数
OVS-DPDK 使用以下参数来进行 CPU 分区:
- OvsPmdCoreList
提供用于 DPDK 轮询模式驱动程序(PMD)的 CPU 内核。选择与 DPDK 接口本地 NUMA 节点关联的 CPU 核心。将
OvsPmdCoreList用于 OVS 中pmd-cpu-mask值。对OvsPmdCoreList使用以下建议:- 将 sibling 线程组合在一起。
- 性能取决于为此 PMD 核心列表分配的物理内核数。在与 DPDK NIC 关联的 NUMA 节点上,分配所需的内核。
- 对于带有 DPDK NIC 的 NUMA 节点,根据性能要求确定所需的物理内核数,并为每个物理内核包括所有同级线程或逻辑 CPU。
- 对于没有 DPDK NIC 的 NUMA 节点,分配任意物理内核的同级线程或逻辑 CPU,但 NUMA 节点的第一个物理内核除外。
您必须在两个 NUMA 节点上保留 DPDK PMD 线程,即使 NUMA 节点没有关联的 DPDK NIC。
- NovaComputeCpuDedicatedSet
可以调度用于固定实例 CPU 的进程的逗号分隔列表或物理主机 CPU 范围。例如,
NovaComputeCpuDedicatedSet: [4-12,^8,15]保留来自 4-12 和 15 的核心,不包括 8。-
从
OvsPmdCoreList排除所有核心。 - 包括所有剩余的内核。
- 将 sibling 线程组合在一起。
-
从
- NovaComputeCpuSharedSet
- 用于决定实例仿真程序线程的主机 CPU 数字的逗号分隔列表或物理主机 CPU 范围。
- IsolCpusList
与主机进程隔离的一组 CPU 内核。
IsolCpusList是tuned-profiles-cpu-partitioning组件的cpu-partitioning-variable.conf文件中的isolated_cores值。对IsolCpusList使用以下建议:-
匹配
OvsPmdCoreList和NovaComputeCpuDedicatedSet中的核心列表。 - 将 sibling 线程组合在一起。
-
匹配
- DerivePciWhitelistEnabled
要为虚拟机保留虚拟功能(VF),请使用
NovaPCIPassthrough参数创建通过 Nova 传递给 Nova 的 VF 列表。排除了从列表中排除的主机可用的 VF。对于列表中的每个 VF,使用解析到地址值的正则表达式填充 address 参数。
以下是手动列表创建过程的示例。如果在名为
eno2的设备中启用 NIC 分区,使用以下命令列出 VF 的 PCI 地址:[heat-admin@compute-0 ~]$ ls -lh /sys/class/net/eno2/device/ | grep virtfn lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn0 -> ../0000:18:06.0 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn1 -> ../0000:18:06.1 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn2 -> ../0000:18:06.2 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn3 -> ../0000:18:06.3 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn4 -> ../0000:18:06.4 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn5 -> ../0000:18:06.5 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn6 -> ../0000:18:06.6 lrwxrwxrwx. 1 root root 0 Apr 16 09:58 virtfn7 -> ../0000:18:06.7
在这种情况下,
eno2用于 NIC 分区,使用 VF 0、4 和 6。手动配置NovaPCIPassthrough使其包含 VF 1-3、5 和 7,从而无法排除 VF 0、4 和 6,如下例所示:NovaPCIPassthrough: - physical_network: "sriovnet2" address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[1-3]"} - physical_network: "sriovnet2" address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[5]"} - physical_network: "sriovnet2" address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[7]"}
7.4.2. 内存参数
OVS-DPDK 使用下列内存参数:
- OvsDpdkMemoryChannels
在每个 NUMA 节点的 CPU 中映射内存频道。
OvsDpdkMemoryChannels是 OVS 中的other_config:dpdk-extra="-n <value>"值。观察OvsDpdkMemoryChannels的以下建议:-
使用
dmidecode -t 内存或硬件手册决定可用的内存频道数。 -
使用
ls /sys/devices/system/node* -d确定 NUMA 节点数量。 - 将可用的内存通道数除以 NUMA 节点数。
-
使用
- NovaReservedHostMemory
为主机上的任务保留内存(以 MB 为单位)。
NovaReservedHostMemory是nova.conf中 Compute 节点的reserved_host_memory_mb值。观察NovaReservedHostMemory的以下建议:- 使用静态推荐的值 4096 MB。
- OvsDpdkSocketMemory
指定每个 NUMA 节点预先从巨页池分配的内存量,以 MB 为单位。
OvsDpdkSocketMemory是 OVS 中的other_config:dpdk-socket-mem值。观察OvsDpdkSocketMemory的以下建议:- 以逗号分隔列表形式提供。
- 对于没有 DPDK NIC 的 NUMA 节点,请使用静态推荐 1024 MB(1GB)
-
从 NUMA 节点上每个 NIC 的 MTU 值计算
OvsDpdkSocketMemory值。 以下 equation approximates 值
OvsDpdkSocketMemory:MEMORY_REQD_PER_MTU = (ROUNDUP_PER_MTU + 800) * (4096 * 64) Bytes
- 800 是开销值。
- 4096 * 64 是 mempool 中数据包的数量。
- 为 NUMA 节点上设置的每个 MTU 值添加 MEMORY_REQD_PER_MTU,再添加另一个 512 MB 作为缓冲。将值向上取整为 1024 的倍数。
如果 MTU 大小不是 1500,您可能会在 /var/log/messages 中获得 Failed 来创建内存池 错误消息。如果在实例启动时发生,可以忽略此错误消息。要避免此消息,请将 1500 MTU 的额外 OvsDpdkSocketMemory 数量添加到 OvsDpdkSocketMemory 计算中。
Calculation - MTU 2000 和 MTU 9000
DPDK NIC dpdk0 和 dpdk1 位于同一 NUMA 节点 0,并分别配置了 MTUs 9000 和 2000。获取所需内存的计算示例如下:
将 MTU 值从最接近的 1024 字节。
The MTU value of 9000 becomes 9216 bytes. The MTU value of 2000 becomes 2048 bytes.
根据这些舍入字节值计算每个 MTU 值所需的内存。
Memory required for 9000 MTU = (9216 + 800) * (4096*64) = 2625634304 Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
计算需要的总内存(以字节为单位)。
2625634304 + 746586112 + 536870912 = 3909091328 bytes.
此计算代表(MTU 为 9000 所需的内存)+( 2000 的 MTU 需要内存)+(512 MB 缓冲)。
将所需的总内存转换为 MB。
3909091328 / (1024*1024) = 3728 MB.
将此值舍入到最接近的 1024。
3724 MB rounds up to 4096 MB.
使用这个值设置
OvsDpdkSocketMemory。OvsDpdkSocketMemory: "4096,1024"
Calculation - MTU 2000
DPDK NIC dpdk0 和 dpdk1 位于相同的 NUMA 节点 0 中,各自配置了 2000 的 MTU。获取所需内存的计算示例如下:
将 MTU 值从最接近的 1024 字节。
The MTU value of 2000 becomes 2048 bytes.
根据这些舍入字节值计算每个 MTU 值所需的内存。
Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
计算需要的总内存(以字节为单位)。
746586112 + 536870912 = 1283457024 bytes.
此计算代表(MTU 为 2000 所需的内存)+(512 MB 缓冲)。
将所需的总内存转换为 MB。
1283457024 / (1024*1024) = 1224 MB.
将此值舍入到最接近 1024 的倍数。
1224 MB rounds up to 2048 MB.
使用这个值设置
OvsDpdkSocketMemory。OvsDpdkSocketMemory: "2048,1024"
7.4.3. 网络参数
- OvsDpdkDriverType
-
设置 DPDK 使用的驱动程序类型。使用
vfio-pci的默认值。 - NeutronDatapathType
-
OVS 网桥的数据路径类型。DPDK 使用
netdev的默认值。 - NeutronVhostuserSocketDir
-
为 OVS 设置 vhost-user 套接字目录。为 vhost 客户端模式使用
/var/lib/vhost_sockets。
7.4.4. 其他参数
- NovaSchedulerDefaultFilters
- 提供有序的过滤器列表,该过滤器用于为请求的客户机实例查找匹配的 Compute 节点。
- VhostuserSocketGroup
-
设置 vhost-user 套接字目录组。默认值为
qemu。将VhostuserSocketGroup设置为hugetlbfs,以便ovs-vswitchd和qemu进程可以访问共享巨页和 unix 套接字来配置 virtio-net 设备。此值特定于角色,应当应用于利用 OVS-DPDK 的任何角色。 - KernelArgs
在引导时为
/etc/default/grub提供多个内核参数。根据您的配置添加以下值:hugepagesz:设置 CPU 上的巨页大小。这个值可能会因 CPU 硬件而异。设置为 1G,用于 OVS-DPDK 部署(default_hugepagesz=1GB hugepagesz=1G)。使用这个命令检查pdpe1gbCPU 标记,确认您的 CPU 支持 1G。lshw -class processor | grep pdpe1gb
-
hugepages count:根据可用主机内存设置可用巨页数量。使用大多数可用内存,但NovaReservedHostMemory除外。您还必须在 Compute 节点类别中配置巨页数值。 -
IOMMU: 对于 Intel CPU,添加"intel_iommu=on iommu=pt" -
isolcpus:设置用于调优的 CPU 内核。这个值与IsolCpusList匹配。
有关 CPU 隔离的更多信息,请参阅 RHEL 8 和 RHEL 9 的红帽知识库解决方案 OpenStack CPU 隔离指南
- DdpPackage
配置动态设备个性化(DDP),以在部署时应用配置集软件包到设备,以更改设备的数据包处理管道。将以下行添加到您的
network_environment.yaml模板,使其包含 DDP 软件包:parameter_defaults: ComputeOvsDpdkSriovParameters: DdpPackage: "ddp-comms"
7.4.5. 实例额外规格
在 NFV 环境中部署实例之前,创建使用 CPU 固定、巨页和仿真程序线程固定的类别。
- hw:cpu_policy
-
当此参数设置为
专用时,客户机使用固定 CPU。从设定此参数的类别中创建的实例具有 1:1 的有效过量使用比例。默认值为shared。 - hw:mem_page_size
将此参数设置为带有标准后缀(例如:
4KB、8MB或1GB)的特定值的有效字符串。使用 1GB 匹配hugepagesz引导参数。通过从引导参数减去OvsDpdkSocketMemory来计算虚拟机的巨页数量。以下值也有效:- small (默认)- 使用最小页面大小
- 大 - 只使用大页大小。(x86 构架中的 2MB 或 1GB)
- any - 计算驱动程序可以使用大页面,但如果没有可用的,则默认为 small。
- hw:emulator_threads_policy
-
将此参数的值设置为
shared,以便仿真程序线程锁定在 heat 参数NovaComputeCpuSharedSet中发现的 CPU。如果仿真程序线程在带有轮询模式驱动程序(PMD)或实时处理的 vCPU 上运行,则可能会遇到负面影响,如数据包丢失。
7.5. 两个 NUMA 节点示例 OVS-DPDK 部署
以下示例中的 Compute 节点包含两个 NUMA 节点:
- NUMA 0 具有内核 0-7。同级线程对有(0,1)、(2,3)、(4,5)和(6,7)
- NUMA 1 具有内核 8-15。同级线程对有(8,9),(10,11),(12,13)和(14,15)。
- 每个 NUMA 节点都连接到物理 NIC,即 NUMA 0 上的 NIC1 和 NUMA 1 上的 NIC2。

为非数据路径 DPDK 进程保留第一个物理内核或每个 NUMA 节点(0、1 和 89)的线程对。
本例还假定 MTU 配置 1500,因此所有用例中的 OvsDpdkSocketMemory 都相同:
OvsDpdkSocketMemory: "1024,1024"
NIC 1 用于 DPDK,一个指向 PMD 的物理内核
在这种情况下,您可以在 NUMA 0 上为 PMD 分配一个物理内核。您还必须在 NUMA 1 中分配一个物理内核,即使该 NUMA 节点的 NIC 中没有启用 DPDK。剩余的内核为客户机实例分配。生成的参数设置有:
OvsPmdCoreList: "2,3,10,11" NovaComputeCpuDedicatedSet: "4,5,6,7,12,13,14,15"
NIC 1 用于 DPDK,有两个用于 PMD 的物理内核
在这种情况下,您可以为 PMD 在 NUMA 0 上分配两个物理内核。您还必须在 NUMA 1 中分配一个物理内核,即使该 NUMA 节点的 NIC 中没有启用 DPDK。剩余的内核为客户机实例分配。生成的参数设置有:
OvsPmdCoreList: "2,3,4,5,10,11" NovaComputeCpuDedicatedSet: "6,7,12,13,14,15"
NIC 2 用于 DPDK,一个指向 PMD 的物理内核
在这种情况下,您可以在 NUMA 1 中为 PMD 分配一个物理内核。您还必须在 NUMA 0 中分配一个物理内核,即使该 NUMA 节点的 NIC 中没有启用 DPDK。剩余的内核为客户机实例分配。生成的参数设置有:
OvsPmdCoreList: "2,3,10,11" NovaComputeCpuDedicatedSet: "4,5,6,7,12,13,14,15"
NIC 2 用于 DPDK,有两个用于 PMD 的物理内核
在这种情况下,您可以为 PMD 在 NUMA 1 中分配两个物理内核。您还必须在 NUMA 0 中分配一个物理内核,即使该 NUMA 节点的 NIC 中没有启用 DPDK。剩余的内核为客户机实例分配。生成的参数设置有:
OvsPmdCoreList: "2,3,10,11,12,13" NovaComputeCpuDedicatedSet: "4,5,6,7,14,15"
NIC 1 和 NIC2 用于 DPDK,两个物理内核用于 PMD
在这种情况下,您可以为 PMD 在每个 NUMA 节点上分配两个物理内核。剩余的内核为客户机实例分配。生成的参数设置有:
OvsPmdCoreList: "2,3,4,5,10,11,12,13" NovaComputeCpuDedicatedSet: "6,7,14,15"
7.6. NFV OVS-DPDK 部署的拓扑
这个示例部署显示 OVS-DPDK 配置,它由两个虚拟网络功能(VNF)组成,每个接口有两个接口:
-
管理界面,由
mgt表示。 - data plane 接口。
在 OVS-DPDK 部署中,VNF 与支持物理接口的内置 DPDK 一起运作。OVS-DPDK 在 vSwitch 级别启用绑定。为了提高 OVS-DPDK 部署的性能,建议您分隔内核和 OVS-DPDK NIC。要分隔管理(mgt)网络,连接到虚拟机的 Base 提供商网络,请确保拥有额外的 NIC。Compute 节点由两个用于 Red Hat OpenStack Platform API 管理的常规 NIC 组成,这些 NIC 可以被 Ceph API 重新使用,但不能与任何 OpenStack 项目共享。

NFV OVS-DPDK 拓扑
下图显示了 NFV 的 OVS-DPDK 的拓扑。它由具有 1 个或 10 Gbps NIC 的 Compute 和 Controller 节点以及 director 节点组成。

第 8 章 配置 OVS-DPDK 部署
本节在 Red Hat OpenStack Platform 环境中部署 OVS-DPDK。overcloud 通常由预定义角色的节点组成,如 Controller 节点、计算节点和不同的存储节点类型。这些默认角色各自包含 director 节点上的核心 heat 模板中定义的一组服务。
您必须安装和配置 undercloud,然后才能部署 overcloud。详情请查看 Director 安装和使用指南。
您必须确定 network-environment.yaml 文件中的 OVS-DPDK 参数的最佳值,以便为 OVS-DPDK 优化 OpenStack 网络。
不要手动编辑或更改 director heat 模板修改的 etc/tuned/cpu-partitioning-variables.conf 中的 isolated_cores 或其他值。
8.1. 使用工作流划分 DPDK 参数
该功能在此发行版本中作为技术预览提供,因此不享有红帽的全面支持。它只应用于测试,不应部署在生产环境中。有关技术预览功能的更多信息,请参阅覆盖范围详细信息。
请参阅 第 7.2 节 “工作流和派生参数” 查看 DPDK 的 Mistral 工作流概述。
先决条件
您必须有裸机内省,包括启用了硬件检查额外(inspection_extras)来提供此工作流检索的数据。硬件检查额外功能会被默认启用。有关节点硬件的更多信息,请参阅: 检查节点的硬件。
定义 DPDK 的工作流和输入参数
以下列表概述了您可以提供给 OVS-DPDK 工作流的输入参数:
- num_phy_cores_per_numa_node_for_pmd
- 此输入参数指定与 DPDK NIC 关联的 NUMA 节点所需的最小内核数。为其他没有与 DPDK NIC 关联的 NUMA 节点分配物理内核。确保此参数设置为 1。
- huge_page_allocation_percentage
-
此输入参数指定了内存总量所需的百分比,不包括
NovaReservedHostMemory,它们可以配置为巨页。KernelArgs参数使用根据指定的huge_page_allocation_percentage计算的巨页。确保此参数设为 50。
工作流从这些输入参数和裸机内省详情计算适当的 DPDK 参数值。
为 DPDK 定义工作流和输入参数:
将
usr/share/openstack-tripleo-heat-templates/plan-environment-derived-params.yaml文件复制到本地目录,并设置输入参数以适合您的环境。workflow_parameters: tripleo.derive_params.v1.derive_parameters: # DPDK Parameters # # Specifies 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运行
openstack overcloud deploy命令并包含以下信息:-
update-plan-only选项 - 角色文件和所有环境文件特定于您的环境
带有
--plan-environment-file可选参数的plan-environment-derived-parms.yaml文件$ openstack overcloud deploy --templates --update-plan-only \ -r /home/stack/roles_data.yaml \ -e /home/stack/<environment-file> \ ... _#repeat as necessary_ ... **-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 NovaComputeCpuDedicatedSet: 2,3,4,5,6,7,18,19,20,21,22,23,10,11,12,13,14,15,26,27,28,29,30,31 OvsDpdkMemoryChannels: 4 OvsDpdkSocketMemory: 1024,1024 OvsPmdCoreList: 1,17,9,25
OvsDpdkMemoryChannels 参数无法从内省详情中获取。在大多数情况下,这个值应该是 4。
使用衍生参数部署 overcloud
使用这些派生参数部署 overcloud:
将 deploy 命令输出中派生的参数复制到
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" NovaComputeCpuDedicatedSet: ['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" OvsPmdCoreList: "1,17,9,25"注意这些参数适用于特定的角色 ComputeOvsDpdk。您可以在全局范围内应用这些参数,但特定于角色的参数会覆盖任何全局参数。
- 使用角色文件和特定于您的环境的所有环境文件来部署 overcloud。
openstack overcloud deploy --templates \ -r /home/stack/roles_data.yaml \ -e /home/stack/<environment-file> \ ... #repeat as necessary ...
在具有 Compute、ComputeOvsDpdk 和 ComputeSriov 的集群中,工作流只对 ComputeOvsDpdk 角色应用公式,而不是 Compute 或 ComputeSriovs。
8.2. OVS-DPDK 拓扑
使用 Red Hat OpenStack Platform,您可以使用可组合角色功能创建自定义部署角色,从各个角色中添加或删除服务。有关可组合角色的更多信息,请参阅高级 Overcloud 自定义中的可组合服务和自定义角色。
此镜像显示了 OVS-DPDK 拓扑示例,它有两个绑定端口用于 control plane 和数据平面:

要配置 OVS-DPDK,请执行以下任务:
-
如果使用可组合角色,请复制和修改
roles_data.yaml文件,以添加 OVS-DPDK 的自定义角色。 -
更新适当的
network-environment.yaml文件,使其包含内核参数和 DPDK 参数的参数。 -
更新
compute.yaml文件,使其包含 DPDK 接口参数的网桥。 -
更新
controller.yaml文件,使其包含 DPDK 接口参数的相同网桥详情。 -
运行
overcloud_deploy.sh脚本,以使用 DPDK 参数部署 overcloud。
本指南提供了与拓扑和用例不同的 CPU 分配、内存分配和 NIC 配置的示例。有关硬件和配置选项的更多信息,请参阅: 网络功能虚拟化产品指南和 第 2 章 硬件要求。
先决条件
- OVS 2.10
- DPDK 17
- 一个受支持的 NIC。要查看 NFV 支持的 NIC 列表,请参阅 第 2.1 节 “测试的 NIC”。
Red Hat OpenStack Platform 在 OVS 客户端模式下运行,用于 OVS-DPDK 部署。
8.3. 为 OVS-DPDK 接口设置 MTU 值
Red Hat OpenStack Platform 支持 OVS-DPDK 的巨型帧。要为巨型帧设置最大传输单元(MTU)值,您必须:
-
在
network-environment.yaml文件中为 networking 设置全局 MTU 值。 -
在
compute.yaml文件中设置物理 DPDK 端口 MTU 值。vhost 用户界面也使用这个值。 - 在 Compute 节点上的任何客户机实例内设置 MTU 值,以确保您的配置中最终具有可比的 MTU 值。
VXLAN 数据包在标头中包含额外的 50 字节。根据这些额外的标头字节,计算您的 MTU 要求。例如,MTU 值为 9000 表示 VXLAN 隧道 MTU 的值为 8950,用于考虑这些额外字节。
您不需要针对物理 NIC 的任何特殊配置,因为 NIC 由 DPDK PMD 控制,并且具有由 compute.yaml 文件设置的相同的 MTU 值。您不能设置大于物理 NIC 支持的最大值的 MTU 值。
设置 OVS-DPDK 接口的 MTU 值:
在
network-environment.yaml文件中设置NeutronGlobalPhysnetMtu参数。parameter_defaults: # MTU global configuration NeutronGlobalPhysnetMtu: 9000
注意确保
network-environment.yaml文件中的 OvsDpdkSocketMemory 值足够大,以支持巨型帧。详情请查看 第 7.4.2 节 “内存参数”。将网桥上的 MTU 值设为
controller.yaml文件中的 Compute 节点。- 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.4. 为安全组配置防火墙
DataPlane 接口在有状态防火墙中需要高性能。要保护这些接口,请考虑将电信级防火墙部署为虚拟网络功能(VNF)。
要在 ML2/OVS 部署中配置 control plane 接口,将 NeutronOVSFirewallDriver 参数设置为 openvswitch。要使用基于流的 OVS 防火墙驱动程序,修改 parameter_defaults 下的 network-environment.yaml 文件。在 OVN 部署中,您可以使用访问控制列表(ACL)实施安全组。
您不能将 OVS 防火墙驱动程序用于 HW 卸载,因为卸载路径不支持流跟踪属性。
例如:
parameter_defaults: NeutronOVSFirewallDriver: openvswitch
使用 openstack port set 命令,为 dataplane 接口禁用 OVS 防火墙驱动程序。
例如:
openstack port set --no-security-group --disable-port-security ${PORT}8.5. 为 OVS-DPDK 接口设置多队列
多队列是实验性的,仅支持手动队列固定。
流程
要为 Compute 节点上的 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.6. 配置 OVS PMD Auto Load Balance
该功能在此发行版本中作为技术预览提供,因此不享有红帽的全面支持。它只应用于测试,不应部署在生产环境中。有关技术预览功能的更多信息,请参阅覆盖范围详细信息。
您可以使用 Open vSwitch(OVS)轮询模式驱动程序(PMD)线程对用户空间上下文切换执行以下任务:
- 为数据包持续轮询输入端口。
- 对接收的数据包分类。
- 在分类后对数据包执行操作。
您可以将 RHOSP 部署配置为自动负载均衡 OVS PMD 线程及以下参数:
-
OvsPmdAutoLb -
OvsPmdLoadThreshold -
OvsPmdImprovementThreshold -
OvsPmdRebalInterval
流程
将
OvsPmdAutoLb参数的值更改为true以启用自动 PMD 负载均衡:parameter_defaults: OvsPmdAutoLb: true
指定触发 PMD 与
OvsPmdLoadThreshold参数的 PMD 负载均衡的百分比限制:parameter_defaults: OvsPmdAutoLb: true OvsPmdLoadThreshold: <load_threshold>
将
<load_threshold> 替换为 0 到 100 之间的数字,表示触发自动负载均衡的 PMD 线程负载的最小百分比。指定跨非隔离 PMD 线程(触发 PMD Auto Load Balance
OvsPmdImprovementThreshold参数)的最小评估百分比:parameter_defaults: OvsPmdAutoLb: true OvsPmdLoadThreshold: <load_threshold> OvsPmdImprovementThreshold: <improvement_threshold>
将
<improvement_threshold> 替换为 0 到 100 之间的数字,表示触发自动负载均衡的已评估的最小百分比。使用
OvsPmdRebalInterval参数指定两个连续 PMD 自动载入操作之间的最短时间:parameter_defaults: OvsPmdAutoLb: true OvsPmdLoadThreshold: <load_threshold> OvsPmdImprovementThreshold: <improvement_threshold> OvsPmdRebalInterval: <interval>
将
<interval> 替换为 0 到 20,000 之间的数字,以表示时间(以分钟为单位)。将您的 OVS PMD 环境文件添加到堆栈中,并部署 overcloud:
(undercloud)$ openstack overcloud deploy --templates \ -e [your environment files] \ -e /home/stack/templates/auto_ovs_pmd.yaml
8.7. 已知限制
在为 NFV 配置 OVS-DPDK 时,观察以下限制:
- 对非 DPDK 流量使用 Linux 绑定和 control plane 网络,如内部、管理、存储、存储管理和租户。确保绑定中使用的 PCI 设备位于同一 NUMA 节点上,以实现最佳性能。红帽不支持 Neutron Linux 网桥配置。
- 在使用 OVS-DPDK 的主机上运行的每个实例都需要巨页。如果客户端中没有巨页,接口会出现但无法正常工作。
- 使用 OVS-DPDK 时,使用 tap 设备(如分布式虚拟路由(DVR))的服务性能下降。得到的性能不适用于生产环境。
-
使用 OVS-DPDK 时,同一 Compute 节点上的所有网桥都必须是
ovs_user_bridge类型。director 可以接受配置,但 Red Hat OpenStack Platform 不支持在同一节点上混合ovs_bridge和ovs_user_bridge。
8.8. 为 OVS-DPDK 创建类别和部署实例
在使用 NFV 为 Red Hat OpenStack Platform 部署配置 OVS-DPDK 后,您可以创建类别,并使用以下步骤部署实例:
创建聚合组,并为 OVS-DPDK 添加相关主机。定义与定义的类别元数据匹配的元数据,如
dpdk=true。# openstack aggregate create dpdk_group # openstack aggregate add host dpdk_group [compute-host] # openstack aggregate set --property dpdk=true dpdk_group
注意固定 CPU 实例可以位于与未固定实例相同的 Compute 节点上。如需更多信息,请参阅配置实例创建指南中的在 Compute 节点上配置 CPU 固定。
创建类别。
# openstack flavor create <flavor> --ram <MB> --disk <GB> --vcpus <#>
设置类别属性。请注意,定义的元数据
dpdk=true与 DPDK 聚合中定义的元数据匹配。# openstack flavor set <flavor> --property dpdk=true --property hw:cpu_policy=dedicated --property hw:mem_page_size=1GB --property hw:emulator_threads_policy=isolate
有关性能改进的仿真程序线程策略的详情,请参考 配置仿真程序线程。
创建 网络。
# openstack network create net1 --provider-physical-network tenant --provider-network-type vlan --provider-segment <VLAN-ID> # openstack subnet create subnet1 --network net1 --subnet-range 192.0.2.0/24 --dhcp
可选:如果您在 OVS-DPDK 中使用多队列,请在您要用于创建实例的镜像上设置
hw_vif_multiqueue_enabled属性:# openstack image set --property hw_vif_multiqueue_enabled=true <image>
部署实例。
# openstack server create --flavor <flavor> --image <glance image> --nic net-id=<network ID> <server_name>
8.9. 对 OVS-DPDK 配置进行故障排除
本节介绍对 OVS-DPDK 配置进行故障排除的步骤。
检查网桥配置,并确认网桥具有
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另外,您可以查看错误的日志,如容器无法启动。
# less /var/log/containers/neutron/openvswitch-agent.log
确认
ovs-dpdk的 Poll Mode Driver CPU 掩码已固定到 CPU。如果是超线程,请使用同级 CPU。例如,要检查
CPU4的同级设备,请运行以下命令:# cat /sys/devices/system/cpu/cpu4/topology/thread_siblings_list 4,20
CPU4的同级是CPU20,因此使用以下命令:# 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
第 9 章 调优 Red Hat OpenStack Platform 环境
9.1. 固定仿真程序线程
仿真程序线程处理虚拟机硬件模拟的中断请求和非阻塞进程。这些线程浮点值用于客户机用于处理的 CPU。如果用于轮询模式驱动程序(PMD)或实时处理的线程在这些客户机 CPU 上运行,您可以遇到数据包丢失或错过的期限。
您可以通过将线程固定到自己的客户机 CPU,将仿真程序线程与虚拟机处理任务分开,从而提高性能。
9.1.1. 配置 CPU 到主机仿真程序线程
为提高性能,为托管仿真程序线程保留主机 CPU 子集。
流程
使用为给定角色定义的
NovaComputeCpuSharedSet部署 overcloud。NovaComputeCpuSharedSet的值适用于该角色内主机的nova.conf文件中的cpu_shared_set参数。parameter_defaults: ComputeOvsDpdkParameters: NovaComputeCpuSharedSet: "0-1,16-17" NovaComputeCpuDedicatedSet: "2-15,18-31"创建类别,以构建将仿真程序线程分隔到共享池的实例。
openstack flavor create --ram <size_mb> --disk <size_gb> --vcpus <vcpus> <flavor>
添加
hw:emulator_threads_policy额外规格,并将值设为共享。使用这个类别创建的实例将使用 nova.conf 文件中的cpu_share_set参数中定义的实例 CPU。openstack flavor set <flavor> --property hw:emulator_threads_policy=share
您必须在 nova.conf 文件中设置 cpu_share_set 参数,以便为这个额外规格启用共享策略。您应该优先使用 heat,因为编辑 nova.conf 可能无法在重新部署后保留。
9.1.2. 验证仿真程序线程固定
流程
识别给定实例的主机名。
openstack server show <instance_id>
以 heat-admin 用户身份,使用 SSH 登录指定的主机。
ssh heat-admin@compute-1 [compute-1]$ sudo virsh dumpxml instance-00001 | grep `'emulatorpin cpuset'`
9.2. 为 NFV 工作负载启用 RT-KVM
为便于安装和配置 Red Hat Enterprise Linux 8.2 Real Time KVM(RT-KVM),Red Hat OpenStack Platform 提供了以下功能:
- 为实时置备 Red Hat Enterprise Linux 的实时 Compute 节点角色。
- 额外的 RT-KVM 内核模块。
- Compute 节点自动配置。
9.2.1. 规划 RT-KVM Compute 节点
您必须将红帽认证的服务器用于 RT-KVM Compute 节点。如需更多信息,请参阅: 用于 Real Time 认证的服务器的 Red Hat Enterprise Linux。
有关如何为 RT-KVM 启用 rhel-8-server-nfv-rpms 软件仓库的详情,以及确保您的系统保持最新状态,请参阅: 注册和更新 undercloud
您需要单独订阅 Red Hat OpenStack Platform for Real Time SKU,才能访问此软件仓库。
构建实时镜像
在 undercloud 上安装 libguestfs-tools 软件包,以获取 virt-customize 工具:
(undercloud) [stack@undercloud-0 ~]$ sudo dnf install libguestfs-tools
重要如果在 undercloud 上安装
libguestfs-tools软件包,请禁用iscsid.socket,以避免与 undercloud 上的tripleo_iscsid服务冲突:$ sudo systemctl disable --now iscsid.socket
解压镜像:
(undercloud) [stack@undercloud-0 ~]$ tar -xf /usr/share/rhosp-director-images/overcloud-full.tar (undercloud) [stack@undercloud-0 ~]$ tar -xf /usr/share/rhosp-director-images/ironic-python-agent.tar
复制默认镜像:
(undercloud) [stack@undercloud-0 ~]$ cp overcloud-full.qcow2 overcloud-realtime-compute.qcow2
注册您的镜像以启用与您的自定义相关的红帽软件仓库。将
[username]和[password]替换为以下示例中的有效凭证。virt-customize -a overcloud-realtime-compute.qcow2 --run-command \ 'subscription-manager register --username=[username] --password=[password]' \ subscription-manager release --set 8.4
注意为安全起见,如果在命令提示符中使用它们,则可从历史记录文件中删除凭证。您可以使用
history -d命令和行号删除历史记录中的个别行。从您的帐户的订阅中找到池 ID 列表,并将适当的池 ID 附加到您的镜像。
sudo subscription-manager list --all --available | less ... virt-customize -a overcloud-realtime-compute.qcow2 --run-command \ 'subscription-manager attach --pool [pool-ID]'
添加使用 NFV 的 Red Hat OpenStack Platform 所需的存储库。
virt-customize -a overcloud-realtime-compute.qcow2 --run-command \ 'sudo subscription-manager repos --enable=rhel-8-for-x86_64-baseos-eus-rpms \ --enable=rhel-8-for-x86_64-appstream-eus-rpms \ --enable=rhel-8-for-x86_64-highavailability-eus-rpms \ --enable=ansible-2.9-for-rhel-8-x86_64-rpms \ --enable=openstack-16.2-for-rhel-8-x86_64-rpms \ --enable=rhel-8-for-x86_64-nfv-rpms \ --enable=fast-datapath-for-rhel-8-x86_64-rpms'
创建一个脚本,以配置镜像的实时功能。
(undercloud) [stack@undercloud-0 ~]$ cat <<'EOF' > rt.sh #!/bin/bash set -eux dnf -v -y --setopt=protected_packages= erase kernel.$(uname -m) dnf -v -y install kernel-rt kernel-rt-kvm tuned-profiles-nfv-host grubby --set-default /boot/vmlinuz*rt* EOF
运行脚本以配置实时镜像:
(undercloud) [stack@undercloud-0 ~]$ virt-customize -a overcloud-realtime-compute.qcow2 -v --run rt.sh 2>&1 | tee virt-customize.log
注意如果您在
rt.sh脚本输出中看到以下行,"grubby fatal error: 无法找到合适的模板",您可以忽略此错误。检查之前命令生成的
virt-customize.log文件,以使用rt.sh脚本检查是否正确安装的软件包。(undercloud) [stack@undercloud-0 ~]$ cat virt-customize.log | grep Verifying Verifying : kernel-3.10.0-957.el7.x86_64 1/1 Verifying : 10:qemu-kvm-tools-rhev-2.12.0-18.el7_6.1.x86_64 1/8 Verifying : tuned-profiles-realtime-2.10.0-6.el7_6.3.noarch 2/8 Verifying : linux-firmware-20180911-69.git85c5d90.el7.noarch 3/8 Verifying : tuned-profiles-nfv-host-2.10.0-6.el7_6.3.noarch 4/8 Verifying : kernel-rt-kvm-3.10.0-957.10.1.rt56.921.el7.x86_64 5/8 Verifying : tuna-0.13-6.el7.noarch 6/8 Verifying : kernel-rt-3.10.0-957.10.1.rt56.921.el7.x86_64 7/8 Verifying : rt-setup-2.0-6.el7.x86_64 8/8
重新标记 SELinux:
(undercloud) [stack@undercloud-0 ~]$ virt-customize -a overcloud-realtime-compute.qcow2 --selinux-relabel
提取 vmlinuz 和 initrd:
(undercloud) [stack@undercloud-0 ~]$ mkdir image (undercloud) [stack@undercloud-0 ~]$ guestmount -a overcloud-realtime-compute.qcow2 -i --ro image (undercloud) [stack@undercloud-0 ~]$ cp image/boot/vmlinuz-3.10.0-862.rt56.804.el7.x86_64 ./overcloud-realtime-compute.vmlinuz (undercloud) [stack@undercloud-0 ~]$ cp image/boot/initramfs-3.10.0-862.rt56.804.el7.x86_64.img ./overcloud-realtime-compute.initrd (undercloud) [stack@undercloud-0 ~]$ guestunmount image
注意vmlinuz和initramfs文件名中的软件版本与内核版本不同。上传镜像:
(undercloud) [stack@undercloud-0 ~]$ openstack overcloud image upload --update-existing --os-image-name overcloud-realtime-compute.qcow2
现在,您有一个实时镜像,可用于所选 Compute 节点上的 ComputeOvsDpdkRT 可组合角色。
修改 RT-KVM Compute 节点上的 BIOS 设置
要减少 RT-KVM Compute 节点上的延迟,请在 Compute 节点 BIOS 设置中禁用以下参数的所有选项:
- 电源管理
- 超线程
- CPU 睡眠状态
- 逻辑处理器
如需了解这些设置的描述以及禁用它们的影响,请参阅设置 BIOS 参数。有关如何更改 BIOS 设置的详情,请查看您的硬件厂商文档。
9.2.2. 使用 RT-KVM 配置 OVS-DPDK
您必须确定您在 network-environment.yaml 文件中设置的 OVS-DPDK 参数的最佳值,以便为 OVS-DPDK 优化 OpenStack 网络。如需了解更多详细信息,请参阅 第 8.1 节 “使用工作流划分 DPDK 参数”。
9.2.2.1. 生成 ComputeOvsDpdk 可组合角色
使用 ComputeOvsDpdkRT 角色为实时计算镜像指定 Compute 节点。
为 ComputeOvsDpdkRT 角色生成 roles_data.yaml。
# (undercloud) [stack@undercloud-0 ~]$ openstack overcloud roles generate -o roles_data.yaml Controller ComputeOvsDpdkRT
9.2.2.2. 配置 OVS-DPDK 参数
确定 network-environment.yaml 文件中的 OVS-DPDK 参数的最佳值,以优化您的部署。更多信息请参阅 第 8.1 节 “使用工作流划分 DPDK 参数”。
为
resource_registry下的 OVS-DPDK 角色添加 NIC 配置:resource_registry: # Specify the relative/absolute path to the config files you want to use for override the default. OS::TripleO::ComputeOvsDpdkRT::Net::SoftwareConfig: nic-configs/compute-ovs-dpdk.yaml OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml
在
parameter_defaults下,设置 OVS-DPDK 和 RT-KVM 参数:# DPDK compute node. ComputeOvsDpdkRTParameters: KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on isolcpus=1-7,17-23,9-15,25-31" TunedProfileName: "realtime-virtual-host" 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" NovaComputeCpuDedicatedSet: ['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" OvsPmdCoreList: "1,17,9,25" VhostuserSocketGroup: "hugetlbfs" ComputeOvsDpdkRTImage: "overcloud-realtime-compute"
9.2.2.3. 部署 overcloud
为 ML2-OVS 部署 overcloud:
(undercloud) [stack@undercloud-0 ~]$ openstack overcloud deploy \ --templates \ -r /home/stack/ospd-16-vlan-dpdk-ctlplane-bonding-rt/roles_data.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovs.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovs-dpdk.yaml \ -e /home/stack/ospd-16-vxlan-dpdk-data-bonding-rt-hybrid/containers-prepare-parameter.yaml \ -e /home/stack/ospd-16-vxlan-dpdk-data-bonding-rt-hybrid/network-environment.yaml
9.2.3. 启动 RT-KVM 实例
执行以下步骤在实时启用的 Compute 节点上启动 RT-KVM 实例:
在 overcloud 中创建 RT-KVM 类别:
# openstack flavor create r1.small 99 4096 20 4 # openstack flavor set --property hw:cpu_policy=dedicated 99 # openstack flavor set --property hw:cpu_realtime=yes 99 # openstack flavor set --property hw:mem_page_size=1GB 99 # openstack flavor set --property hw:cpu_realtime_mask="^0-1" 99 # openstack flavor set --property hw:cpu_emulator_threads=isolate 99
启动 RT-KVM 实例:
# openstack server create --image <rhel> --flavor r1.small --nic net-id=<dpdk-net> test-rt
要验证实例是否使用分配的仿真程序线程,请运行以下命令:
# virsh dumpxml <instance-id> | grep vcpu -A1 <vcpu placement='static'>4</vcpu> <cputune> <vcpupin vcpu='0' cpuset='1'/> <vcpupin vcpu='1' cpuset='3'/> <vcpupin vcpu='2' cpuset='5'/> <vcpupin vcpu='3' cpuset='7'/> <emulatorpin cpuset='0-1'/> <vcpusched vcpus='2-3' scheduler='fifo' priority='1'/> </cputune>
9.3. 可信虚拟功能
您可以配置物理功能(PF)和虚拟功能(VF)之间的信任,以便 VF 能够执行特权操作,如启用混杂模式或修改硬件地址。
9.3.1. 配置虚拟和物理功能之间的信任
先决条件
- Red Hat OpenStack Platform 的操作安装,包括 director
流程
完成以下步骤,在物理和虚拟功能间使用信任的 overcloud 配置和部署 overcloud:
在
parameter_defaults部分中添加NeutronPhysicalDevMappings参数,以链接逻辑网络名称和物理接口。parameter_defaults: NeutronPhysicalDevMappings: - sriov2:p5p2将新属性
trusted添加到 SR-IOV 参数。parameter_defaults: NeutronPhysicalDevMappings: - sriov2:p5p2 NovaPCIPassthrough: - vendor_id: "8086" product_id: "1572" physical_network: "sriov2" trusted: "true"注意您必须在值 "true" 中包含双引号。
9.3.2. 使用可信 VF 网络
创建类型为
vlan的网络。openstack network create trusted_vf_network --provider-network-type vlan \ --provider-segment 111 --provider-physical-network sriov2 \ --external --disable-port-security
创建子网。
openstack subnet create --network trusted_vf_network \ --ip-version 4 --subnet-range 192.168.111.0/24 --no-dhcp \ subnet-trusted_vf_network
创建端口。将
vnic-type选项设置为direct,将binding-profile选项设置为true。openstack port create --network sriov111 \ --vnic-type direct --binding-profile trusted=true \ sriov111_port_trusted
创建一个实例,并将它绑定到之前创建的可信端口。
openstack server create --image rhel --flavor dpdk --network internal --port trusted_vf_network_port_trusted --config-drive True --wait rhel-dpdk-sriov_trusted
验证虚拟机监控程序上的可信 VF 配置
在您创建的实例的计算节点上,输入以下命令:
# ip link 7: p5p2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether b4:96:91:1c:40:fa brd ff:ff:ff:ff:ff:ff vf 6 MAC fa:16:3e:b8:91:c2, vlan 111, spoof checking off, link-state auto, trust on, query_rss off vf 7 MAC fa:16:3e:84:cf:c8, vlan 111, spoof checking off, link-state auto, trust off, query_rss off-
验证 上 VF 的信任状态是
信任。示例输出中包含包含两个端口的环境的详细信息。请注意,vf 6包含上的文本信任。 -
如果您在网络服务(neutron)网络中设置了
port_security_enabled: false,或者在运行openstack port create命令时包含参数--disable-port-security,可以禁用 spoof 检查。
9.4. 配置 RX/TX 队列大小
出于许多原因,您可能会遇到高于每秒 350 万条数据包的数据包丢失,例如:
- 网络中断
- a SMI
- Virtual Network Function 中的数据包处理延迟
要防止数据包丢失,将队列大小从默认值 512 增加到最多 1024。
先决条件
- 要配置 RX,请确保您有 libvirt v2.3 和 QEMU v2.7。
- 要配置 TX,请确保您有 libvirt v3.7 和 QEMU v2.10。
流程
要增加 RX 和 TX 队列大小,请将以下行包括在相关 director 角色的
parameter_defaults:部分。以下是具有 ComputeOvsDpdk 角色的示例:parameter_defaults: ComputeOvsDpdkParameters: -NovaLibvirtRxQueueSize: 1024 -NovaLibvirtTxQueueSize: 1024
测试
您可以观察 nova.conf 文件中 RX 队列大小和 TX 队列大小的值:
[libvirt] rx_queue_size=1024 tx_queue_size=1024
您可以在计算主机上 libvirt 生成的虚拟机实例 XML 文件中检查 RX 队列大小和 TX 队列大小的值。
<devices> <interface type='vhostuser'> <mac address='56:48:4f:4d:5e:6f'/> <source type='unix' path='/tmp/vhost-user1' mode='server'/> <model type='virtio'/> <driver name='vhost' rx_queue_size='1024' tx_queue_size='1024' /> <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/> </interface> </devices>要验证 RX 队列大小和 TX 队列大小的值,请在 KVM 主机上使用以下命令:
$ virsh dumpxml <vm name> | grep queue_size
- 您可以检查更好的性能,如 3.8 mpps/core,0 个帧丢失。
9.5. 配置 NUMA 感知 vSwitch
该功能在此发行版本中作为技术预览提供,因此不享有红帽的全面支持。它只应用于测试,不应部署在生产环境中。有关技术预览功能的更多信息,请参阅覆盖范围详细信息。
在实施 NUMA 感知的 vSwitch 前,请检查您的硬件配置的以下组件:
- 物理网络的数量。
- PCI 卡的放置。
- 服务器的物理架构。
内存映射的 I/O(MMIO)设备(如 PCIe NIC)与特定的 NUMA 节点关联。当 VM 和 NIC 位于不同的 NUMA 节点上时,性能会显著降低。为提高性能,使 PCIe NIC 放置和实例处理在同一 NUMA 节点上保持一致。
使用此功能来确保共享物理网络的实例位于同一 NUMA 节点上。要优化数据中心硬件的使用,您必须使用多个 physnets。
要配置 NUMA 感知网络以实现最佳服务器利用率,您必须了解 PCIe 插槽和 NUMA 节点的映射。有关您特定硬件的详细信息,请参阅您的供应商文档。如果无法正确规划或实施 NUMA 感知 vSwitch,则可能导致服务器只使用单个 NUMA 节点。
要防止跨 NUMA 配置,请将虚拟机放置在正确的 NUMA 节点上,方法是向 Nova 提供 NIC 的位置。
先决条件
-
您已启用过滤器
NUMATopologyFilter
流程
-
设置一个新的
NeutronPhysnetNUMANodesMapping参数,将物理网络映射到您与物理网络关联的 NUMA 节点。 如果使用 VxLAN 或 GRE 等隧道,还必须设置
NeutronTunnelNUMANodes参数。parameter_defaults: NeutronPhysnetNUMANodesMapping: {<physnet_name>: [<NUMA_NODE>]} NeutronTunnelNUMANodes: <NUMA_NODE>,<NUMA_NODE>
以下是两个到 NUMA 节点 0 的物理网络的示例:
- 与 NUMA 节点 0 关联的项目网络
一个没有关联性的管理网络
parameter_defaults: NeutronBridgeMappings: - tenant:br-link0 NeutronPhysnetNUMANodesMapping: {tenant: [1], mgmt: [0,1]} NeutronTunnelNUMANodes: 0在以下示例中,将名为 eno2 的设备的 physnet 分配到 NUMA 号 0。
# ethtool -i eno2 bus-info: 0000:18:00.1 # cat /sys/devices/pci0000:16/0000:16:02.0/0000:18:00.1/numa_node 0
观察以下示例 heat 模板中的 physnet 设置。
NeutronBridgeMappings: 'physnet1:br-physnet1' NeutronPhysnetNUMANodesMapping: {physnet1: [0] } - type: ovs_user_bridge name: br-physnet1 mtu: 9000 members: - type: ovs_dpdk_port name: dpdk2 members: - type: interface name: eno2
测试 NUMA 感知 vSwitch
观察 /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf 文件中的配置
[neutron_physnet_tenant] numa_nodes=1 [neutron_tunnel] numa_nodes=1
使用
lscpu命令确认新配置:$ lscpu
- 启动带有附加到适当网络的 NIC 的虚拟机
已知限制
- 如果您没有指定双节点客户机 NUMA 拓扑,则无法启动有两个 NIC 连接到不同 NUMA 节点上的 physnet。
- 如果您没有指定双节点客户机 NUMA 拓扑,则无法启动一个连接到 physnet 的 NIC,以及连接到不同 NUMA 节点上的隧道网络的 NIC。
- 如果您没有指定双节点客户机 NUMA 拓扑,则无法启动具有一个 vhost 端口和不同 NUMA 节点上的一个 VF。
- NUMA 感知 vSwitch 参数特定于 overcloud 角色。例如,Compute 节点 1 和 Compute 节点 2 可以有不同的 NUMA 拓扑。
- 如果虚拟机的接口有 NUMA 关联性,请确保关联性只用于单个 NUMA 节点。您可以在任何 NUMA 节点上找到任何没有 NUMA 关联性的接口。
- 为 data plane 网络配置 NUMA 关联性,而不是管理网络。
- 隧道网络的 NUMA 关联性是一个全局设置,适用于所有虚拟机。
9.6. 在 NFVi 环境中配置服务质量(QoS)
有关配置 QoS 的详情,请参阅配置服务质量(QoS)策略。支持仅限于以下 QoS 规则类型:
-
SR-IOV 上的
最小带宽(如果供应商支持)。 -
SR-IOV 和 OVS-DPDK 出口接口的
带宽限制。
9.7. 使用 HCI 和 DPDK 部署 overcloud
您可以通过共同定位和配置计算和 Ceph 存储服务来优化资源使用,部署具有超融合节点的 NFV 基础架构。
有关超融合基础架构(HCI)的更多信息,请参阅: Hyper Converged Infrastructure Guide
先决条件
- Red Hat OpenStack Platform 16.1 或更高版本。
- Red Hat Ceph Storage 4 的最新版本。
-
最新版本的 ceph-ansible 4,由
rhceph-4-tools-for-rhel-8-x86_64-rpms存储库提供。
流程
在 undercloud 上安装
ceph-ansible。$ sudo yum install ceph-ansible -y
为 ComputeHCI 角色生成
roles_data.yaml文件。$ openstack overcloud roles generate -o ~/<templates>/roles_data.yaml Controller \ ComputeHCIOvsDpdk
-
使用
openstack flavor create和openstack flavor set命令创建和配置新类别。有关创建类别的更多信息,请参阅高级 Overcloud 自定义指南中的创建新角色。 使用您生成的自定义
roles_data.yaml文件部署 overcloud。# time openstack overcloud deploy --templates \ --timeout 360 \ -r ~/<templates>/roles_data.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/ceph-ansible/ceph-ansible.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/services-docker/neutron-ovs-dpdk.yaml \ -e ~/<templates>/<custom environment file>
9.7.1. NUMA 节点配置示例
为提高性能,将租户网络和 Ceph 对象服务守护进程(OSD)放在一个 NUMA-0 中,如 NUMA-0,以及 VNF 和另一个 NUMA 节点上的任何非 NFV 虚拟机,如 NUMA-1。
CPU 分配:
| NUMA-0 | NUMA-1 |
|---|---|
| Ceph OSD 数量 * 4 HT | 用于 VNF 和非NFV 虚拟机的客户机 vCPU |
| DPDK lcore - 2 HT | DPDK lcore - 2 HT |
| DPDK PMD - 2 HT | DPDK PMD - 2 HT |
CPU 分配示例:
| NUMA-0 | NUMA-1 | |
|---|---|---|
| Ceph OSD | 32,34,36,38,40,42,76,78,80,82,84,86 | |
| DPDK-lcore | 0,44 | 1,45 |
| DPDK-pmd | 2,46 | 3,47 |
| Nova | 5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87 |
9.7.2. ceph 配置文件示例
parameter_defaults:
CephPoolDefaultSize: 3
CephPoolDefaultPgNum: 64
CephPools:
- {"name": backups, "pg_num": 128, "pgp_num": 128, "application": "rbd"}
- {"name": volumes, "pg_num": 256, "pgp_num": 256, "application": "rbd"}
- {"name": vms, "pg_num": 64, "pgp_num": 64, "application": "rbd"}
- {"name": images, "pg_num": 32, "pgp_num": 32, "application": "rbd"}
CephConfigOverrides:
osd_recovery_op_priority: 3
osd_recovery_max_active: 3
osd_max_backfills: 1
CephAnsibleExtraConfig:
nb_retry_wait_osd_up: 60
delay_wait_osd_up: 20
is_hci: true
# 3 OSDs * 4 vCPUs per SSD = 12 vCPUs (list below not used for VNF)
ceph_osd_docker_cpuset_cpus: "32,34,36,38,40,42,76,78,80,82,84,86" # 1
# cpu_limit 0 means no limit as we are limiting CPUs with cpuset above
ceph_osd_docker_cpu_limit: 0 # 2
# numactl preferred to cross the numa boundary if we have to
# but try to only use memory from numa node0
# cpuset-mems would not let it cross numa boundary
# lots of memory so NUMA boundary crossing unlikely
ceph_osd_numactl_opts: "-N 0 --preferred=0" # 3
CephAnsibleDisksConfig:
osds_per_device: 1
osd_scenario: lvm
osd_objectstore: bluestore
devices:
- /dev/sda
- /dev/sdb
- /dev/sdc使用下列参数,为 ceph OSD 进程分配 CPU 资源。根据此超融合环境中的工作负载和硬件来调整值。
- 1
- ceph_osd_docker_cpuset_cpus:为每个 OSD 为 SSD 磁盘分配 4 个 CPU 线程,或为每个 OSD 为 HDD 磁盘分配 1 个 CPU。包括与 ceph 关联的 NUMA 节点的内核和同级线程列表,以及三个列表中的 CPU:
NovaComputeCpuDedicatedSet和OvsPmdCoreList。 - 2
- ceph_osd_docker_cpu_limit:将此值设置为
0,将 ceph OSD 固定到ceph_osd_docker_cpuset_cpus中的 CPU 列表。 - 3
- ceph_osd_numactl_opts:将此值设置为
首选跨 NUMA 操作,作为预ca。
9.7.3. DPDK 配置文件示例
parameter_defaults:
ComputeHCIParameters:
KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=240 intel_iommu=on iommu=pt # 1
isolcpus=2,46,3,47,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87"
TunedProfileName: "cpu-partitioning"
IsolCpusList: # 2
”2,46,3,47,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,49,51,
53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87"
VhostuserSocketGroup: hugetlbfs
OvsDpdkSocketMemory: "4096,4096" # 3
OvsDpdkMemoryChannels: "4"
OvsPmdCoreList: "2,46,3,47" # 4- 1
- KernelArgs:要计算
大页,从总内存中减去NovaReservedHostMemory参数的值。 - 2
- IsolCpusList:分配一组 CPU 内核,使用这个参数与主机进程隔离。将
OvsPmdCoreList参数的值添加到NovaComputeCpuDedicatedSet参数的值,以计算IsolCpusList参数的值。 - 3
- OvsDpdkSocketMemory:使用
OvsDpdkSocketMemory参数指定从每个 NUMA 节点的巨页池预先分配的内存量。有关计算 OVS-DPDK 参数的更多信息,请参阅: ovsdpdk 参数 - 4
- OvsPmdCoreList:指定用于带有这个参数的 DPDK 轮询模式驱动程序(PMD)的 CPU 核心。选择与 DPDK 接口本地 NUMA 节点关联的 CPU 核心。为每个 NUMA 节点分配 2 HT 同级线程,以计算
OvsPmdCoreList参数的值。
9.7.4. nova 配置文件示例
parameter_defaults:
ComputeHCIExtraConfig:
nova::cpu_allocation_ratio: 16 # 2
NovaReservedHugePages: # 1
- node:0,size:1GB,count:4
- node:1,size:1GB,count:4
NovaReservedHostMemory: 123904 # 2
# All left over cpus from NUMA-1
NovaComputeCpuDedicatedSet: # 3
['5','7','9','11','13','15','17','19','21','23','25','27','29','31','33','35','37','39','41','43','49','51','|
53','55','57','59','61','63','65','67','69','71','73','75','77','79','81','83','85','87- 1
- NovaReservedHugePages:使用
NovaReservedHugePages参数从巨页池中分配内存(以 MB 为单位)。它是与OvsDpdkSocketMemory参数的值相同的内存。 - 2
- NovaReservedHostMemory:使用
NovaReservedHostMemory参数为主机上的任务保留内存(以 MB 为单位)。使用以下指南计算您必须保留的内存量:- 每个 OSD 的 5 GB。
- 每个虚拟机的 0.5 GB 开销。
- 4GB 用于一般主机处理。请确定您分配足够内存,以防止由跨 NUMA OSD 操作导致的潜在性能下降。
- 3
- NovaComputeCpuDedicatedSet:列出
OvsPmdCoreList中未找到的 CPU,或使用NovaComputeCpuDedicatedSet参数列出Ceph_osd_docker_cpuset_cpus。CPU 必须与 DPDK NIC 位于同一 NUMA 节点上。
9.7.5. HCI-DPDK 部署的推荐配置
表 9.1. HCI 部署的可调整参数
| 块设备类型 | OSD、内存、每个设备的 vCPU |
|---|---|
| NVMe |
内存:每个 OSD 5GB |
| SSD |
内存:每个 OSD 5GB |
| HDD |
内存:每个 OSD 5GB |
为以下功能使用相同的 NUMA 节点:
- 磁盘控制器
- 存储网络
- 存储 CPU 和内存
为 DPDK 提供商网络的以下功能分配另一个 NUMA 节点:
- NIC
- PMD CPU
- 套接字内存
9.8. 将您的计算节点与 Timemaster 同步
该功能在此发行版本中作为技术预览提供,因此不享有红帽的全面支持。它只应用于测试,不应部署在生产环境中。有关技术预览功能的更多信息,请参阅覆盖范围详细信息。
使用时间协议在系统之间保持一致的时间戳。
Red Hat OpenStack Platform(RHOSP)包括对 Precision Time Protocol(PTP)和网络时间协议(NTP)的支持。您可以使用 NTP 在 millisecond 范围内同步网络中的时钟,您可以使用 PTP 将时钟同步到更高、微秒的准确性。PTP 用例的示例是虚拟无线电访问网络(vRAN),它包含多个 antennas,它提供更高的吞吐量,并具有更高的干扰风险。
timemaster 是一个使用 ptp4l 和 phc2sys 与 chronyd 或 ntpd 结合的程序,将系统时钟与 NTP 和 PTP 时间源同步。phc2sys 和 ptp4l 程序使用 Shared Memory Driver(SHM)引用时钟将 PTP 时间发送到 chronyd 或 ntpd,后者与时间源与系统时钟进行比较。
Red Hat Enterprise Linux(RHEL)内核中的 PTPv2 协议的实现是 linuxptp。linuxptp 软件包包含 PTP 边界时钟和普通时钟同步的 ptp4l 程序,以及用于硬件时间戳的 phc2sys 程序。如需有关 PTP 的更多信息,请参阅 Red Hat Enterprise Linux 系统管理员指南 中的 PTP 简介。
Chrony 是 NTP 协议的实现。Chrony 的两个主要组件是 chronyd (Chrony 守护进程),chronyc 守护进程是 Chrony 命令行界面。有关 Chrony 的更多信息,请参阅:在 Red Hat Enterprise Linux 系统管理员指南 中使用 chrony 配置 ntp。
以下镜像是 PTP 配置中数据包之旅概述。

以下镜像是 PTP 配置中 Compute 节点上的数据包之旅概述。

9.8.1. timemaster 硬件要求
请确定您有以下硬件功能:
- 您已使用硬件时间戳功能配置了 NIC。
- 您已将交换机配置为允许多播数据包。
- 您已将交换机配置为作为边界或透明时钟。
您可以使用 ethtool -T <device> 命令验证硬件时间戳。
$ ethtool -T p5p1
Time stamping parameters for p5p1:
Capabilities:
hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)
software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE)
hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE)
software-receive (SOF_TIMESTAMPING_RX_SOFTWARE)
software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 6
Hardware Transmit Timestamp Modes:
off (HWTSTAMP_TX_OFF)
on (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
none (HWTSTAMP_FILTER_NONE)
ptpv1-l4-sync (HWTSTAMP_FILTER_PTP_V1_L4_SYNC)
ptpv1-l4-delay-req (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ)
ptpv2-event (HWTSTAMP_FILTER_PTP_V2_EVENT)
您可以使用透明或边界时钟交换机,提高准确性和延迟。您可以为边界时钟使用 uplink 开关。边界时钟切换使用 PTPv2 标头上的 8 位 correctionField 更正延迟变体,并确保最终时钟的准确性更大。在透明时钟切换中,最终时钟将计算延迟变化,而不是 correctionField。
9.8.2. 配置 Timemaster
overcloud 节点上的时间同步的默认 Red Hat OpenStack Platform(RHOSP)服务是 OS::TripleO::Services::Timesync。
已知限制
- 为虚拟化控制器启用 NTP,并为裸机节点启用 PTP。
-
VirtIO 接口不兼容,因为
ptp4l需要兼容的 PTP 设备。 -
对带有 SR-IOV 的虚拟机使用物理功能(PF)。虚拟功能(VF)不会公开 PTP 所需的寄存器,虚拟机使用
kvm_ptp来计算时间。 - 具有多个源的高可用性(HA)接口以及多个网络路径不兼容。
流程
要在属于您选择的角色的节点上启用 Timemaster 服务,请将包含
OS::TripleO::Services::Timesync的行替换为 role_data.yaml 文件中的 roles::TripleO::Services::TimeMaster。#- OS::TripleO::Services::Timesync - OS::TripleO::Services::TimeMaster
为您使用的计算角色配置 heat 参数。
#Example ComputeSriovParameters: PTPInterfaces: ‘0:eno1,1:eno2’ PTPMessageTransport: ‘UDPv4’
在
openstack overcloud deploy命令中包含新环境文件,以及其他与您环境相关的环境文件:$ openstack overcloud deploy \ --templates \ … -e <existing_overcloud_environment_files> \ -e <new_environment_file1> \ -e <new_environment_file2> \ …
- 使用现有部署一部分的环境文件列表替换。<existing_overcloud_environment_files>
- 将 <new_environment_file> 替换为您要包含在 overcloud 部署过程中的新环境文件或文件。
验证
使用命令
phc_ctl,使用ptp4linux安装以查询 NIC 硬件时钟。# phc_ctl <clock_name> get # phc_ctl <clock_name> cmp
9.8.3. timemaster 配置示例
$ cat /etc/timemaster.conf # Configuration file for timemaster #[ntp_server ntp-server.local] #minpoll 4 #maxpoll 4 [ptp_domain 0] interfaces eno1 #ptp4l_setting network_transport l2 #delay 10e-6 [timemaster] ntp_program chronyd [chrony.conf] #include /etc/chrony.conf server clock.redhat.com iburst minpoll 6 maxpoll 10 [ntp.conf] includefile /etc/ntp.conf [ptp4l.conf] #includefile /etc/ptp4l.conf network_transport L2 [chronyd] path /usr/sbin/chronyd [ntpd] path /usr/sbin/ntpd options -u ntp:ntp -g [phc2sys] path /usr/sbin/phc2sys #options -w [ptp4l] path /usr/sbin/ptp4l #options -2 -i eno1
9.8.4. timemaster 操作示例
$ systemctl status timemaster
● timemaster.service - Synchronize system clock to NTP and PTP time sources
Loaded: loaded (/usr/lib/systemd/system/timemaster.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2020-08-25 19:10:18 UTC; 2min 6s ago
Main PID: 2573 (timemaster)
Tasks: 6 (limit: 357097)
Memory: 5.1M
CGroup: /system.slice/timemaster.service
├─2573 /usr/sbin/timemaster -f /etc/timemaster.conf
├─2577 /usr/sbin/chronyd -n -f /var/run/timemaster/chrony.conf
├─2582 /usr/sbin/ptp4l -l 5 -f /var/run/timemaster/ptp4l.0.conf -H -i eno1
├─2583 /usr/sbin/phc2sys -l 5 -a -r -R 1.00 -z /var/run/timemaster/ptp4l.0.socket -t [0:eno1] -n 0 -E ntpshm -M 0
├─2587 /usr/sbin/ptp4l -l 5 -f /var/run/timemaster/ptp4l.1.conf -H -i eno2
└─2588 /usr/sbin/phc2sys -l 5 -a -r -R 1.00 -z /var/run/timemaster/ptp4l.1.socket -t [0:eno2] -n 0 -E ntpshm -M 1
Aug 25 19:11:53 computesriov-0 ptp4l[2587]: [152.562] [0:eno2] selected local clock e4434b.fffe.4a0c24 as best master第 10 章 示例:使用 VXLAN 隧道配置 OVS-DPDK 和 SR-IOV
您可以使用 OVS-DPDK 和 SR-IOV 接口部署 Compute 节点。集群包括 ML2/OVS 和 VXLAN 隧道。
在角色配置文件中,如 roles_data.yaml,在生成 overcloud 角色时,注释掉或删除包含 OS::TripleO::Services::Tuned 的行。
ServicesDefault: # - OS::TripleO::Services::Tuned
当您注释掉或删除了 OS::TripleO::Services::Tuned 时,您可以设置 TunedProfileName 参数以符合您的要求,如 "cpu-partitioning "。如果您没有注释掉或删除第 OS::TripleO::Services::Tuned 行,则 TunedProfileName 参数获取 " throughput-performance" 的默认值,而不是您设置的任何其他值。
10.1. 配置角色数据
Red Hat OpenStack Platform 在 roles_data.yaml 文件中提供一组默认角色。您可以创建自己的 roles_data.yaml 文件来支持您需要的角色。
本例中创建了 ComputeOvsDpdkSriov 角色。有关在 Red Hat OpenStack Platform 中创建角色的信息,请参阅高级 Overcloud 自定义。有关此示例使用的特定角色的详情,请参阅 roles_data.yaml。
10.2. 配置 OVS-DPDK 参数
您必须确定您在 network-environment.yaml 文件中设置的 OVS-DPDK 参数的最佳值,以便为 OVS-DPDK 优化 OpenStack 网络。详情请参阅 使用工作流调整 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::ComputeOvsDpdkSriov::Net::SoftwareConfig: nic-configs/computeovsdpdksriov.yaml OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml在
parameter_defaults下,将隧道类型设置为vxlan,并将网络类型设置为vxlan,vlan:NeutronTunnelTypes: 'vxlan' NeutronNetworkType: 'vxlan,vlan'
在
parameters_defaults下,设置网桥映射:# The OVS logical->physical bridge mappings to use. NeutronBridgeMappings: - dpdk-mgmt:br-link0
在
parameter_defaults下,为ComputeOvsDpdkSriov角色设置特定于角色的参数:########################## # OVS DPDK configuration # ########################## ComputeOvsDpdkSriovParameters: 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" NovaComputeCpuDedicatedSet: ['4-19,24-39'] NovaReservedHostMemory: 4096 OvsDpdkSocketMemory: "3072,1024" OvsDpdkMemoryChannels: "4" OvsPmdCoreList: "2,22,3,23" NovaComputeCpuSharedSet: [0,20,1,21] NovaLibvirtRxQueueSize: 1024 NovaLibvirtTxQueueSize: 1024注意要防止客户机创建过程中故障,在每个 NUMA 节点上至少分配一个带有同级线程的 CPU。在示例中,
OvsPmdCoreList参数的值代表来自 NUMA 0 的核心 2 和 22,以及来自 NUMA 1 的内核 3 和 23。注意这些巨页由虚拟机消耗,由 OVS-DPDK 使用
OvsDpdkSocketMemory参数,如此过程所示。可用于虚拟机的巨页数量是引导参数,减去OvsDpdkSocketMemory。您还必须将
hw:mem_page_size=1GB添加到与 DPDK 实例关联的类别。注意OvsDpdkMemoryChannels是这个流程的必要设置。对于最佳操作,请确保使用适当的参数和值部署 DPDK。为 SR-IOV 配置特定于角色的参数:
NovaPCIPassthrough: - vendor_id: "8086" product_id: "1528" address: "0000:06:00.0" trusted: "true" physical_network: "sriov-1" - vendor_id: "8086" product_id: "1528" address: "0000:06:00.1" trusted: "true" physical_network: "sriov-2"
10.3. 配置控制器节点
为隔离的网络创建 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: nic2 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 网桥,以访问
neutron-dhcp-agent和neutron-metadata-agent服务。- type: ovs_bridge name: br-link0 use_dhcp: false mtu: 9000 members: - type: interface name: nic3 mtu: 9000 - type: vlan vlan_id: get_param: TenantNetworkVlanID mtu: 9000 addresses: - ip_netmask: get_param: TenantIpSubnet
10.4. 为 DPDK 和 SR-IOV 配置 Compute 节点
从默认 compute.yaml 文件创建 computeovsdpdksriov.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: nic3 primary: true - type: interface name: nic4将 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: nic7 - type: ovs_dpdk_port name: dpdk1 members: - type: interface name: nic8注意要包含多个 DPDK 设备,请为您要添加的每个 DPDK 设备重复
类型代码部分。注意使用 OVS-DPDK 时,同一 Compute 节点上的所有网桥都必须是
ovs_user_bridge类型。Red Hat OpenStack Platform 不支持同一节点上的ovs_bridge和ovs_user_bridge。
10.5. 部署 overcloud
-
运行
overcloud_deploy.sh脚本:
第 11 章 使用 NFV 升级红帽 OpenStack 平台
有关升级配置了 OVS-DPDK 的 Red Hat OpenStack Platform(RHOSP)的更多信息,请参阅 Framework for Upgrades (13 to 16.2) 指南中的 Preparing network functions virtualization (NFV) 部分。
第 12 章 NFV 性能
Red Hat OpenStack Platform director 配置 Compute 节点以强制资源分区和微调,以实现客户机虚拟网络功能(VNF)的线率性能。NFV 用例中的关键性能因素包括吞吐量、延迟和迭代。
您可以使用数据平面开发套件(DPDK)加速虚拟机,启用物理 NIC 和虚拟机之间的高性能数据包切换。OVS 2.10 嵌入了对 DPDK 17 的支持,包括对 vhost-user multiqueue 的支持,允许可扩展性能。OVS-DPDK 为虚拟客户机 VNF 提供线级性能。
单根 I/O 虚拟化(SR-IOV)网络可提高性能,包括提高了特定网络和虚拟机的吞吐量。
性能调优的其他重要功能包括巨页、NUMA 对齐、主机隔离和 CPU 固定。VNF 类别需要大页面和仿真程序线程隔离来提高性能。主机隔离和 CPU 固定提高了 NFV 性能,并防止不必要的数据包丢失。
有关 CPU 和 NUMA 拓扑的高级介绍,请参阅: NFV 性能注意事项 和配置 仿真器线程。
第 13 章 查找更多信息
下表包括了其他红帽文档以用于参考:
Red Hat OpenStack Platform 文档套件可在以下中找到: Red Hat OpenStack Platform 文档套件
表 13.1. 可用文档列表
| 组件 | 参考 |
|---|---|
| Red Hat Enterprise Linux | Red Hat OpenStack Platform 支持 Red Hat Enterprise Linux 8.0。有关安装 Red Hat Enterprise Linux 的详情,请参考相应的安装指南,网址为: Red Hat Enterprise Linux 文档套件。 |
| Red Hat OpenStack Platform | 要安装 OpenStack 组件及其依赖项,请使用 Red Hat OpenStack Platform director。director 使用基本的 OpenStack 安装作为 undercloud,在最终 overcloud 中安装、配置和管理 OpenStack 节点。除了部署 overcloud 所需的环境外,您还确保有一台额外的主机来安装 undercloud。具体步骤请查看 Red Hat OpenStack Platform Director 安装和使用。 有关使用 Red Hat OpenStack Platform director 配置 Red Hat OpenStack Platform 企业环境的高级功能的详情,如网络隔离、存储配置、SSL 通信和常规配置方法,请参阅高级 Overcloud 自定义。 |
| NFV 文档 | 有关使用单一根 I/O 虚拟化(SR-IOV)和带有 Data Plane Development Kit(OVS-DPDK)的 Open vSwitch 规划和配置 Red Hat OpenStack Platform 部署的详情,请参阅 网络功能虚拟化规划和配置指南。 |
附录 A. DPDK SRIOV YAML 文件示例
本节提供了示例 yaml 文件,作为在同一计算节点上添加单一根 I/O 虚拟化(SR-IOV)和数据平面开发套件(DPDK)接口的参考。
这些模板来自完全配置的环境,包括与 NFV 不相关的参数,它们可能不适用于您的部署。有关组件支持级别列表,请参阅红帽知识库解决方案 组件支持 Graduation。
A.1. VXLAN DPDK SRIOV YAML 文件示例
A.1.1. roles_data.yaml
-
运行
openstack overcloud roles generate命令来生成roles_data.yaml文件。根据您要在环境中部署的角色,如Controller、ComputeSriov、ComputeOvsDpdkRT、ComputeOvsDpdkRT、ComputeOvsDpdkSrv 或其他角色。例如,要生成roles_data.yaml文件,其中包含 rolesController和ComputeHCIOvsDpdkSriov,请运行以下命令:
$ openstack overcloud roles generate -o roles_data.yaml Controller ComputeHCIOvsDpdkSriov
###############################################################################
# File generated by TripleO
###############################################################################
###############################################################################
# Role: Controller #
###############################################################################
- name: Controller
description: |
Controller role that has all the controller services loaded and handles
Database, Messaging and Network functions.
CountDefault: 1
tags:
- primary
- controller
networks:
External:
subnet: external_subnet
InternalApi:
subnet: internal_api_subnet
Storage:
subnet: storage_subnet
StorageMgmt:
subnet: storage_mgmt_subnet
Tenant:
subnet: tenant_subnet
# For systems with both IPv4 and IPv6, you may specify a gateway network for
# each, such as ['ControlPlane', 'External']
default_route_networks: ['External']
HostnameFormatDefault: '%stackname%-controller-%index%'
# Deprecated & backward-compatible values (FIXME: Make parameters consistent)
# Set uses_deprecated_params to True if any deprecated params are used.
uses_deprecated_params: True
deprecated_param_extraconfig: 'controllerExtraConfig'
deprecated_param_flavor: 'OvercloudControlFlavor'
deprecated_param_image: 'controllerImage'
deprecated_nic_config_name: 'controller.yaml'
update_serial: 1
ServicesDefault:
- OS::TripleO::Services::Aide
- OS::TripleO::Services::AodhApi
- OS::TripleO::Services::AodhEvaluator
- OS::TripleO::Services::AodhListener
- OS::TripleO::Services::AodhNotifier
- OS::TripleO::Services::AuditD
- OS::TripleO::Services::BarbicanApi
- OS::TripleO::Services::BarbicanBackendSimpleCrypto
- OS::TripleO::Services::BarbicanBackendDogtag
- OS::TripleO::Services::BarbicanBackendKmip
- OS::TripleO::Services::BarbicanBackendPkcs11Crypto
- OS::TripleO::Services::BootParams
- OS::TripleO::Services::CACerts
- OS::TripleO::Services::CeilometerAgentCentral
- OS::TripleO::Services::CeilometerAgentNotification
- OS::TripleO::Services::CephExternal
- OS::TripleO::Services::CephGrafana
- OS::TripleO::Services::CephMds
- OS::TripleO::Services::CephMgr
- OS::TripleO::Services::CephMon
- OS::TripleO::Services::CephRbdMirror
- OS::TripleO::Services::CephRgw
- OS::TripleO::Services::CertmongerUser
- OS::TripleO::Services::CinderApi
- OS::TripleO::Services::CinderBackendDellPs
- OS::TripleO::Services::CinderBackendDellSc
- OS::TripleO::Services::CinderBackendDellEMCPowermax
- OS::TripleO::Services::CinderBackendDellEMCPowerStore
- OS::TripleO::Services::CinderBackendDellEMCSc
- OS::TripleO::Services::CinderBackendDellEMCUnity
- OS::TripleO::Services::CinderBackendDellEMCVMAXISCSI
- OS::TripleO::Services::CinderBackendDellEMCVNX
- OS::TripleO::Services::CinderBackendDellEMCVxFlexOS
- OS::TripleO::Services::CinderBackendDellEMCXtremio
- OS::TripleO::Services::CinderBackendDellEMCXTREMIOISCSI
- OS::TripleO::Services::CinderBackendNetApp
- OS::TripleO::Services::CinderBackendPure
- OS::TripleO::Services::CinderBackendScaleIO
- OS::TripleO::Services::CinderBackendVRTSHyperScale
- OS::TripleO::Services::CinderBackendNVMeOF
- OS::TripleO::Services::CinderBackup
- OS::TripleO::Services::CinderHPELeftHandISCSI
- OS::TripleO::Services::CinderScheduler
- OS::TripleO::Services::CinderVolume
- OS::TripleO::Services::Clustercheck
- OS::TripleO::Services::Collectd
- OS::TripleO::Services::ContainerImagePrepare
- OS::TripleO::Services::DesignateApi
- OS::TripleO::Services::DesignateCentral
- OS::TripleO::Services::DesignateProducer
- OS::TripleO::Services::DesignateWorker
- OS::TripleO::Services::DesignateMDNS
- OS::TripleO::Services::DesignateSink
- OS::TripleO::Services::Docker
- OS::TripleO::Services::Ec2Api
- OS::TripleO::Services::Etcd
- OS::TripleO::Services::ExternalSwiftProxy
- OS::TripleO::Services::GlanceApi
- OS::TripleO::Services::GnocchiApi
- OS::TripleO::Services::GnocchiMetricd
- OS::TripleO::Services::GnocchiStatsd
- OS::TripleO::Services::HAproxy
- OS::TripleO::Services::HeatApi
- OS::TripleO::Services::HeatApiCloudwatch
- OS::TripleO::Services::HeatApiCfn
- OS::TripleO::Services::HeatEngine
- OS::TripleO::Services::Horizon
- OS::TripleO::Services::IpaClient
- OS::TripleO::Services::Ipsec
- OS::TripleO::Services::IronicApi
- OS::TripleO::Services::IronicConductor
- OS::TripleO::Services::IronicInspector
- OS::TripleO::Services::IronicPxe
- OS::TripleO::Services::IronicNeutronAgent
- OS::TripleO::Services::Iscsid
- OS::TripleO::Services::Keepalived
- OS::TripleO::Services::Kernel
- OS::TripleO::Services::Keystone
- OS::TripleO::Services::LoginDefs
- OS::TripleO::Services::ManilaApi
- OS::TripleO::Services::ManilaBackendCephFs
- OS::TripleO::Services::ManilaBackendIsilon
- OS::TripleO::Services::ManilaBackendNetapp
- OS::TripleO::Services::ManilaBackendUnity
- OS::TripleO::Services::ManilaBackendVNX
- OS::TripleO::Services::ManilaBackendVMAX
- OS::TripleO::Services::ManilaScheduler
- OS::TripleO::Services::ManilaShare
- OS::TripleO::Services::Memcached
- OS::TripleO::Services::MetricsQdr
- OS::TripleO::Services::MistralApi
- OS::TripleO::Services::MistralEngine
- OS::TripleO::Services::MistralExecutor
- OS::TripleO::Services::MistralEventEngine
- OS::TripleO::Services::Multipathd
- OS::TripleO::Services::MySQL
- OS::TripleO::Services::MySQLClient
- OS::TripleO::Services::NeutronApi
- OS::TripleO::Services::NeutronBgpVpnApi
- OS::TripleO::Services::NeutronSfcApi
- OS::TripleO::Services::NeutronCorePlugin
- OS::TripleO::Services::NeutronDhcpAgent
- OS::TripleO::Services::NeutronL2gwAgent
- OS::TripleO::Services::NeutronL2gwApi
- OS::TripleO::Services::NeutronL3Agent
- OS::TripleO::Services::NeutronLinuxbridgeAgent
- OS::TripleO::Services::NeutronMetadataAgent
- OS::TripleO::Services::NeutronML2FujitsuCfab
- OS::TripleO::Services::NeutronML2FujitsuFossw
- OS::TripleO::Services::NeutronOvsAgent
- OS::TripleO::Services::NeutronVppAgent
- OS::TripleO::Services::NeutronAgentsIBConfig
- OS::TripleO::Services::NovaApi
- OS::TripleO::Services::NovaConductor
- OS::TripleO::Services::NovaIronic
- OS::TripleO::Services::NovaMetadata
- OS::TripleO::Services::NovaScheduler
- OS::TripleO::Services::NovaVncProxy
- OS::TripleO::Services::ContainersLogrotateCrond
- OS::TripleO::Services::OctaviaApi
- OS::TripleO::Services::OctaviaDeploymentConfig
- OS::TripleO::Services::OctaviaHealthManager
- OS::TripleO::Services::OctaviaHousekeeping
- OS::TripleO::Services::OctaviaWorker
- OS::TripleO::Services::OpenStackClients
- OS::TripleO::Services::OVNDBs
- OS::TripleO::Services::OVNController
- OS::TripleO::Services::Pacemaker
- OS::TripleO::Services::PankoApi
- OS::TripleO::Services::PlacementApi
- OS::TripleO::Services::OsloMessagingRpc
- OS::TripleO::Services::OsloMessagingNotify
- OS::TripleO::Services::Podman
- OS::TripleO::Services::Rear
- OS::TripleO::Services::Redis
- OS::TripleO::Services::Rhsm
- OS::TripleO::Services::Rsyslog
- OS::TripleO::Services::RsyslogSidecar
- OS::TripleO::Services::SaharaApi
- OS::TripleO::Services::SaharaEngine
- OS::TripleO::Services::Securetty
- OS::TripleO::Services::Snmp
- OS::TripleO::Services::Sshd
- OS::TripleO::Services::SwiftProxy
- OS::TripleO::Services::SwiftDispersion
- OS::TripleO::Services::SwiftRingBuilder
- OS::TripleO::Services::SwiftStorage
- OS::TripleO::Services::Timesync
- OS::TripleO::Services::Timezone
- OS::TripleO::Services::TripleoFirewall
- OS::TripleO::Services::TripleoPackages
- OS::TripleO::Services::Tuned
- OS::TripleO::Services::Vpp
- OS::TripleO::Services::Zaqar
###############################################################################
# Role: ComputeHCIOvsDpdkSriov #
###############################################################################
- name: ComputeHCIOvsDpdkSriov
description: |
ComputeOvsDpdkSriov Node role hosting Ceph OSD too
networks:
InternalApi:
subnet: internal_api_subnet
Tenant:
subnet: tenant_subnet
Storage:
subnet: storage_subnet
StorageMgmt:
subnet: storage_mgmt_subnet
# CephOSD present so serial has to be 1
update_serial: 1
RoleParametersDefault:
TunedProfileName: "cpu-partitioning"
VhostuserSocketGroup: "hugetlbfs"
NovaLibvirtRxQueueSize: 1024
NovaLibvirtTxQueueSize: 1024
ServicesDefault:
- OS::TripleO::Services::Aide
- OS::TripleO::Services::AuditD
- OS::TripleO::Services::BootParams
- OS::TripleO::Services::CACerts
- OS::TripleO::Services::CephClient
- OS::TripleO::Services::CephExternal
- OS::TripleO::Services::CephOSD
- 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::IpaClient
- OS::TripleO::Services::Ipsec
- OS::TripleO::Services::Iscsid
- OS::TripleO::Services::Kernel
- OS::TripleO::Services::LoginDefs
- OS::TripleO::Services::MetricsQdr
- OS::TripleO::Services::Multipathd
- OS::TripleO::Services::MySQLClient
- OS::TripleO::Services::NeutronBgpVpnBagpipe
- OS::TripleO::Services::NeutronSriovAgent
- OS::TripleO::Services::NeutronSriovHostConfig
- OS::TripleO::Services::NovaAZConfig
- OS::TripleO::Services::NovaCompute
- OS::TripleO::Services::NovaLibvirt
- OS::TripleO::Services::NovaLibvirtGuests
- OS::TripleO::Services::NovaMigrationTarget
- OS::TripleO::Services::OvsDpdkNetcontrold
- OS::TripleO::Services::ContainersLogrotateCrond
- OS::TripleO::Services::Podman
- OS::TripleO::Services::Rear
- OS::TripleO::Services::Rhsm
- OS::TripleO::Services::Rsyslog
- OS::TripleO::Services::RsyslogSidecar
- OS::TripleO::Services::Securetty
- OS::TripleO::Services::Snmp
- OS::TripleO::Services::Sshd
- OS::TripleO::Services::Timesync
- OS::TripleO::Services::Timezone
- OS::TripleO::Services::TripleoFirewall
- OS::TripleO::Services::TripleoPackages
- OS::TripleO::Services::OVNController
- OS::TripleO::Services::OVNMetadataAgent
- OS::TripleO::Services::PtpA.1.2. network-environment-overrides.yaml
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
# Customize all these values to match the local environment
parameter_defaults:
# The tunnel type for the project network (vxlan or gre). Set to '' to disable tunneling.
NeutronTunnelTypes: 'vxlan'
# The project network type for Neutron (vlan or vxlan).
NeutronNetworkType: 'vxlan,vlan'
# The OVS logical->physical bridge mappings to use.
NeutronBridgeMappings: 'access:br-access,dpdk-mgmt:br-link0'
# The Neutron ML2 and OpenVSwitch vlan mapping range to support.
NeutronNetworkVLANRanges: 'access:423:423,dpdk-mgmt:134:137,sriov-1:138:139,sriov-2:138:139'
# Define the DNS servers (maximum 2) for the overcloud nodes
DnsServers: ["10.46.0.31","10.46.0.32"]
# Nova flavor to use.
OvercloudControllerFlavor: controller
OvercloudComputeOvsDpdkSriovFlavor: computeovsdpdksriov
# Number of nodes to deploy.
ControllerCount: 3
ComputeOvsDpdkSriovCount: 2
# NTP server configuration.
NtpServer: ['clock.redhat.com']
# MTU global configuration
NeutronGlobalPhysnetMtu: 9000
# Configure the classname of the firewall driver to use for implementing security groups.
NeutronOVSFirewallDriver: openvswitch
SshServerOptions:
UseDns: 'no'
# Enable log level DEBUG for supported components
Debug: True
ControllerHostnameFormat: 'controller-%index%'
ControllerSchedulerHints:
'capabilities:node': 'controller-%index%'
ComputeOvsDpdkSriovHostnameFormat: 'computeovsdpdksriov-%index%'
ComputeOvsDpdkSriovSchedulerHints:
'capabilities:node': 'computeovsdpdksriov-%index%'
# From Rocky live migration with NumaTopologyFilter disabled by default
# https://bugs.launchpad.net/nova/+bug/1289064
NovaEnableNUMALiveMigration: true
##########################
# OVS DPDK configuration #
##########################
# In the future, most parameters will be derived by mistral plan.
# Currently mistral derive parameters is blocked:
# https://bugzilla.redhat.com/show_bug.cgi?id=1777841
# https://bugzilla.redhat.com/show_bug.cgi?id=1777844
ComputeOvsDpdkSriovParameters:
KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=64 iommu=pt intel_iommu=on isolcpus=2-19,22-39"
TunedProfileName: "cpu-partitioning"
IsolCpusList: "2-19,22-39"
NovaComputeCpuDedicatedSet: ['2-10,12-17,19,22-30,32-37,39']
NovaReservedHostMemory: 4096
OvsDpdkSocketMemory: "1024,3072"
OvsDpdkMemoryChannels: "4"
OvsPmdCoreList: "11,18,31,38"
NovaComputeCpuSharedSet: [0,20,1,21]
# When using NIC partitioning on SR-IOV enabled setups, 'derive_pci_passthrough_whitelist.py'
# script will be executed which will override NovaPCIPassthrough.
# No option to disable as of now - https://bugzilla.redhat.com/show_bug.cgi?id=1774403
NovaPCIPassthrough:
- address: "0000:19:0e.3"
trusted: "true"
physical_network: "sriov1"
- address: "0000:19:0e.0"
trusted: "true"
physical_network: "sriov-2"
# NUMA aware vswitch
NeutronPhysnetNUMANodesMapping: {dpdk-mgmt: [0]}
NeutronTunnelNUMANodes: [0]
NeutronPhysicalDevMappings:
- sriov1:enp6s0f2
- sriov2:enp6s0f3
############################
# Scheduler configuration #
############################
NovaSchedulerDefaultFilters:
- "AvailabilityZoneFilter"
- "ComputeFilter"
- "ComputeCapabilitiesFilter"
- "ImagePropertiesFilter"
- "ServerGroupAntiAffinityFilter"
- "ServerGroupAffinityFilter"
- "PciPassthroughFilter"
- "NUMATopologyFilter"
- "AggregateInstanceExtraSpecsFilter"A.1.3. controller.yaml
heat_template_version: rocky
description: >
Software Config to drive os-net-config to configure VLANs for the controller role.
parameters:
ControlPlaneIp:
default: ''
description: IP address/subnet on the ctlplane network
type: string
ExternalIpSubnet:
default: ''
description: IP address/subnet on the external network
type: string
ExternalInterfaceRoutes:
default: []
description: >
Routes for the external network traffic. JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}] Unless
the default is changed, the parameter is automatically resolved from the subnet host_routes attribute.
type: json
InternalApiIpSubnet:
default: ''
description: IP address/subnet on the internal_api network
type: string
InternalApiInterfaceRoutes:
default: []
description: >
Routes for the internal_api network traffic. JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}] Unless
the default is changed, the parameter is automatically resolved from the subnet host_routes attribute.
type: json
StorageIpSubnet:
default: ''
description: IP address/subnet on the storage network
type: string
StorageInterfaceRoutes:
default: []
description: >
Routes for the storage network traffic. JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}] Unless
the default is changed, the parameter is automatically resolved from the subnet host_routes attribute.
type: json
StorageMgmtIpSubnet:
default: ''
description: IP address/subnet on the storage_mgmt network
type: string
StorageMgmtInterfaceRoutes:
default: []
description: >
Routes for the storage_mgmt network traffic. JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}] Unless
the default is changed, the parameter is automatically resolved from the subnet host_routes attribute.
type: json
TenantIpSubnet:
default: ''
description: IP address/subnet on the tenant network
type: string
TenantInterfaceRoutes:
default: []
description: >
Routes for the tenant network traffic. JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}] Unless
the default is changed, the parameter is automatically resolved from the subnet host_routes attribute.
type: json
ManagementIpSubnet: # Only populated when including environments/network-management.yaml
default: ''
description: IP address/subnet on the management network
type: string
ManagementInterfaceRoutes:
default: []
description: >
Routes for the management network traffic. JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}] Unless
the default is changed, the parameter is automatically resolved from the subnet host_routes attribute.
type: json
BondInterfaceOvsOptions:
default: bond_mode=active-backup
description: >-
The ovs_options string for the bond interface. Set things like lacp=active and/or bond_mode=balance-slb using this option.
type: string
ExternalNetworkVlanID:
default: 10
description: Vlan ID for the external network traffic.
type: number
InternalApiNetworkVlanID:
default: 20
description: Vlan ID for the internal_api network traffic.
type: number
StorageNetworkVlanID:
default: 30
description: Vlan ID for the storage network traffic.
type: number
StorageMgmtNetworkVlanID:
default: 40
description: Vlan ID for the storage_mgmt network traffic.
type: number
TenantNetworkVlanID:
default: 50
description: Vlan ID for the tenant network traffic.
type: number
ManagementNetworkVlanID:
default: 60
description: Vlan ID for the management network traffic.
type: number
ExternalInterfaceDefaultRoute:
default: 10.0.0.1
description: default route for the external network
type: string
ControlPlaneSubnetCidr:
default: ''
description: >
The subnet CIDR of the control plane network. (The parameter is automatically resolved from the ctlplane subnet's cidr
attribute.)
type: string
ControlPlaneDefaultRoute:
default: ''
description: >-
The default route of the control plane network. (The parameter is automatically resolved from the ctlplane subnet's
gateway_ip attribute.)
type: string
DnsServers: # Override this via parameter_defaults
default: []
description: >
DNS servers to use for the Overcloud (2 max for some implementations). If not set the nameservers configured in the
ctlplane subnet's dns_nameservers attribute will be used.
type: comma_delimited_list
EC2MetadataIp:
default: ''
description: >-
The IP address of the EC2 metadata server. (The parameter is automatically resolved from the ctlplane subnet's host_routes
attribute.)
type: string
ControlPlaneStaticRoutes:
default: []
description: >
Routes for the ctlplane network traffic. JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}] Unless
the default is changed, the parameter is automatically resolved from the subnet host_routes attribute.
type: json
ControlPlaneMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the network. (The parameter is automatically resolved from the ctlplane network's mtu attribute.)
type: number
StorageMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the Storage network.
type: number
StorageMgmtMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the StorageMgmt network.
type: number
InternalApiMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the InternalApi network.
type: number
TenantMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the Tenant network.
type: number
ExternalMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the External network.
type: number
resources:
OsNetConfigImpl:
type: OS::Heat::SoftwareConfig
properties:
group: script
config:
str_replace:
template:
get_file: /usr/share/openstack-tripleo-heat-templates/network/scripts/run-os-net-config.sh
params:
$network_config:
network_config:
- type: interface
name: nic1
use_dhcp: false
addresses:
- ip_netmask:
list_join:
- /
- - get_param: ControlPlaneIp
- get_param: ControlPlaneSubnetCidr
routes:
- ip_netmask: 169.254.169.254/32
next_hop:
get_param: EC2MetadataIp
- type: ovs_bridge
name: br-link0
use_dhcp: false
mtu: 9000
members:
- type: interface
name: nic2
mtu: 9000
- type: vlan
vlan_id:
get_param: TenantNetworkVlanID
mtu: 9000
addresses:
- ip_netmask:
get_param: TenantIpSubnet
- type: vlan
vlan_id:
get_param: InternalApiNetworkVlanID
addresses:
- ip_netmask:
get_param: InternalApiIpSubnet
- type: vlan
vlan_id:
get_param: StorageNetworkVlanID
addresses:
- ip_netmask:
get_param: StorageIpSubnet
- type: vlan
vlan_id:
get_param: StorageMgmtNetworkVlanID
addresses:
- ip_netmask:
get_param: StorageMgmtIpSubnet
- type: ovs_bridge
name: br-access
use_dhcp: false
mtu: 9000
members:
- type: interface
name: nic3
mtu: 9000
- type: vlan
vlan_id:
get_param: ExternalNetworkVlanID
mtu: 9000
addresses:
- ip_netmask:
get_param: ExternalIpSubnet
routes:
- default: true
next_hop:
get_param: ExternalInterfaceDefaultRoute
outputs:
OS::stack_id:
description: The OsNetConfigImpl resource.
value:
get_resource: OsNetConfigImplA.1.4. compute-ovs-dpdk.yaml
heat_template_version: rocky
description: >
Software Config to drive os-net-config to configure VLANs for the
compute role.
parameters:
ControlPlaneIp:
default: ''
description: IP address/subnet on the ctlplane network
type: string
ExternalIpSubnet:
default: ''
description: IP address/subnet on the external network
type: string
ExternalInterfaceRoutes:
default: []
description: >
Routes for the external network traffic.
JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}]
Unless the default is changed, the parameter is automatically resolved
from the subnet host_routes attribute.
type: json
InternalApiIpSubnet:
default: ''
description: IP address/subnet on the internal_api network
type: string
InternalApiInterfaceRoutes:
default: []
description: >
Routes for the internal_api network traffic.
JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}]
Unless the default is changed, the parameter is automatically resolved
from the subnet host_routes attribute.
type: json
StorageIpSubnet:
default: ''
description: IP address/subnet on the storage network
type: string
StorageInterfaceRoutes:
default: []
description: >
Routes for the storage network traffic.
JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}]
Unless the default is changed, the parameter is automatically resolved
from the subnet host_routes attribute.
type: json
StorageMgmtIpSubnet:
default: ''
description: IP address/subnet on the storage_mgmt network
type: string
StorageMgmtInterfaceRoutes:
default: []
description: >
Routes for the storage_mgmt network traffic.
JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}]
Unless the default is changed, the parameter is automatically resolved
from the subnet host_routes attribute.
type: json
TenantIpSubnet:
default: ''
description: IP address/subnet on the tenant network
type: string
TenantInterfaceRoutes:
default: []
description: >
Routes for the tenant network traffic.
JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}]
Unless the default is changed, the parameter is automatically resolved
from the subnet host_routes attribute.
type: json
ManagementIpSubnet: # Only populated when including environments/network-management.yaml
default: ''
description: IP address/subnet on the management network
type: string
ManagementInterfaceRoutes:
default: []
description: >
Routes for the management network traffic.
JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}]
Unless the default is changed, the parameter is automatically resolved
from the subnet host_routes attribute.
type: json
BondInterfaceOvsOptions:
default: 'bond_mode=active-backup'
description: The ovs_options string for the bond interface. Set things like
lacp=active and/or bond_mode=balance-slb using this option.
type: string
ExternalNetworkVlanID:
default: 10
description: Vlan ID for the external network traffic.
type: number
InternalApiNetworkVlanID:
default: 20
description: Vlan ID for the internal_api network traffic.
type: number
StorageNetworkVlanID:
default: 30
description: Vlan ID for the storage network traffic.
type: number
StorageMgmtNetworkVlanID:
default: 40
description: Vlan ID for the storage_mgmt network traffic.
type: number
TenantNetworkVlanID:
default: 50
description: Vlan ID for the tenant network traffic.
type: number
ManagementNetworkVlanID:
default: 60
description: Vlan ID for the management network traffic.
type: number
ExternalInterfaceDefaultRoute:
default: '10.0.0.1'
description: default route for the external network
type: string
ControlPlaneSubnetCidr:
default: ''
description: >
The subnet CIDR of the control plane network. (The parameter is
automatically resolved from the ctlplane subnet's cidr attribute.)
type: string
ControlPlaneDefaultRoute:
default: ''
description: The default route of the control plane network. (The parameter
is automatically resolved from the ctlplane subnet's gateway_ip attribute.)
type: string
DnsServers: # Override this via parameter_defaults
default: []
description: >
DNS servers to use for the Overcloud (2 max for some implementations).
If not set the nameservers configured in the ctlplane subnet's
dns_nameservers attribute will be used.
type: comma_delimited_list
EC2MetadataIp:
default: ''
description: The IP address of the EC2 metadata server. (The parameter
is automatically resolved from the ctlplane subnet's host_routes attribute.)
type: string
ControlPlaneStaticRoutes:
default: []
description: >
Routes for the ctlplane network traffic. JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}] Unless
the default is changed, the parameter is automatically resolved from the subnet host_routes attribute.
type: json
ControlPlaneMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the network. (The parameter is automatically resolved from the ctlplane network's mtu attribute.)
type: number
StorageMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the Storage network.
type: number
InternalApiMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the InternalApi network.
type: number
TenantMtu:
default: 1500
description: >-
The maximum transmission unit (MTU) size(in bytes) that is guaranteed to pass through the data path of the segments
in the Tenant network.
type: number
resources:
OsNetConfigImpl:
type: OS::Heat::SoftwareConfig
properties:
group: script
config:
str_replace:
template:
get_file: /usr/share/openstack-tripleo-heat-templates/network/scripts/run-os-net-config.sh
params:
$network_config:
network_config:
- type: interface
name: nic1
use_dhcp: false
defroute: false
- type: interface
name: nic2
use_dhcp: false
addresses:
- ip_netmask:
list_join:
- /
- - get_param: ControlPlaneIp
- get_param: ControlPlaneSubnetCidr
routes:
- ip_netmask: 169.254.169.254/32
next_hop:
get_param: EC2MetadataIp
- default: true
next_hop:
get_param: ControlPlaneDefaultRoute
- 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
- 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: 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: nic7
- type: ovs_dpdk_port
name: dpdk1
members:
- type: interface
name: nic8
- type: sriov_pf
name: nic9
mtu: 9000
numvfs: 10
use_dhcp: false
defroute: false
nm_controlled: true
hotplug: true
promisc: false
- type: sriov_pf
name: nic10
mtu: 9000
numvfs: 10
use_dhcp: false
defroute: false
nm_controlled: true
hotplug: true
promisc: false
outputs:
OS::stack_id:
description: The OsNetConfigImpl resource.
value:
get_resource: OsNetConfigImplA.1.5. overcloud_deploy.sh
#!/bin/bash THT_PATH='/home/stack/ospd-16-vxlan-dpdk-sriov-ctlplane-dataplane-bonding-hybrid' openstack overcloud deploy \ --templates \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovs.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovs-dpdk.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-sriov.yaml \ -e /home/stack/containers-prepare-parameter.yaml \ -r $THT_PATH/roles_data.yaml \ -e $THT_PATH/network-environment-overrides.yaml \ -n $THT_PATH/network-data.yaml