在Linux(CentOS)上部署DPDK------命令行方式

2023-11-05

1.DPDK 简介


DPDK(Data Plane Development Kit)是数据平面开发工具包,由用于加速在各种CPU架构上运行的数据包处理的库组成。

DPDK需要一定的网卡硬件支持,以Intel为例,支持以下网卡:

    e1000 (82540, 82545, 82546)
    e1000e (82571, 82572, 82573, 82574, 82583, ICH8, ICH9, ICH10, PCH, PCH2, I217, I218, I219)
    igb (82575, 82576, 82580, I210, I211, I350, I354, DH89xx)
    ixgbe (82598, 82599, X520, X540, X550)
    i40e (X710, XL710, X722, XXV710)
    ice (E810)
    fm10k (FM10420)
    ipn3ke (PAC N3000)
    ifc (IFC)

完整的网卡支持列表可在官网查询:
http://core.dpdk.org/supported/

在Linux上部署DPDK有两种方式,一种是通过命令行依次进行配置,编译,驱动加载等;另一种是通过DPDK的脚本进行快捷配置和编译。

通过命令行的方式部署,可配置项更多,可以获得更佳的性能,对DPDK的工作环境也能有更好的熟悉;通过脚本方式部署步骤较少,较简单。
通过脚本部署的教程请移步:
在Linux(CentOS)上部署DPDK------脚本方式

2.DPDK 环境


该章节的内容参照自官网的DPDK System Requirements

2.1 编译所需的工具和库
  • GNU: make
  • coreutils: cmpsedgreparch, etc.
  • gcc: versions 4.9 或更新版本。
  • libc headers, 即glibc-devel.x86_64 (以64位数Intel平台为例)。
  • Linux kernel headers or sources required to build kernel modules. (kernel - devel.x86_64kernel - devel.ppc64)
  • 若需要在64位操作系统上编译32位软件,还需要以下工具:
    • glibc.i686libgcc.i686libstdc++.i686 and glibc-devel.i686 for Intel i686/x86_64;
    • glibc.ppc64libgcc.ppc64libstdc++.ppc64 and glibc-devel.ppc64 for IBM ppc_64;

这里需要注意的是kernel-devel的版本要匹配内核的版本,可以通过uname -r查看内核版本号,并通过yum info kernel-devel查看已安装或支持的kernel-devel版本号。这里查看到我的centos已经预装了kernel-devel,版本与kernel版本一致:

uname -r
    3.10.0-862.el7.x86_64

yum info kernel-devel
    已安装的软件包
    名称    :kernel-devel
    架构    :x86_64
    版本    :3.10.0
    发布    :862.el7
    大小    :37 M
    源    :installed

kernel头文件的路径位于/usr/lib/modules/$kernel-version/kernel

2.2 运行环境
  • Kernel version >= 3.16
  • glibc >= 2.7 (for features related to cpuset)
  • Kernel configuration,centos提供的配置可运行大多数DPDK应用。
2.3 设置Hugepages

Hugepages是DPDK用于提升性能的重要手段。 通过使用Hugepages,可以降低内存页数,减少TLB页表数量,增加TLB hit率。

在Linux上设置Hugepages有两种方式:

  • 修改Kernel cmdline(推荐)
  • 修改sysfs节点
2.3.1 修改Kernel cmdline(推荐)

通过修改kernel command line可以在kernel初始化时传入Hugepages相关参数并进行配置。
具体的操作步骤如下:

  1. 修改grub文件
    修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX中加入如下配置:
    default_hugepagesz=1G hugepagesz=1G hugepages=4
    
    该配置表示默认的hugepages的大小为1G,设置的hugepages大小为1G,hugepages的页数为4页,即以4个1G页面的形式保留4G的hugepages内存
    修改后的grub文件示例如下:
    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
    GRUB_DEFAULT=saved
    GRUB_DISABLE_SUBMENU=true
    GRUB_TERMINAL_OUTPUT="console"
    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap default_hugepagesz=1G hugepagesz=1G hugepages=4 rhgb quiet"
    GRUB_DISABLE_RECOVERY="true"
    
  2. 编译grub配置文件
    可以通过命令grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 重启
    通过reboot命令重启,随后可以通过cat /proc/cmdline查看kernel的command line是否包含之前的配置。
    也可以通过cat /proc/meminfo | grep Huge命令查看是否设置成功,若设置成功可以看到如下配置:
     HugePages_Total:       4
     HugePages_Free:        4
     Hugepagesize:    1048576 kB
    

DPDK官方建议,64位的应用应配置1GB hugepages。

这种配置方式的优点是可以在系统开机时即配置预留好hugepages,避免系统运行起来后产生内存碎片;另外,对于较大的例如1G pages,是不支持在系统运行起来后配置的,只能通过kernel cmdline的方式进行配置。

注:对于双插槽的NUMA系统(dual-socket NUMA system),预留的hugepages会被均分至两个socket,可以通过lscpu查看CPU信息:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
socket(s):            1
NUMA node(s):          1

可见测试主机使用的是单socket的NUMA系统。

2.3.2 修改sysfs节点

对于2 MB页面,还可以选择在系统启动后进行分配。 这是通过修改 /sys/devices/中的nr_hugepages节点来实现的。 对于单节点系统,若需要1024个页面,可使用如下命令:

echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

在NUMA机器上,页面的需要明确分配在不同的node上(若只有一个node只需要分配一次):

echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

这种配置方式的优点是配置简单,无需编译、重启,但是无法配置1GB这样的大hugepages。

2.3.3 DPDK使用Hugepages

预留好Hugepages之后,想要让DPDK使用预留的Hugepages,需要进行下述操作:

mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge

可以将这个挂载点添加到/etc/fstab中,这样可以永久生效,即重启后也仍然可以生效:

nodev /mnt/huge hugetlbfs defaults 0 0

对于1GB pages,在/etc/fstab中必须指定page size作为mount选项。

nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0

添加上面这样一行内容至/etc/fstab后并重启,可以通过df -a看到挂载成功:

nodev                           0       0         0     - /mnt/huge_1GB

3.DPDK 编译


该章节的内容参照自官网的DPDK build

3.1 下载DPDK代码

可从官网下载最新的稳定版或开发版的DPDK代码DPDK代码下载

然后解压缩:

tar xJf dpdk-<version>.tar.xz
cd dpdk-<version>

其中DPDK的代码包含如下部分:

  • lib: Source code of DPDK libraries
  • drivers: Source code of DPDK poll-mode drivers
  • app: Source code of DPDK applications (automatic tests)
  • examples: Source code of DPDK application examples
  • config, buildtools, mk: Framework-related makefiles, scripts and configuration
3.2 编译和安装

想要编译和安装DPDK,需要在DPDK的顶层目录运行下面运行make install T=<target>;或者可以首选运行make config T=<target>来进行配置,随后运行make来编译。

这里的target的格式为:

ARCH-MACHINE-EXECENV-TOOLCHAIN

其中:

  • ARCH可以是: i686x86_64ppc_64arm64
  • MACHINE 可以是: nativepower8armv8a
  • EXECENV 可以是: linuxfreebsd
  • TOOLCHAIN 可以是: gccicc

这里我们使用gcc来编译64位DPDK,这里最初按照官网的guide使用linux编译报错,后改用linuxapp

make install T=x86_64-native-linuxapp-gcc

在编译的过程中,若出现头文件缺失可通过yum进行安装。

编译完成后,target环境会在DPDK顶层目录以x86_64-native-linuxapp-gcc为文件名创建,若需要修改配置重新编译,可通过修改target目录下的.config文件再重新编译:

cd x86_64-native-linuxapp-gcc
vi .config
make

4.DPDK 驱动加载


该章节的内容参照自官网的DPDK Linux Drivers

不同的PMD需要不同的内核驱动程序才能正常工作。 取决于正在使用的PMD,应加载相应的内核驱动程序并绑定到网络端口。

4.1 UIO

UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可。
而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能。
在许多情况下,Linux内核中包含的标准uio_pci_generic模块可以提供uio功能。 可以使用以下命令加载此模块:

sudo modprobe uio_pci_generic

除了Linux内核中包含的标准uio_pci_generic模块,DPDK也提供了一个可替代的igb_uio模块,可以在kmod路径中找到。可以通过以下方法加载igb_uio模块。

sudo modprobe uio
sudo insmod kmod/igb_uio.ko

如果用于DPDK的设备绑定为uio_pci_generic内核模块,需要确保IOMMU已禁用或passthrough。 以intel x86_64系统为例,可以在的GRUB_CMDLINE_LINUX中添加intel_iommu = offintel_iommu = on iommu = pt

4.2 VFIO(推荐)

VFIO与UIO相比,它更加强大和安全,依赖于IOMMU。 要使用VFIO,需要:

  • Linix kernel version>=3.6.0
  • 内核和BIOS必须支持并配置为使用IO virtualization(例如Intel®VT-d)。

在确认硬件配置支持的情况下,要使用VFIO驱动绑定到NIC必须先使能iommu,否则会导致绑定失败。具体的现象就是查看或修改sysfs节点/sys/bus/pci/drivers/vfio-pci/bind出现io错误,以及dmesg中出现:

vfio-pci: probe of 0000:05:00.0 failed with error -22

使能iommu的方法也是修改kernel的command line将iommu=pt intel_iommu=on传入,具体步骤:

  1. 修改grub文件
    修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX中加入如下配置:
    iommu=pt intel_iommu=on
    
  2. 编译grub配置文件
    可以通过命令grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 重启
    通过reboot命令重启,随后可以通过cat /proc/cmdline查看kernel的command line是否包含之前的配置。

iommu配置成功后,dmesg中会有iommu配置group的log,可以通过dmesg | grep iommu查看:

[    0.594500] iommu: Adding device 0000:05:00.0 to group 18
[    0.594512] iommu: Adding device 0000:06:00.0 to group 19

即表示iommu使能成功。
随后需要调用modprobe来加载VFIO的驱动:

sudo modprobe vfio-pci
4.3 驱动绑定NIC

上述的UIO和VFIO驱动可以加载一项,也可以全都加载。但是在驱动绑定NIC的时候,只能选择一种驱动绑定到NIC,这里采用VFIO驱动。

可以调用dpdk路径下的usertools/dpdk-devbind.py实用脚本来进行VFIO驱动与NIC绑定,需要注意的是使用这个脚本进行绑定(bind)动作时是需要root权限的。
可以调用脚本传入--status查看当前的网络端口的状态:

python usertools/dpdk-devbind.py --status

Network devices using kernel driver
===================================
0000:03:00.0 'I210 Gigabit Network Connection 1533' if=enp3s0 drv=igb unused=vfio-pci *Active*
0000:04:00.0 'I210 Gigabit Network Connection 1533' if=enp4s0 drv=igb unused=vfio-pci *Active*
0000:05:00.0 'I210 Gigabit Network Connection 1533' if=enp5s0 drv=igb unused=vfio-pci 
0000:06:00.0 'I210 Gigabit Network Connection 1533' if=enp6s0 drv=igb unused=vfio-pci 

可以看到,当前NIC的状态都是Network devices using kernel driver,使用的是kernel的igb驱动drv=igb
随后可以调用脚本传入--bind将网卡05:00.0,也就是enp5s0绑定到VFIO驱动:

python usertools/dpdk-devbind.py --bind=vfio-pci 05:00.0

再次调用脚本传入--status,可以看到:

Network devices using DPDK-compatible driver
============================================
0000:05:00.0 'I210 Gigabit Network Connection 1533' drv=vfio-pci unused=igb

Network devices using kernel driver
===================================
0000:03:00.0 'I210 Gigabit Network Connection 1533' if=enp3s0 drv=igb unused=vfio-pci *Active*
0000:04:00.0 'I210 Gigabit Network Connection 1533' if=enp4s0 drv=igb unused=vfio-pci *Active*
0000:06:00.0 'I210 Gigabit Network Connection 1533' if=enp6s0 drv=igb unused=vfio-pci 

设备05:00.0已经配置为drv=vfio-pci,若想要恢复为kernel默认的igb驱动,则可以继续调用脚本:

python usertools/dpdk-devbind.py --bind=igb 05:00.0

至此,DPDK的部署就算完成了,接下来可以尝试编译和运行
基于DPDK的简单应用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Linux(CentOS)上部署DPDK------命令行方式 的相关文章

  • 在 Linux 上使用命令行 PHP 检查互联网连接

    我在 Linux 上使用命令行 PHP 来打开蓝牙拨号连接 并且我需要一种快速的方法来检查互联网连接是否处于活动状态 嗯 不一定要脏 但要快 使用exec运行外部命令不是问题 我正在考虑 ping 一些稳定的服务器 例如谷歌 但我想知道是否
  • 监控(嗅探)由 FTDI USB 串行转换器创建的 /dev/ttyUSB0

    我想监视 嗅探 由 FTDI USB 串行转换器创建的 dev ttyUSB0 的流量 我已经在 Windows 中编写了自己的应用程序 现在我尝试将其移植到 Linux 并使用 dev tty USB0 我想调试实际发生的通信 软件 st
  • Symfony 权限被拒绝

    谁能帮我解决我收到的以下错误消息 我终于在虚拟机上安装了 Symfony 它似乎工作正常 除了我偶尔收到这样的消息 1 2 ContextErrorException Warning SessionHandler read open var
  • platform.linux_distribution() 已弃用 - 有哪些替代方案?

    从 Python 3 5 开始platform linux distribution https docs python org 3 5 library platform html platform linux distribution已弃
  • IPC:在两个程序之间使用 C++ 中的命名管道

    我试图在同一台机器上运行的两个不同程序之间实现IPC 在我的例子中是CentOS7 为了实现一种松散耦合 我决定对 IPC 使用命名管道 因此 我正在使用以下示例并遇到了不同的问题 创建并写入管道 include
  • 如何将动态链接的应用程序转换为静态链接的应用程序?

    我有一个应用程序 例如 gedit 它是动态链接的 但我没有源代码 所以我不能按我喜欢的方式编译它 我想要做的是将其静态链接并将其移动到没有运行该应用程序所需的库的系统 那么是否可以做到以及如何做到呢 理论上是可能的 您基本上必须执行与动态
  • 如何使用Python distutils?

    我用 python 编写了一个快速程序 将 gtk GUI 添加到 cli 程序中 我想知道如何使用 distutils 创建安装程序 因为它只是命令行应用程序的 GUI 前端 所以它只能在 nix 中工作 所以我不担心它是跨平台的 我的主
  • Linux 上共享内存的生命周期是多长

    我正在使用 ftok shmget shmat shmdt 函数在 Linux 上创建 写入和读取共享段 如果我写入一个程序中的段 然后退出 然后稍后从另一个程序中读取该段 我会惊讶地发现数据仍然存在 我预计当共享一个段的最后一个进程执行
  • 很好的 C 库集合? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个很好的 ANSI C 库集合 用于处理向量 哈希映射 二进制树 字符串处理等 Try g
  • PHP 会话未保存在内存缓存中

    使用 Amazon Linux 在 AWS 上运行使用 php 5 4 的应用程序 PHP 版本是 PHP 5 4 28 从AWS存储库安装的memcache lib是php54 pecl memcache 3 0 8 1 11 amzn1
  • 移动除一个文件之外的所有文件

    如何移动除一个文件之外的所有文件 我正在寻找类似的东西 mv Linux Old Tux png Linux New 我将旧的东西移动到新的东西文件夹中 除了Tux png 符号代表否定 有一些工具可以完成这项工作吗 如果您使用 bash
  • Cmake 错误未定义对“pthread_create”的引用

    我对 cmake FindThreads 进行了测试 这是我的源代码test cpp和CMakeLists txt include
  • 如何在每个 xargs 命令之间休眠 1 秒?

    例如 如果我执行 ps aux awk print 1 xargs I echo 我想让 shell 在每次之间休眠 1 秒echo 如何更改我的 shell 命令 您可以使用以下语法 ps aux awk print 1 xargs I
  • 如何更改解释器路径并将命令行参数传递给 Linux 上的“可执行”共享库?

    这是 可执行 共享库的最小示例 假设文件名 mini c Interpreter path is different on some systems definitely different for 32 Bit machines cons
  • 如何在 Linux 上正确地将网络接口置于混杂模式

    那么如何正确地做到这一点呢 我知道如何通过创建套接字 然后使用 ioctl 设置 IFF PROMISC 标志来做到这一点 如 如何在C中检查网络设备状态 https stackoverflow com questions 3055622
  • Python select() 行为很奇怪

    我在理解 select select 的行为时遇到一些困难 请考虑以下 Python 程序 def str to hex s def dig n if n gt 9 return chr 65 10 n else return chr 48
  • 当我执行 pip --version 时,它显示错误为 ImportError:没有名为 pyparsing 的模块

    我尝试安装 卸载py解析以及它不起作用 我被这个问题困住了 我还必须安装额外的库 这是错误消息 Traceback most recent call last File usr bin pip line 5 in
  • top命令的CPU使用率计算

    我正在尝试使用 GNU coreutil top 的公式来计算 CPU 使用率的百分比 但 top 正在使用一些 half total 来计算百分比 即在百分比上添加 0 5 在top的utils c中 以下行 在 3 8 beta1 中
  • 共享库 RPATH 和二进制 RPATH 优先级

    如果共享库链接到二进制文件 并且共享库还依赖于其他库 则共享库的 RPATH 和二进制文件的 RPATH 的优先级 链接器搜索顺序 是什么 二进制文件的 RPATH 是否可以覆盖共享库中的 RPATH 我在共享库RPATH中设置的 ORIG
  • UNIX 域 STREAM 和 DATAGRAM 套接字之间的区别?

    这个问题是NOTSTREAM 类型和 DATAGRAM 类型 INTERNET 套接字之间的区别 我知道 STREAM 套接字使用 TCP 数据报套接字使用 UDP 以及所有 TCP UDP 内容 按顺序到达的数据包 ACK NACK 等

随机推荐

  • windows 自启动脚本

    第一 一 例如我们要开机自启动一个脚本 C abc script bat 如果直接开机启动该脚本会弹出一个黑框 我们希望能后台执行它 此时我们需要建一个 vbs脚本来后台执行该脚本 脚本内容为 复制代码代码如下 set ws WScript
  • k8s部署consul集群

    k8s以StatefulSet方式部署consul集群 public service ns yaml apiVersion v1 kind Namespace metadata name public service consul serv
  • 本周总结(爬虫和复习)

    1 爬虫 爬取豆瓣电影top250 代码 爬取的结果 这里只有一部分结果 还有输出部分的拓展程序没有安装完 2 复习 临近期末考试 对本学期所学的内容进行复习和笔记的整理 老师所画的重点要着重复习 不懂的到相应的资源上进行访问
  • STM32F4系列因为VCAP和BYPASS_REG不识别JTAG问题

    下午早早把F429系统板焊完了 上电测试 无法识别JTAG 百度说下载改调SW模式可行 试了一下 依然不行 没办法 仔细对原理图了 发现问题 VCAP接2 2UF电容接地 以前做103板子没见过这玩意 很可以 查了下发现 果然有问题 手册加
  • Tomcat 自动清理日志和缓存

    改方案针对apache tomcat 9 0 17版本 1 catalina host manager localhost manager日志修改 1 在tomcat conf logging properties文件下修改 maxDays
  • Python:模块的绝对导入和相对导入

    思维导图 思维导图中的例子假设我们项目的project结构如下 知识要点 推荐阅读 Python import和from import方法对比 Python 包的调用 路径如何指定 参考资料 1 python from import详解以及
  • 在setup使用ref

  • 015——继承(来 , 看看Java中的继承关系)

    目录 继承 继承概述 使用继承的好处 什么是继承 使用继承的好处 继承后子类的特点 案例演示 继承的设计规范 内存运行原理 继承的设计规范 为什么 内存运行原理 继承的特点 子类是否可以继承父类的构造器 子类是否可以继承父类的私有成员 子类
  • 安卓模拟器中运行C程序

    在 workspace目录下编译好安卓源码 在安卓模拟器中跑一个最简单的C程序 下面来说一下跑C程序的过程 史上最简单的C程序 include
  • 基于MATLAB粒子群算法优化生产调度问题

    基于MATLAB粒子群算法优化生产调度问题 随着企业规模的扩大和竞争的加剧 制造企业越来越重视生产计划安排与协调 生产调度问题是指在生产过程中 对生产资源进行优化调度 以达到最佳生产效率和经济效益的决策问题 在实际应用中 生产调度问题涉及到
  • error:object with buffer protocol required如何解决(学习中问题分析)

    在学习openmv中遇到的问题 object with buffer protocol required 如何解决 根据网上搜索资料得到 F write 如openmv中的串口发送函数 函数需要一个字符串或者字节数组或者bytes对象作为参
  • 【Redis】——AOF持久化

    什么是AOF日志 AOF日志是redis为数据的持久化提供了的一个技术 日志里面记录着执行redis写命令 每当redis执行一条写命令的时候 就会将该命令记录 到AOF日志当中 当redis启动的时候 可以加载AOF日志中的所有指令 并执
  • 学习计划|一个月学会 Python,零基础入门数据分析

    在数据分析领域 python 是一个绕不开的知识和工具 如果不会用 python 就很难说自己会数据分析 但是最近很多想要入门数据分析的小白经常问我 Python 怎么入门 Python 虽然被称作是 最简洁的语言 但是它终究还是一门编程语
  • 笔试

    文章目录 前言 19 IC设计流程 1 确定项目需求 2 前端设计 3 RTL 实现 4 功能验证 5 逻辑综合 DFT 6 形式验证 7 静态时序分析 8 后端设计 20 对数字IC设计的理解 总结 往期精彩 前言 本文首发于微信公众号
  • Java —— 处处是指针

    public class Main public static void main String args String s1 123 String s2 s1 s2 321 System out println s1 int num1 1
  • matlab之简单粒子群的函数寻优

    沉寂了好久 再来CSDN 寻找那一片蔚蓝的天空 编辑环境变了呀 试一下Markdown编辑器 一 关于粒子群算法 粒子群算法是一种智能优化算法 关于智能 个人理解 不过是在枚举法的基础上加上了一定的寻优机制 试想一下枚举法 假设问题的解空间
  • 【Java高级技术】单元测试——概述和快速入门

    单元测试 概述和Junit框架快速入门 1 概述 就是针对最小的功能单元 方法 编写测试代码对其进行正确性测试 可以用来对方法进行测试 它是第三方公司开源出来的 很多开发工具已经集成了Junit框架 比如IDEA 优点 1 可以灵活的编写测
  • 20个有趣的C++实例

    一 简介 这里提供了20个C 有趣的实例 涵盖了基本算法 数据结构与一些LeetCode上常考的编程题 希望这些实例能够帮助您加深对C 的理解 并在实践中不断提高自己 1 打印 Hello World cpp include
  • apt-get常用命令

    apt get 软件包管理器 1 apt get用法 apt get 选项 命令 apt get 选项 install remove pkg1 pkg2 apt get 选项 source pkg1 pkg2 2 命令 update 软件包
  • 在Linux(CentOS)上部署DPDK------命令行方式

    1 DPDK 简介 DPDK Data Plane Development Kit 是数据平面开发工具包 由用于加速在各种CPU架构上运行的数据包处理的库组成 DPDK需要一定的网卡硬件支持 以Intel为例 支持以下网卡 e1000 82