在 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 服务器。

软件栈组件

物料清单

部署与配置
布线

IPv4 路由方案

- 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 服务器。
- 将电源节能设置为性能模式。
- 开启 VT-D 标志。
- 开启 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
-
安装先决条件包。
yum install git make gcc nasm rdma-core-devel libmnl-devel epel-release dnf-plugins-core -yyum config-manager --set-enabled powertools -
下载 VPP 源代码。
git clone https://github.com/FDio/vpp git checkout origin/stable/2009 -
安装 VPP 依赖的构建包。
cd $HOME-PATH/vpp make install-dep -
使用 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/ -
配置 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 }
-
-
添加 VPP 组:
groupadd vpp -
运行 VPP 二进制文件:
$HOME-PATH/vpp/build-root/build-vpp-native/vpp/bin/./vpp -c $HOME-PATH/vpp/src/vpp/conf/startup.conf -
配置 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 数据包:
-
将此文件复制到 TRex 主目录:udp_1pkt_simple.py
-
进入 TRex 控制台并生成数据包。
$TREX-HOME-PATH/./trex-console
trex>start -f udp_1pkt_simple.py -m 1mpps -p 0
其中:
| 参数 | 描述 |
|---|---|
| -f | 加载构建数据包格式的所需脚本 |
| -m | 指定数据包速率 |
| -p | 指定要使用的 TRex 端口 |
- 检查数据包是否路由回 TRex:
在 "tui" 终端中,验证端口 0 正在发送数据包,端口 1 正在接收数据包。
trex>tui
附录
性能测试
下图显示了使用 CPU 型号 Platinum 8168 @ 2.70GHz 时的最大每秒数据包数和带宽。

注意 NVIDIA Gen3 ConnectX 100G 网卡可提供 148Mpps,在使用 64 字节数据包大小时达到满线速。 更强的 CPU 将获得更好的性能。 扩展的 DPDK 性能报告可在 DPDK 官方网站查看:perf-reports
作者
![]() |
Amir Zeidner多年来,Amir 一直担任解决方案架构师,主要专注于电信领域,领导先进解决方案以满足 5G、NFV 和 SDN 网络基础设施需求。Amir 在数据平面加速技术(如加速交换和数据包处理 (ASAP²) 和 DPDK)方面的专业知识,加上对开源云基础设施的深入了解,使他能够在整个电信领域推广和交付独特的端到端 NVIDIA 网络解决方案。 |


