使用 DPDK 在平台之间发送数据包¶
本指南介绍如何在两个平台之间发送数据包。
概述¶
图 1 显示了如何通过简单的配置在两个平台之间发送数据包。该示例使用了 Data Plane Development Kit,它是一套用于快速处理数据包的库、驱动程序、示例应用程序和工具。

图 1:l3fwd DPDK 应用程序的环境
本示例使用以下 DPDK 组件:
必备条件¶
两个平台使用 Clear Linux* OS 13330 或更高版本。
两个映像都必须包含 kernel-native 捆绑包。
使用以下命令安装 network-basic-dev 捆绑包:
sudo swupd bundle-add network-basic-dev
每个平台必须至少有一个 NIC。查阅 DPDK project 了解受支持的 dpdk.org NICs 列表。
两根网线。
安装 dpdk 并构建 l3fwd 示例(平台 B)¶
切换到
l3fwd
示例目录。sudo cd /usr/share/dpdk/examples/l3fwd
将
RTE_SDK
变量分配给 makefiles 路径。sudo export RTE_SDK=/usr/share/dpdk/
将
RTE_TARGET
变量分配给 gcc* 配置文件的位置。sudo export RTE_TARGET=x86_64-native-linuxapp-gcc
构建 l3fwd 应用程序,并将配置头文件添加到 CFLAGS 变量中。
sudo make CFLAGS+="-include /usr/include/rte_config.h"
构建 pktgen(平台 A)¶
下载 pktgen tar package v3.1.2 或更高版本。
解压缩软件包,并切换到未解压缩的源目录。
将
RTE_SDK
变量分配给 makefiles 所在的路径。sudo export RTE_SDK=/usr/share/dpdk/
将
RTE_TARGET
分配给 gcc 配置文件的位置。sudo export RTE_TARGET=x86_64-native-linuxapp-gcc
构建 pktgen 项目,并将 CONFIG_RTE_BUILD_SHARED_LIB 变量设置为 “n”。
sudo make CONFIG_RTE_BUILD_SHARED_LIB=n
将网卡绑定到 DPDK 内核驱动程序(平台 A 和平台 B)¶
l3fwd 应用程序使用两个网卡。DPDK 包括将网卡绑定到 DPDK 模块以运行 DPDK 应用程序的工具。
加载 DPDK I/O 内核模块。
sudo modprobe vfio-pci
检查网卡以确定哪些网卡为空闲状态。另一个应用程序正在使用网卡时,状态显示为 “Active”,此时这些网卡无法绑定。
sudo dpdk-devbind --status
绑定两个可用的网卡。绑定操作的常规语法是 dpdk-devbind --bind=vfio-pci <device-entry>。下面显示了一个工作示例:
sudo dpdk-devbind --bind=vfio-pci 01:00.0
检查网卡状态,验证网卡绑定是否正确。如果绑定成功,drv 显示值 igb_uio,这确认了网卡正在使用 DPDK 模块。
设置大页(平台 A 和 B)¶
Clear Linux OS 支持 hugepages,即可以分配大内存池,并将其用于数据包缓冲区。
设置大页数量。
sudo echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
在 NUMA 计算机上分配页面。
sudo echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages sudo echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
为 DPDK 分配内存。
sudo mkdir -p /mnt/huge $ mount -t hugetlbfs nodev /mnt/huge
有关详细信息,请参阅 DPDK guide 系统要求一节。
运行 l3fwd 应用程序(平台 B)¶
l3fwd 应用程序是安装 dpdk-dev
捆绑包时可用的 DPDK 示例之一。l3fwd 将数据包从一个网卡转发到另一个网卡。有关详细信息,请参阅 l3fwd 文档。
打开 l3fwd 示例目录。
sudo cd /usr/share/dpdk/examples/l3fwd
这一步非常重要。
- DPDK 需要借助轮询模式驱动程序才能运行。
- 轮询模式驱动程序是
/usr/lib64
中的共享对象。 - 请在 dpdk.org NICs 查看受支持的网卡的完整列表。
- 您必须知道每个网卡使用的是哪个内核模块,并选择与网卡相对应的轮询模式驱动程序。
网卡绑定和 pktgen 配置取决于网络用例和可用的系统资源。使用 -d 标志设置轮询模式驱动程序。
以下示例假设网卡使用 e1000 网络驱动程序和 e1000 轮询模式驱动程序。
librte_pmd_e1000.so
位于 Clear Linux OS 中的/usr/lib64
中。sudo ./build/l3fwd -c 0x3 -n 2 -d librte_pmd_e1000.so -- -p 0x3 --config="(0,0,0),(1,0,1)"
l3fwd 应用程序在启动时显示端口初始化详细信息。端口 0 初始化完成后,l3fwd 显示端口 1 的 MAC 地址和信息。
保存该 MAC 地址以配置 pktgen 项目。
运行 pktgen 应用程序(平台 A)¶
pktgen 是 DPDK 中包含的网络流量生成器。
pktgen 配置取决于网络设置和可用的系统资源。以下示例显示了一个基本配置。
sudo ./app/app/x86_64-native-linuxapp-gcc/pktgen -c 0xf -n 4 -- -p 0xf -P -m "1.0, 2.1"
启用活动彩色输出(可选)。
Pktgen> theme enable
使用初始化期间 l3fwd 应用程序显示的 MAC 地址。在 pktgen 中设置 MAC 地址的命令格式如下:
set mac <port number> <mac address>
以下是一个工作示例:
Pktgen> set mac 0 00:1E:67:CB:E8:C9 Pktgen> set mac 1 00:1E:67:CB:E8:C9
发送数据包。
Pktgen> start 0-1
有关详细信息,请参阅 pktgen 文档。
附录 A:为虚拟机使用直通¶
本节说明如何设置由虚拟机控制主机上网卡的虚拟环境。
创建一个新目录并切换到该目录。
下载或创建
start_qemu.sh
脚本以运行 kvm 虚拟机:sudo curl -O https://cdn.download.clearlinux.org/image/start_qemu.sh
下载 Clear Linux OS 的裸机映像,并将其重命名为
clear.img
。查找包含供应商和设备 ID 的 Ethernet* 设备条目:
sudo lspci -nn | grep Ethernet
示例输出如下:
03:00.0 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521]
其中 03:00.0 是设备条目,8086:1521 是 vendor:device ID。记下此信息,因为后面需要用到它将网卡与主机解除绑定。
解除网卡与主机的绑定,以便与虚拟机进行直通通信。Clear Linux OS 支持此类通信。命令采用以下格式:
echo "vendor device_ID" > /sys/bus/pci/drivers/pci-stub/new_id echo "entry for device" > /sys/bus/pci/drivers/igb/unbind echo "entry for device" > /sys/bus/pci/drivers/pci-stub/bind echo "vendor device_ID" > /sys/bus/pci/drivers/pci-stub/remove_id
以下是一个工作示例:
sudo echo "8086 1521" > /sys/bus/pci/drivers/pci-stub/new_id sudo echo "0000:03:00.0" > /sys/bus/pci/drivers/igb/unbind sudo echo "0000:03:00.0" > /sys/bus/pci/drivers/pci-stub/bind sudo echo "8086 1521" > /sys/bus/pci/drivers/pci-stub/remove_id
将未绑定的网卡分配给 KVM 虚拟机(来宾)。修改 qemu-system-x86_64 参数中的
start_qemu.sh
脚本,并按以下格式添加含有主机网卡信息的行:-device pci-assign,host="<entry for device>",id=passnic0,addr=03.0 -device pci-assign,host="<entry for device>",id=passnic1,addr=04.0
以下是一个工作示例:
-device pci-assign,host=03:00.0,id=passnic0,addr=03.0 \ -device pci-assign,host=03:00.3,id=passnic1,addr=04.0 \
按照以下格式向 Makefile 引导目标添加行,从而将更多 NUMA 计算机添加到虚拟机:
-numa node,mem=<memory>,cpus=<number of cpus>
下面是一个具有 4096 内存和四个 CPU 的虚拟机的工作示例:
-numa node,mem=2048,cpus=0-1 \ -numa node,mem=2048,cpus=2-3 \
注解
每台 NUMA 计算机必须使用相同数量的内存。
运行
start_qemu.sh
脚本。