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,未安装则:
1
| sudo apt-get install linux-header-3.13.0-49-generic
|
linux kernel版本号由系统本身决定,以下命令查看:
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 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替代uio和igb_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
|
绑定之前,保证网卡处于非活跃状态
运行示例
运行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就可以达到和上面一样的结果。
当然不同情况,脚本执行步骤不同。
示例程序
几个值得关注的示例程序。
转载请注明原作者和出处。
如果觉得这篇文章对您有帮助或启发,请随意打赏~