一、首先我们需要准备一个物理机或者一个虚拟机。
物理机:
需要一个高性能的网卡跑dpdk和一个普通网卡进行网络通信,机器安装Ubuntu16.04.
虚拟机:
使用vnware安装Ubuntu16.04,配置一个多队列网卡和一个普通网卡。
二、虚拟机配置
如果使用物理机,我们不需要做任何配置,只需要安装Ubuntu16.04即可。如果没有物理机,我们就需要使用vmware安装Ubuntu 16.04,并且进行下面的配置。
1.添加一个多队列网卡
2.修改新增的网卡类型
修改虚拟机所在的目录中的vmx文件。
修改下面的参数:
ethernet1.virtualDev = "e1000"
改为
ethernet1.virtualDev = "vmxnet3"
使得这个网卡为高性能的网卡。
3.修改虚拟机网卡名字
我们要修改ens33网卡名为eth0,需要修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX参数后面添加net.ifnames=0 biosdevname=0:
GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US net.ifnames=0 biosdevname=0"
然后执行下面的命令:
sudo grub-mkconfig -o /boot/grub/grub.cfg
4.重启
5.查看网卡信息:
我们可以看到有两个网卡了,一个普通网卡eth1和一个多队列网卡eth0,我们可以看到多队列网卡eth0有8个接受队列。
三、dpdk配置内存巨型页
Ubuntu16.04支持内存巨型页,但是还是要我们修改启动参数,设置巨型页大小和数量,设置方法是修改linux启动参数,我们需要修改/etc/default/grub文件的GRUB_CMDLINE_LINUX参数,添加default_hugepages=1G hugepagesz=2M hugepages=1024
GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US net.ifnames=0 biosdevname=0 default_hugepages=1G hugepagesz=2M hugepages=1024"
然后执行下面的命令:
sudo grub-mkconfig -o /boot/grub/grub.cfg
再重启就可以了。
四、dpkg源代码下载和编译。
1.下载源代码
我们dpdk官方网站上下载dpdk源代码,链接在这里,随便挑选版本,不同版本直接子系统接口会有差异,建议选择 dpdk 19.08.2。
2.解压源代码
我们把压缩包放到/home/jian/share/目录中,解压后得到/home/jian/share/dpdk-stable-19.08.2的源代码。
3.安装编译环境
sudo apt-get install libnuma-dev
4.编译工具链
dpdk的源代码中自带的脚本来编译工具链,我们在/home/jian/share/dpdk-stable-19.08.2目录中执行下面的脚本:
./usertools/dpdk-setup.sh
然后选择39,具体log看下面:
jian@ubuntu:~/share/dpdk-stable-19.08.2$ ./usertools/dpdk-setup.sh
------------------------------------------------------------------------------
RTE_SDK exported as /home/jian/share/dpdk-stable-19.08.2
------------------------------------------------------------------------------
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
[1] arm64-armada-linuxapp-gcc
[2] arm64-armada-linux-gcc
[3] arm64-armv8a-linuxapp-clang
[4] arm64-armv8a-linuxapp-gcc
[5] arm64-armv8a-linux-clang
[6] arm64-armv8a-linux-gcc
[7] arm64-bluefield-linuxapp-gcc
[8] arm64-bluefield-linux-gcc
[9] arm64-dpaa2-linuxapp-gcc
[10] arm64-dpaa2-linux-gcc
[11] arm64-dpaa-linuxapp-gcc
[12] arm64-dpaa-linux-gcc
[13] arm64-octeontx2-linuxapp-gcc
[14] arm64-octeontx2-linux-gcc
[15] arm64-stingray-linuxapp-gcc
[16] arm64-stingray-linux-gcc
[17] arm64-thunderx2-linuxapp-gcc
[18] arm64-thunderx2-linux-gcc
[19] arm64-thunderx-linuxapp-gcc
[20] arm64-thunderx-linux-gcc
[21] arm64-xgene1-linuxapp-gcc
[22] arm64-xgene1-linux-gcc
[23] arm-armv7a-linuxapp-gcc
[24] arm-armv7a-linux-gcc
[25] i686-native-linuxapp-gcc
[26] i686-native-linuxapp-icc
[27] i686-native-linux-gcc
[28] i686-native-linux-icc
[29] ppc_64-power8-linuxapp-gcc
[30] ppc_64-power8-linux-gcc
[31] x86_64-native-bsdapp-clang
[32] x86_64-native-bsdapp-gcc
[33] x86_64-native-freebsd-clang
[34] x86_64-native-freebsd-gcc
[35] x86_64-native-linuxapp-clang
[36] x86_64-native-linuxapp-gcc
[37] x86_64-native-linuxapp-icc
[38] x86_64-native-linux-clang
[39] x86_64-native-linux-gcc
[40] x86_64-native-linux-icc
[41] x86_x32-native-linuxapp-gcc
[42] x86_x32-native-linux-gcc
----------------------------------------------------------
Step 2: Setup linux environment
----------------------------------------------------------
[43] Insert IGB UIO module
[44] Insert VFIO module
[45] Insert KNI module
[46] Setup hugepage mappings for non-NUMA systems
[47] Setup hugepage mappings for NUMA systems
[48] Display current Ethernet/Baseband/Crypto device settings
[49] Bind Ethernet/Baseband/Crypto device to IGB UIO module
[50] Bind Ethernet/Baseband/Crypto device to VFIO module
[51] Setup VFIO permissions
----------------------------------------------------------
Step 3: Run test application for linux environment
----------------------------------------------------------
[52] Run test application ($RTE_TARGET/app/test)
[53] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
----------------------------------------------------------
Step 4: Other tools
----------------------------------------------------------
[54] List hugepage info from /proc/meminfo
----------------------------------------------------------
Step 5: Uninstall and system cleanup
----------------------------------------------------------
[55] Unbind devices from IGB UIO or VFIO driver
[56] Remove IGB UIO module
[57] Remove VFIO module
[58] Remove KNI module
[59] Remove hugepage mappings
[60] Exit Script
Option: 39
编译成功则如下图所示:
5.设置dpdk的环境变量
上面编译成功之后需要退出脚本,然后执行下面的命令设置环境变量:
export RTE_SDK=/home/jian/share/dpdk-stable-19.08.2
export RTE_TARGET=x86_64-native-linux-gcc
6.禁止eth0
由于我们的多队列网卡是eth0,所以接下来我么都是操作eth0.
我们先使用下面的命令把eth0禁止:
sudo ifconfig eth0 down
7.igb_uio模块
设置完dpdk环境变量和禁止eth0后,我们再次执行脚本插入igb_uio模块:
./usertools/dpdk-setup.sh
然后选择43,具体log看下面:
插入igb_uio模块后,我们选择49绑定igb_uio模块到eth0,我们输入我们的PCI地址:0000:03:00:0,就可以成功绑定我们的网卡到igb_uio模块了,详细log如图所示:
8.运行testpmd程序
为了测试我们dpdk环境是否ok,我们尝试运行一下dpdk自带的测试程序testpmd。
option我们选择53,然后bitmask设置为7,运行成功则如下图所示:
这时候我们可以输入指令 show port info 0 查看我们的接口信息:
9.运行第一个dpdk程序
dpdk的源代码有很多例子程序,都放在example目录中,其中有个最简单的程序helloworld,我们进入example/helloworld中,直接make,可以编译出helloworld程序。最后我们使用root权限执行,结果如下图所示:
到此为止,我们的dpdk环境已经准备好了。下次我们尝试自己编写一个dpdk程序,88!