在 NVIDIA SmartNIC 上构建和运行向量数据包处理 (VPP) 应用的快速入门指南

本快速入门指南演示了如何使用 NVIDIA ConnectX 网卡构建和安装 FD.io 向量数据包处理 (VPP),以及如何使用 TRex 流量生成器评估 VPP 性能,实现全线速。

文档目录

范围

本快速入门指南演示了如何构建和安装 FD.io 向量数据包处理 (VPP),使用 NVIDIA ConnectX 网卡,以及如何使用 TRex 流量生成器评估 VPP 性能,实现全线速。

缩写和缩略语

术语 定义 术语 定义
VPP 向量数据包处理 DPDK 数据平面开发套件
NIC 网络接口 DAC 直连铜缆
PMD 轮询模式驱动 TG 流量生成器
DUT 被测设备 MPPS 百万包每秒

参考文献

简介

VPP 是一个开源代码项目,为网络数据包处理提供高性能。其平台基于“数据包处理图”模块化方法,应用于数据包向量,并与 DPDK 数据平面开发套件 插件集成,实现快速 I/O。

NVIDIA ConnectX 智能网卡系列与 NVIDIA DPDK 轮询模式驱动 (PMD) 共同构成了 VPP 实现高性能的理想硬件和软件栈。

本文档指导您完成使用 NVIDIA DPDK PMD 编译 VPP 代码、运行 VPP 以及使用 TRex 流量生成器测量 L3 IPv4 路由性能的步骤。

解决方案架构

逻辑设计

此处使用最简单的设置:两台裸金属服务器背靠背连接。 单台 TRex 服务器通过两根以太网直连铜缆 (DAC) 连接到单台 VPP 服务器。

image2020-11-11_10-58-17.png

软件栈组件

image2021-1-6_10-34-13.png

物料清单

image2021-1-6_9-50-59.png

部署与配置

布线

image2021-1-6_10-21-48.png

IPv4 路由方案

image2020-11-15_20-25-3.png

  • VPP 服务器设置两个接口:1.1.1.2/24 和 2.2.2.2/24
  • TRex 服务器设置两个接口:1.1.1.1/24 和 2.2.2.1/24
  • 为 VPP 服务器设置子网 16.0.0.0/8 的路由,以将 IP 16.0.0.1 的数据包路由回 TRex 服务器

主机

BIOS 设置

适用于 TRex 和 VPP 服务器。

  1. 将电源节能设置为性能模式。
  2. 开启 VT-D 标志。
  3. 开启 Turbo-boost。

GRUB 文件设置

适用于 TRex 和 VPP 服务器 - 使用以下参数编辑 grub 文件。

intel_iommu=on iommu=pt default_hugepagesz=1G hugepagesz=1G hugepages=32 intel_idle.max_cstate=0 processor.max_cstate=0 intel_pstate=disable nohz_full=<core-list> rcu_nocbs=<core-list> rcu_nocb_poll isolcpus=<core-list>

有关每个参数的更多信息,请访问 如何优化性能(系统调优)

构建和配置带 L3 路由的 VPP

  1. 安装先决条件包。

    yum install git make gcc nasm rdma-core-devel libmnl-devel epel-release dnf-plugins-core -y
    
    yum config-manager --set-enabled powertools
    
  2. 下载 VPP 源代码。

    git clone https://github.com/FDio/vpp
    git checkout origin/stable/2009
    
  3. 安装 VPP 依赖的构建包。

    cd $HOME-PATH/vpp
    make install-dep
    
  4. 使用 NVIDIA DPDK PMD 编译 VPP。

    cd $HOME-PATH/vpp
    make build-release DPDK_MLX5_PMD=y
    cp $HOME-PATH//vpp/build-root/install-vpp-native/external/lib/librte_pmd_mlx5_glue.so* /usr/lib/
    cp $HOME-PATH//vpp/build-root/install-vpp-native/external/lib/librte_pmd_mlx5_glue.so* /usr/lib64/
    
  5. 配置 VPP 配置文件 $HOME-PATH/vpp/src/vpp/conf/startup.conf

    • 设置主 VPP 应用核心:main-core 1

    • 设置数据面工作核心数:corelist-workers 2-9

    • 设置 RX 队列数:num-rx-queues 8

    • 设置 TX 队列数:num-tx-queues 8

    • 设置第一个接口:dev 0000:61:00.0。 要查找接口 PCI 插槽号,请使用以下命令:

      lspci | grep "Mellanox" | cut -d " " -f 1
      
    • 设置第二个接口:dev 0000:61:00.1。 要查找接口 PCI 插槽号,请使用以下命令:

      lspci | grep "Mellanox" | cut -d " " -f 1
      
    • "取消注释"参数 no-multi-seg 以提高性能。

      建议设置相同数量的队列和核心。

      示例文件:

      unix {
        nodaemon
        log /var/log/vpp/vpp.log
        full-coredump
        cli-listen /run/vpp/cli.sock
        gid vpp
      }
      
      api-trace {
        on
      }
      
      api-segment {
        gid vpp
      }
      
      socksvr {
        default
      }
      
      cpu {
        main-core 1
        corelist-workers 2-9
      }
      
      dpdk {
        dev default {
          num-rx-queues 8
          num-tx-queues 8
        }
        dev 0000:61:00.0
        dev 0000:61:00.1
        no-multi-seg
      }
      
  6. 添加 VPP 组:

    groupadd vpp
    
  7. 运行 VPP 二进制文件:

    $HOME-PATH/vpp/build-root/build-vpp-native/vpp/bin/./vpp -c $HOME-PATH/vpp/src/vpp/conf/startup.conf
    
  8. 配置 VPP 的 L3 接口和路由——确保使用正确的 IP 配置 L3 IPv4 接口。 本文档将第一个接口设置为 1.1.1.2/24,第二个接口设置为 2.2.2.2/24

    ## 启动 VPP CLI ##
    $HOME-PATH/vpp/build-root/build-vpp-native/vpp/bin/./vppctl
    ## 设置两个 L3 接口及其 IP 和子网 ##
    vppctl set int ip address HundredGigabitEthernet61/0/0 1.1.1.2/24
    vppctl set interface state HundredGigabitEthernet61/0/0 up
    vppctl set int ip address HundredGigabitEthernet61/0/1 2.2.2.2/24
    vppctl set interface state HundredGigabitEthernet61/0/1 up
    ## 设置静态路由 ##
    vppctl ip route add 16.0.0.0/8 via 1.1.1.1 HundredGigabitEthernet61/0/0
    

安装带 L3 接口的 TRex 服务器

要构建 TRex 服务器,请按照以下指南中的步骤操作:使用 NVIDIA ConnectX 适配器在几步内安装 TRex

确保使用正确的 IP 配置 L3 IPv4 接口。

本文档将第一个接口设置为 1.1.1.1/24,第二个接口设置为 2.2.2.1/24

安装过程示例:

./dpdk_setup_ports.py -i
By default, IP based configuration file will be created. Do you want to use MAC based config? (y/N)n
+----+------+---------+-------------------+-----------------------------------------+-----------+----------+----------+
| ID | NUMA |   PCI   |        MAC        |                  Name                   |  Driver   | Linux IF |  Active  |
+====+======+=========+===================+=========================================+===========+==========+==========+
| 0  | 0    | 02:00.0 | 38:63:bb:33:16:28 | NetXtreme BCM5719 Gigabit Ethernet PCIe | tg3       | eno1     | *Active* |
+----+------+---------+-------------------+-----------------------------------------+-----------+----------+----------+
| 1  | 0    | 02:00.1 | 38:63:bb:33:16:29 | NetXtreme BCM5719 Gigabit Ethernet PCIe | tg3       | eno2     |          |
+----+------+---------+-------------------+-----------------------------------------+-----------+----------+----------+
| 2  | 0    | 02:00.2 | 38:63:bb:33:16:2a | NetXtreme BCM5719 Gigabit Ethernet PCIe | tg3       | eno3     |          |
+----+------+---------+-------------------+-----------------------------------------+-----------+----------+----------+
| 3  | 0    | 02:00.3 | 38:63:bb:33:16:2b | NetXtreme BCM5719 Gigabit Ethernet PCIe | tg3       | eno4     |          |
+----+------+---------+-------------------+-----------------------------------------+-----------+----------+----------+
| 4  | 0    | 08:00.0 | ec:0d:9a:8a:28:3a | MT28800 Family [ConnectX-5 Ex]          | mlx5_core | ens1f0   |          |
+----+------+---------+-------------------+-----------------------------------------+-----------+----------+----------+
| 5  | 0    | 08:00.1 | ec:0d:9a:8a:28:3b | MT28800 Family [ConnectX-5 Ex]          | mlx5_core | ens1f1   |          |
+----+------+---------+-------------------+-----------------------------------------+-----------+----------+----------+
Please choose even number of interfaces from the list above, either by ID , PCI or Linux IF
Stateful will use order of interfaces: Client1 Server1 Client2 Server2 etc. for flows.
Stateless can be in any order.
Enter list of interfaces separated by space (for example: 1 3) : 4 5

For interface 4, assuming loopback to it's dual interface 5.
Putting IP 1.1.1.1, default gw

2.2.2.2 是否更改?(y/N).y 请输入接口 4 的 IP 地址:1.1.1.1 请输入接口 4 的默认网关:1.1.1.2 对于接口 5,假设回环到其双接口 4。 设置 IP 2.2.2.2,默认网关 1.1.1.1 是否更改?(y/N).y 请输入接口 5 的 IP 地址:2.2.2.1 请输入接口 5 的默认网关:2.2.2.2 是否打印生成的配置预览?(Y/n)y

由 dpdk_setup_ports.py 生成的配置文件

  • version: 2 interfaces: ['08:00.0', '08:00.1'] port_info: - ip: 1.1.1.1 default_gw: 1.1.1.2 - ip: 2.2.2.1 default_gw: 2.2.2.2

    platform: master_thread_id: 0 latency_thread_id: 6 dual_if: - socket: 0 threads: [1,2,3,4,5,12,13,14,15,16,17]

是否保存配置到文件?(Y/n)y 默认文件名为 /etc/trex_cfg.yaml 按 ENTER 确认或输入新文件名: 文件 /etc/trex_cfg.yaml 已存在,是否覆盖?(y/N)y 已保存到 /etc/trex_cfg.yaml。

验证

配置 TRex 以生成 L3 UDP 数据包:

  1. 将此文件复制到 TRex 主目录:udp_1pkt_simple.py

  2. 进入 TRex 控制台并生成数据包。

$TREX-HOME-PATH/./trex-console
trex>start -f udp_1pkt_simple.py -m 1mpps -p 0

其中:

参数 描述
-f 加载构建数据包格式的所需脚本
-m 指定数据包速率
-p 指定要使用的 TRex 端口
  1. 检查数据包是否路由回 TRex:

在 "tui" 终端中,验证端口 0 正在发送数据包,端口 1 正在接收数据包。

trex>tui

附录

性能测试

下图显示了使用 CPU 型号 Platinum 8168 @ 2.70GHz 时的最大每秒数据包数和带宽。

image2020-11-18_11-45-21.png

注意 NVIDIA Gen3 ConnectX 100G 网卡可提供 148Mpps,在使用 64 字节数据包大小时达到满线速。 更强的 CPU 将获得更好的性能。 扩展的 DPDK 性能报告可在 DPDK 官方网站查看:perf-reports

作者

AZ.jpg Amir Zeidner多年来,Amir 一直担任解决方案架构师,主要专注于电信领域,领导先进解决方案以满足 5G、NFV 和 SDN 网络基础设施需求。Amir 在数据平面加速技术(如加速交换和数据包处理 (ASAP²) 和 DPDK)方面的专业知识,加上对开源云基础设施的深入了解,使他能够在整个电信领域推广和交付独特的端到端 NVIDIA 网络解决方案。