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 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 带宽。

image2019-7-10_14-26-52.png

理解代表端口

此图中的端口 R1 和 R2 是代表 VF1 和 VF2 的代表端口。代表端口是 eSwitch 端口的 netdev 模型。这些端口的行为类似于完全半虚拟化环境,通过 R1 和 R2 将每个 VM1 和 VM2 连接到 OpenVswitch(OVS)。

应用于 R1 或 R2 端口的 Openflow 规则被卸载到 e-switch,并分别直接应用于 VF1 或 VF2。这样,在 SRIOV 模式下,控制平面保持不变。

image2019-7-10_14-26-3.png

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

image2019-9-19_11-14-17.png

前提条件

假设 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 数据包。

image2019-7-10_14-28-3.png

设置 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 示例输出:

image2019-10-29_16-27-58.png

VLAN 示例输出:

image2019-10-29_16-28-30.png

通过脚本增加 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.pyudp_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
    

image2019-10-29_16-29-19.png

注意:

数据包大小系数(以绿色高亮显示)在第 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

image2019-10-29_16-29-44.png

注意:

数据包大小系数(以绿色高亮显示)在第 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):

udp_1pkt_vxlan.py

VLAN 设置示例(udp_1pkt_vlan.py):

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

image2019-7-10_15-36-7.png

Testpmd 统计信息视图

testpmd> show port stats all

image2019-7-10_15-37-47.png

此命令将测量每秒接收 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

相关文档