使用 DPDK 在平台之间发送数据包

本指南介绍如何在两个平台之间发送数据包。

概述

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

Platform A and B

图 1:l3fwd DPDK 应用程序的环境

本示例使用以下 DPDK 组件:

  • pktgen:流量生成器。有关详细信息,请参阅 pktgen 文档。
  • l3fwd:第 3 层转发示例应用程序。有关详细信息,请参阅 l3fwd 文档。

必备条件

  • 两个平台使用 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)

  1. 切换到 l3fwd 示例目录。

    sudo cd /usr/share/dpdk/examples/l3fwd
    
  2. RTE_SDK 变量分配给 makefiles 路径。

    sudo export RTE_SDK=/usr/share/dpdk/
    
  3. RTE_TARGET 变量分配给 gcc* 配置文件的位置。

    sudo export RTE_TARGET=x86_64-native-linuxapp-gcc
    
  4. 构建 l3fwd 应用程序,并将配置头文件添加到 CFLAGS 变量中。

    sudo make CFLAGS+="-include /usr/include/rte_config.h"
    

构建 pktgen(平台 A)

  1. 下载 pktgen tar package v3.1.2 或更高版本。

  2. 解压缩软件包,并切换到未解压缩的源目录。

  3. RTE_SDK 变量分配给 makefiles 所在的路径。

    sudo export RTE_SDK=/usr/share/dpdk/
    
  4. RTE_TARGET 分配给 gcc 配置文件的位置。

    sudo export RTE_TARGET=x86_64-native-linuxapp-gcc
    
  5. 构建 pktgen 项目,并将 CONFIG_RTE_BUILD_SHARED_LIB 变量设置为 “n”。

    sudo make CONFIG_RTE_BUILD_SHARED_LIB=n
    

将网卡绑定到 DPDK 内核驱动程序(平台 A 和平台 B)

l3fwd 应用程序使用两个网卡。DPDK 包括将网卡绑定到 DPDK 模块以运行 DPDK 应用程序的工具。

  1. 加载 DPDK I/O 内核模块。

    sudo modprobe vfio-pci
    
  2. 检查网卡以确定哪些网卡为空闲状态。另一个应用程序正在使用网卡时,状态显示为 “Active”,此时这些网卡无法绑定。

    sudo dpdk-devbind --status
    
  3. 绑定两个可用的网卡。绑定操作的常规语法是 dpdk-devbind --bind=vfio-pci <device-entry>。下面显示了一个工作示例:

    sudo dpdk-devbind --bind=vfio-pci 01:00.0
    
  4. 检查网卡状态,验证网卡绑定是否正确。如果绑定成功,drv 显示值 igb_uio,这确认了网卡正在使用 DPDK 模块。

设置大页(平台 A 和 B)

Clear Linux OS 支持 hugepages,即可以分配大内存池,并将其用于数据包缓冲区。

  1. 设置大页数量。

    sudo echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
    
  2. 在 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
    
  3. 为 DPDK 分配内存。

    sudo mkdir -p /mnt/huge $ mount -t hugetlbfs nodev /mnt/huge
    

    有关详细信息,请参阅 DPDK guide 系统要求一节。

设置物理环境(平台 A 和 B)

如图 2 所示,使用网线将平台 A 上的网卡连接到平台 B 上的网卡。

../../_images/pyshical_net.png

图 2:物理网络环境

运行 l3fwd 应用程序(平台 B)

l3fwd 应用程序是安装 dpdk-dev 捆绑包时可用的 DPDK 示例之一。l3fwd 将数据包从一个网卡转发到另一个网卡。有关详细信息,请参阅 l3fwd 文档。

  1. 打开 l3fwd 示例目录。

    sudo cd  /usr/share/dpdk/examples/l3fwd
    
  2. 这一步非常重要。

    1. DPDK 需要借助轮询模式驱动程序才能运行。
    2. 轮询模式驱动程序是 /usr/lib64 中的共享对象。
    3. 请在 dpdk.org NICs 查看受支持的网卡的完整列表。
    4. 您必须知道每个网卡使用的是哪个内核模块,并选择与网卡相对应的轮询模式驱动程序。
  3. 网卡绑定和 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)"
    
  4. l3fwd 应用程序在启动时显示端口初始化详细信息。端口 0 初始化完成后,l3fwd 显示端口 1 的 MAC 地址和信息。

    保存该 MAC 地址以配置 pktgen 项目。

运行 pktgen 应用程序(平台 A)

pktgen 是 DPDK 中包含的网络流量生成器。

  1. pktgen 配置取决于网络设置和可用的系统资源。以下示例显示了一个基本配置。

    sudo ./app/app/x86_64-native-linuxapp-gcc/pktgen -c 0xf -n 4 -- -p 0xf -P -m "1.0, 2.1"
    
  2. 启用活动彩色输出(可选)。

    Pktgen> theme enable
    
  3. 使用初始化期间 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
    
  4. 发送数据包。

    Pktgen> start 0-1
    

有关详细信息,请参阅 pktgen 文档。

附录 A:为虚拟机使用直通

本节说明如何设置由虚拟机控制主机上网卡的虚拟环境。

  1. 创建一个新目录并切换到该目录。

  2. 下载或创建 start_qemu.sh 脚本以运行 kvm 虚拟机:

    sudo curl -O https://cdn.download.clearlinux.org/image/start_qemu.sh
    
  3. 下载 Clear Linux OS 的裸机映像,并将其重命名为 clear.img

  4. 查找包含供应商和设备 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:1521vendor:device ID。记下此信息,因为后面需要用到它将网卡与主机解除绑定。

  5. 解除网卡与主机的绑定,以便与虚拟机进行直通通信。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
    
  6. 将未绑定的网卡分配给 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 \
    
  7. 按照以下格式向 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 计算机必须使用相同数量的内存。

  8. 运行 start_qemu.sh 脚本。