QSG: ASAP² 技术在 Red Hat OpenStack Platform 13 上的性能评估
创建于 2019 年 7 月 11 日。本快速入门指南演示了一种测试高流量下 VLAN/VXLAN 卸载能力的方法。
文档目录
创建于 2019 年 7 月 11 日
简介
本 QSG(快速入门指南)将演示一种测试高流量下 VLAN/VXLAN 卸载能力的方法。
ASAP2 技术可将数据包处理操作从 OpenVswitch 卸载到 ConnectX 网卡硬件。ASAP2 有多种类型,本文将演示 ASAP2 Direct 卸载能力。ASAP2 Direct 技术已集成到上游 Openstack 社区中,并提供了适用于智能网卡的通用卸载 API。
注意:请点击此处观看本文的视频演示 -> YouTube 教程视频
参考资料
- 如何构建支持 ASAP2 的 Openstack 环境:Red Hat OpenStack Platform 13 基于 Mellanox 100Gb 以太网解决方案的参考部署指南(含 ASAP² OVS HW 加速,适用于 VXLAN 流量)
- TRrex 快速入门 - 使用 ConnectX-4 或 ConnectX-5
ASAP2 Direct 技术概述
ASAP2 技术可将数据包处理操作从 OpenVswitch 卸载到 ConnectX eSwitch 转发平面的硬件,同时保持 SDN 控制平面不变。
在此部署模型中,虚拟机通过单根输入/输出虚拟化(SR-IOV)虚拟功能(VF)直接访问 Nvidia 的 ConnectX-5 和 ConnectX-4 网卡硬件,同时将 OpenVswitch(OVS)转发平面卸载到硬件 e-Switch 转发平面。
这种组合旨在在虚拟化环境中实现最高的网络 I/O 性能。
基准测试表明,在配备 25Gb 接口的服务器上,由 ASAP2 Direct 加速的 OVS 可实现单流和数千流下每秒 3300 万数据包(mpps)的性能,充分利用 25Gb 带宽。

理解代表端口
此图中的端口 R1 和 R2 是代表 VF1 和 VF2 的代表端口。代表端口是 eSwitch 端口的 netdev 模型。这些端口的行为类似于完全半虚拟化环境,通过 R1 和 R2 将每个 VM1 和 VM2 连接到 OpenVswitch(OVS)。
应用于 R1 或 R2 端口的 Openflow 规则被卸载到 e-switch,并分别直接应用于 VF1 或 VF2。这样,在 SRIOV 模式下,控制平面保持不变。

ASAP2 Direct 技术与 OVS-DPDK 在 VLAN 上的示例结果对比
以下是 ConnectX-5 25Gb 网卡上 OVS-DPDK 与 ASAP2 Direct 在 1000/5000/100000 多流和 64/512 数据包大小下的测试结果:
CPU 类型:Intel Xeon CPU E5-2670 v3 @ 2.30GHz

前提条件
假设 Openstack 环境已配置完毕,并且已使用 Nvidia 网卡启用 ASAP2 Direct。
OSP 13 的安装示例可在此处找到:
TRex 服务器部署
我们将使用裸机服务器作为 TRex 流量生成器,以获得最佳测试性能。
TRex 服务器应通过 L2 交换机使用单端口连接到计算节点,且位于同一租户网络 VLAN 上。
请按照以下指南进行 TRex 服务器安装:TRrex 快速入门 - 使用 ConnectX-4 或 ConnectX-5。第 4 节 GUI 安装可跳过。
拓扑
至少需要两个计算节点和一个通过 L2 交换机连接到同一 VLAN 的裸机 TRex 服务器。
被测设备(DUT)服务器是运行在其中一个计算节点上的客户虚拟机。该客户虚拟机将运行 testpmd dpdk 应用程序,以将流量回环到流量生成器(TG)服务器。
TRex 流量生成器(TG)服务器将通过 VXLAN 或 VLAN 向被测设备(DUT)注入 UDP 数据包。

设置 Openstack 环境
设置 Openstack 规格
通过设置规格定义客户虚拟机资源:
openstack flavor create m1.asapsmall --id 5 --ram 8192 --disk 20 --vcpus 6
nova flavor-key m1.asapsmall set hw:mem_page_size=large
openstack flavor set m1.asapsmall --property hw:cpu_policy=dedicated
上传客户虚拟机镜像
警告:确保使用的镜像包含 Nvidia 以太网网卡驱动程序以及使用 Nvidia PMD 编译的 testpmd DPDK 应用程序。如果您希望将新编译的 DPDK testpmd APP 添加到云镜像中,请参考附录中的“编译带 Nvidia PMD 的 DPDK 示例”。
如果您希望获取已包含 testpmd 应用程序的预准备云镜像,可从此处下载:
wget http://13.74.249.42/images/CentOS7.5_testpmd.qcow2
OS 凭据 - 用户:"root" 密码:"your_root_password"
将镜像上传到 Openstack glance 仓库:
glance --os-image-api-version 2 image-create --file CentOS7.5_testpmd.qcow2 --disk-format qcow2 --container-format bare --name testpmd --progress
创建 VXLAN/VLAN 网络和子网
VXLAN 网络:
private_network_id1=`openstack network create private1 --disable-port-security --provider-network-type vxlan --share | grep ' id ' | awk '{print $4}'`
或 VLAN 网络:
private_network_id1=`openstack network create private1 --disable-port-security --provider-physical-network tenant --provider-network-type vlan --share | grep ' id ' | awk '{print $4}'`
创建子网
openstack subnet create private_subnet --network private1 --subnet-range 11.11.11.0/24
创建基于 ASAP2 的端口
创建基于 ASAP2 的端口
通过向端口功能添加 libvirt 'switchdev' 属性,启用 OpenStack 智能网卡端口感知。
direct_port1=`openstack port create direct1 --vnic-type=direct --no-security-group --network $private_network_id1 --binding-profile '{"capabilities":["switchdev"]}' | grep ' id ' | awk '{print $4}'`
direct_port2=`openstack port create direct1 --vnic-type=direct --no-security-group --network $private_network_id1 --binding-profile '{"capabilities":["switchdev"]}' | grep ' id ' | awk '{print $4}'`
使用 ASAP2 端口绑定配置客户 VM
在两个不同的计算节点上启动两个客户 VM。
nova boot --flavor m1.asapsmall --image <IMAGE_NAME> --nic port-id=$direct_port1 <VM1_NAME>
nova boot --flavor m1.asapsmall --image <IMAGE_NAME> --nic port-id=$direct_port2 <VM2_NAME>
执行完整性检查
在客户 VM 之间启动持续 ping 请求。 同时在虚拟机管理程序 CLI 中执行以下命令:
sudo ovs-dpctl dump-flows type=offloaded --name
输出将显示持续 ping 请求的入站和出站卸载规则。
VXLAN 示例输出:

VLAN 示例输出:

通过脚本增加 OpenFlow 规则数量
警告: OpenVswitch 默认会为每个客户端创建单个流以处理多个会话,从而优化数据平面流量处理并减小转发查找表。为了测试高流量,我们将为每个奇数源 UDP 端口号添加一条丢弃规则。这样,如果从单个客户端注入具有偶数源 UDP 端口的数据包,OpenVswitch 将为每个不同的偶数源端口号创建一个流。在计算节点 2 上设置此脚本:
#!/bin/bash
START_PORT=2001
END_PORT=$2
P=$START_PORT
while [ $P -lt $END_PORT ]; do
if [ "$1" = "del" ]
then
sudo ovs-ofctl del-flows br-int dl_type=0x0800,nw_proto=0x11,udp_src=$P
fi
if [ "$1" = "add" ]
then
sudo ovs-ofctl add-flow br-int dl_type=0x0800,nw_proto=0x11,udp_src=$P,priority=11,action=drop
fi
let P=P+2
done
添加流
此示例将为 2001 到 3001 之间的每个奇数源 UDP 端口添加流(脚本端口步进为 +2)。
./add_flows.sh add 3001
删除流
./add_flows.sh del 3001
验证用户空间中的逻辑流数量
ovs-ofctl dump-flows br-int | wc -l
验证内核空间中的活动流数量(仅在活动数据包流期间相关)
ovs-dpctl dump-flows type=offloaded --name | wc -l
设置被测设备(DUT)客户 VM 并回环 DPDK testpmd
运行 testpmd 应用程序。
首先分配大页
echo 4096 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
挂载大页
mount -t hugetlbfs -o pagesize=2MB none /dev/hugepages
启动 testpmd
$DPDK_DIR/./testpmd -c 0x1f -n 4 -m 2048 -w 0000:00:04.0 -- --burst=64 --txd=1024 --rxd=1024 --mbcache=512 --rxq=4 --txq=4 --nb-cores=4 --rss-udp --forward-mode=macswap -a -i --port-topology=chained
参数说明:
- 核心数掩码(例如 5 个核心):
-c 0x1f- NUMA 通道数:
-n 4- 大页内存量:
-m 2048- PCI 插槽:
-w <number>- RX/TX 队列数和 PMD 核心数:
--rxq=4 --txq=4 --nb-cores=4- L2 转发机制:
--forward-mode=macswap
提取数据包统计信息
testpmd> show port stats all
设置 TRex 流量生成器
本节说明如何生成数据包,其元数据结构模拟从计算节点 1 VM1 到计算节点 2 VM2 的流量。将 udp_1pkt_vxlan.py 和 udp_1pkt_vlan.py(附于本文)上传到 TRex 服务器的主安装目录。
对于 VXLAN,按如下方式编辑 udp_1pkt_vxlan.py
假设流量方向是从 TRex TG 服务器到计算节点 2 上的 VM2。
- 源外部 MAC = TRex 物理接口 MAC 地址
- 目的外部 MAC = 计算节点 2 物理接口 MAC 地址(VXLAN VTEP)
- 源外部 IP = 计算节点 1 的 VXLAN VTEP 源 IP 地址
- 目的外部 IP = 计算节点 2 的 VXLAN VTEP 源 IP 地址
- 源内部 MAC = VM1 接口的 MAC 地址
- 目的内部 MAC = VM2 接口的 MAC 地址
- 源内部 IP = VM1 接口的 IP 地址
- 目的内部 IP = VM2 接口的 IP 地址
- vni = VNI 编号——可在“执行完整性检查”部分的输出中找到:
sudo ovs-dpctl dump-flows type=offloaded --name

注意:
数据包大小系数(以绿色高亮显示)在第 4 节中说明。
对于 VLAN,按如下方式编辑 udp_1pkt_vlan.py
假设流量方向是从 Trex TG 服务器到计算节点 2 上的 VM2。
- 源外部 MAC = TRex 物理接口 MAC 地址
- 目的外部 MAC = VM2 接口的 MAC 地址
- 源内部 IP = VM1 接口的 IP 地址
- 目的内部 IP = VM2 接口的 IP 地址
- 外部 VLAN = 网络 VLAN 编号。可通过查看网络详细信息确定:
- 提取 VLAN ID:
openstack network show private1

注意:
数据包大小系数(以绿色高亮显示)在第 4 节中说明。
按照以下示例设置数据包大小(上面第 3 节和第 4 节图中以绿色标记)
TRex 数据包大小 VXLAN 脚本:
- ('x'*18) = 110 字节
- ('x'*164) = 256 字节
- ('x'*420) = 512 字节
- ('x'*932) = 1024 字节
- ('x'*1426) = 1518 字节
TRex 数据包大小仅 UDP VLAN 脚本:
- ('x'*22) = 64 字节
- ('x'*214) = 256 字节
- ('x'*470) = 512 字节
- ('x'*982) = 1024 字节
- ('x'*1476) = 1518 字节
设置最小和最大源 UDP 端口号
在端口范围内定义偶数(脚本端口增量为步长 +2)。
端口范围应补全“通过脚本增加 OpenFlow 规则数量”一节中定义的奇数范围。 在本示例中,偶数源 UDP 端口范围设置为 2000-3000。
VXLAN 设置示例(udp_1pkt_vxlan.py):
VLAN 设置示例(udp_1pkt_vlan.py):
注入数据包
从 Trex 主目录进入 Trex 控制台
./trex-console
运行 Trex 脚本
trex> start -f udp_1pkt_vxlan.py -m 50mpps -p 0
-f 指定脚本文件 -m 指定每秒百万数据包数 -p 设置要使用的 Trex 端口
查看流量统计信息
如果使用 VXLAN,流量不会回环到 TRex TG 服务器,而是到计算节点 1 的 VM1,因此应仅通过 testpmd 测量统计信息。
TRex 统计信息视图
trex> tui

Testpmd 统计信息视图
testpmd> show port stats all

此命令将测量每秒接收 RX 和发送 TX 的数据包数量。RX 和 TX 数字应非常接近,差值很小。如果 RX 和 TX 数字之间存在较大差距,则意味着 testpmd 数据包处理引擎无法跟上注入的数据包数量。换句话说,您遇到了性能瓶颈。
附录
编译带有 NVIDIA PMD 的 DPDK 示例
安装 MLNX_OFED 版本 4.2-1.0.0.0
OFED 下载链接:Nvidia 以太网驱动程序 确保 OFED 安装脚本按如下方式执行:
/mnt/mlnxofedinstall --dpdk --upstream-libs
检查 OFED 版本
ofed_info -s
重要提示 如果操作系统是 RHEL7.5/CentOS7.5,则无需安装 OFED。DPDK 在上游受支持。只需安装上游软件包而不是 OFED,如下所示:
yum install rdma-core-devel numactl -y
下载并解压 DPDK 17.11 软件包
cd /usr/src/ # wget https://git.dpdk.org/dpdk-stable/snapshot/dpdk-stable-17.11.4.zip # unzip dpdk-stable-17.11.4.zip
按如下方式设置 DPDK 环境变量:
export DPDK_DIR=/usr/src/dpdk-stable-17.11.4 # cd $DPDK_DIR # export DPDK_TARGET=x86_64-native-linuxapp-gcc # export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
修改编译设置以支持 ConnectX-4 和 ConnectX-5 接口
sed -i 's/(CONFIG_RTE_LIBRTE_MLX5_PMD=)n/\1y/g' $DPDK_DIR/config/common_base
编译您的 DPDK 代码
cd $DPDK_DIR # make install T=$DPDK_TARGET DESTDIR=install
make -j install T=$DPDK_TARGET DESTDIR=install
相关文档
- RHEL 7 GPU Pass Through and xorg Configuration for VMware vSphere 6.0 Technical Note
- Setting Up a Linux Box
- Linux 3x3 Mosaic Array
- Install and Configure RHEL 7.4 with XenDesktop 7.18, ESX 6.5 and GRID 6.2
- How to Install & Configure RHEL 7.4 with Citrix XenDesktop 7.18, ESX 6.5 & GRID 6.2
- Red Hat RHV + Nvidia VGPU Step by Step Guide
- How to Install & Configure Multi-GPU with GRID 7.0, RHEL Server 7.5 and Tesla boards
- GPU-DPDK External Alliances
- How-to: Configure VMware NSX-T for high performance networks on VMware NFV Platform with Mellanox supported adapters.
- QSG: NVIDIA BlueField DPU with OVS Hardware Offload.
- RDG: Red Hat OpenStack Platform 13 with NVIDIA Network OVS Offload.
- QSG for Configuring TRex in a few steps using Nvidia ConnectX adapters
- QSG: ASAP² technology performance evaluation on Red Hat OpenStack Platform 13.
- QSG: ASAP² OVS Acceleration Technology Performance Evaluation on RHEL Host.
- How-to: Build VPP FD.IO with Nvidia DPDK PMD on top CentOS 7.7 with inbox drivers.

