DPDK编译运行

文章目录
  1. 1. 下载源码
  2. 2. 准备环境
    1. 2.1. linux kernel header
    2. 2.2. libpcap函数库
    3. 2.3. hugepages
  3. 3. 编译安装
  4. 4. 加载模块
  5. 5. 绑定网卡
  6. 6. 运行示例
  7. 7. 脚本安装
  8. 8. 示例程序

DPDK(Data Plane Development kit)是Intel发布的数据包处理转发套件。

Title: dpdk编译运行
Author: Yunyao Zhang(张云尧)
E-mail: aidaizyy@gmail.com
Last Modified: 2016-08-23

下载源码

下载DPDK-2.0.0

1
wget http://www.dpdk.org/browse/dpdk/snapshot/dpdk-2.0.0.tar.gz

或者直接访问http://www.dpdk.org/download/ 下载最新的版本。

解开压缩包

1
tar -xvzf dpdk-2.0.0.tar.gz

准备环境

linux kernel header

确保系统是否已安装linux kernel header,未安装则:

1
sudo apt-get install linux-header-3.13.0-49-generic

linux kernel版本号由系统本身决定,以下命令查看:

1
uname -r

kernel版本号必须大于2.6.33。
同时glibc版本号大于2.7。

libpcap函数库

1
sudo apt-get install libpcap-dev

hugepages

查看kernel是否支持hugepapse

1
grep -i huge /boot/config-3.13.0-49-generic

同样,kernel版本号由系统本身决定。
如果出现

1
2
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y

则表示支持hugepages。

查看当前系统hugepages信息

1
grep -i huge /proc/meminfo

配置hugepages

1
2
3
4
5
6
7
8
9
10
11
vi /etc/sysctl.conf
#在文件底部添加
vm.nr_hugepages=512
#表示hugepages的页面数量
vi /etc/fstab
#在文件底部添加
huge /mnt/huge hugetlbfs defaults 0 0
mkdir /mnt/huge
chmod 777 /mnt/huge

重新启动后查看/proc/meminfo 就会发现hugepages已经加载。

1
2
3
4
5
6
AnonHugePages: 53248 kB
HugePages_Total: 512
HugePages_Free: 512
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB

编译安装

1
2
cd dpdk-2.0.0
make install T=x86_64-native-linuxapp-gcc

x86_64指x86构架64位系统。如果是32位系统,将x86_64替换为i686。

官网给出的编译平台规范是ARCH-MACHINE-EXECENV-TOOLCHAIN
ARCH can be: i686, x86_64, ppc_64
MACHINE can be: native, ivshmem, power8
EXECENV can be: linuxapp, bsdapp
TOOLCHAIN can be: gcc, icc

这里在Ubuntu Linux 64位系统本地环境下gcc工具编译

也可以先设置,再编译。

1
2
make config T=x86_64-native-linuxapp-gcc
make

make install会将编译后的文件放入新建的x86_64-native-linuxapp-gcc目录。
make config + make会将编译后的文件放入新建的build目录。

加载模块

1
2
sudo modprobe uio
sudo insmod kmod/igb_uio.ko

uio是kernel自带的用户空间IO模块
igb_uio是dpdk编译的模块,出现在dpdk-2.0.0/build/kmod 或者dpdk-2.0.0/x86_64-native-linuxapp-gcc/kmod 目录中。
(在新版本中可直接用sudo modprobe uio_pci_generic替代uioigb_uio

绑定网卡

查看当前网卡信息
(在新版本中用dpdk-devbind.py替代dpdk_nic_bind.py

1
2
3
4
5
6
7
8
9
10
11
12
cd dpdk-2.0.0
./tools/dpdk_nic_bind.py --status
Network devices using kernel driver
===================================
0000:00:05.0 '82545EM Gigabit Ethernet Controller (Copper)' if=eth0 drv=e1000 unused= *Active*
0000:00:06.0 '82545EM Gigabit Ethernet Controller (Copper)' if=eth1 drv=e1000 unused= *Active*
0000:00:07.0 '82545EM Gigabit Ethernet Controller (Copper)' if=eth3 drv=e1000 unused= *Active*
Other network devices
=====================
<none>

绑定网卡
(在新版本中如果使用了uio_pci_generic,则把--bind=后的igb_uio换成uio_pci_generic

1
./tools/dpdk_nic_bind.py --bind=igb_uio 00:05.0

绑定之前,保证网卡处于非活跃状态

1
ifconfig eth0 down

运行示例

运行helloworld示例

1
2
3
4
5
6
7
8
9
10
11
12
13
#添加环境变量
export RTE_SDK=$SDK/dpdp-2.0.0
export RTE_TARGET=x86_64-native-linuxapp-gcc
#编译
cd /dpdk-2.0.0/example/helloworld
make
#运行
./build/helloworld -c 3 -n 2
hello from core 1
hello from core 0

这里的RTE_SDK指dpdk主目录的路径。

-c COREMASK -n NUM为必须参数
COREMASK: 一个十六进制位掩码表示分配的逻辑内核数量。
NUM: 一个十进制整数表示内存通道数量。

运行完成后,显示
hello from core 1
hello from core 0。

其他示例程序参数有不同要求,参见官方网站的说明文档。

脚本安装

DPDK提供了更简单的脚本安装。
在解开压缩包和设置好环境变量RTE_SDK和RTE_TARGET后,运行setup.sh脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
cd /dpdk-2.0.0
./tools/setup.sh
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
[1] i686-native-linuxapp-gcc
[2] i686-native-linuxapp-icc
[3] ppc_64-power8-linuxapp-gcc
[4] x86_64-ivshmem-linuxapp-gcc
[5] x86_64-ivshmem-linuxapp-icc
[6] x86_64-native-bsdapp-clang
[7] x86_64-native-bsdapp-gcc
[8] x86_64-native-linuxapp-clang
[9] x86_64-native-linuxapp-gcc
[10] x86_64-native-linuxapp-icc
[11] x86_x32-native-linuxapp-gcc
----------------------------------------------------------
Step 2: Setup linuxapp environment
----------------------------------------------------------
[12] Insert IGB UIO module
[13] Insert VFIO module
[14] Insert KNI module
[15] Setup hugepage mappings for non-NUMA systems
[16] Setup hugepage mappings for NUMA systems
[17] Display current Ethernet device settings
[18] Bind Ethernet device to IGB UIO module
[19] Bind Ethernet device to VFIO module
[20] Setup VFIO permissions
----------------------------------------------------------
Step 3: Run test application for linuxapp environment
----------------------------------------------------------
[21] Run test application ($RTE_TARGET/app/test)
[22] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
----------------------------------------------------------
Step 4: Other tools
----------------------------------------------------------
[23] List hugepage info from /proc/meminfo
----------------------------------------------------------
Step 5: Uninstall and system cleanup
----------------------------------------------------------
[24] Uninstall all targets
[25] Unbind NICs from IGB UIO or VFIO driver
[26] Remove IGB UIO module
[27] Remove VFIO module
[28] Remove KNI module
[29] Remove hugepage mappings
[30] Exit Script
Option:

按照脚本指示一步一步运行即可。
依次执行9-12-15-18就可以达到和上面一样的结果。
当然不同情况,脚本执行步骤不同。

示例程序

几个值得关注的示例程序。

转载请注明原作者和出处。

如果觉得这篇文章对您有帮助或启发,请随意打赏~