Ubuntu16.04 虚拟机环境下搭建DPDK教程
Date:2018年10月29日
我的虚拟机硬件环境:2核CPU,2G内存。
添加多两块虚拟网卡,在virtualbox或者VMware软件里面设置
两块为intel网卡,网卡*3 (网络连接方式:NAT 桥接 桥接)
如果是VMware,也可以在配置文件中直接修改:
ethernet1.virtualDev = "e1000"
ethernet2.virtualDev = "e1000"
如果是多核numa环境,先执行一些包的安装:
apt-get install numactl
apt-get install libnuma-dev
下面是执行安装过程:
- 下载压缩包
wget https://fast.dpdk.org/rel/dpdk-17.11.4.tar.xz
- 内核版本查看、glibc版本查看,内核版本> = 3.2,glibc> = 7
uname –r
ldd –version
- 解压压缩包
tar -xvf dpdk-17.11.4.tar.xz
- 进入目录usertools
cd ./usertools
- 运行./dpdk-setup.sh
(1)选择,编译源码
编译完成
注意:如果提示找不到numa.h,则安装numa
$ apt-get install libnuma-dev
(2)选择,安装IGB UIO
(3)选择,设置大页内存,我这里设置256个,当然设大点更好,我看网上有设置为1G或2G或更大的巨页内存的,但是我的电脑没有多少空间,只能设置256*2=512MB的了。
查看大页情况:28
(4)选择,绑定网卡
如果出现以下提示,说明网卡处于up状态
这时候需要先把网卡down掉:
ifconfig ens38 down (具体红色的地方根据你的电脑网卡名称来,ifconfig)
ifconfig ens39 down
重新bind,成功。
(5)运行测试程序:testpmd,如果报错,参见下面的异常情况或百度、Google解决:
异常情况:
(1)如果在虚拟机里运行,可能会出现问题,需要修改源代码解决:
DPDK所在文件夹/lib/librte_eal/linuxapp/igb_uio/igb_uio.c中,大约第276行附近,
将
if (pci_intx_mask_supported(udev->pdev))
改为:
if (pci_intx_mask_supported(udev->pdev) || true)
(2)如果在运行测试的时候遇到指令集错误,CPU不支持SSSE3指令集,这种情况还是换个CPU吧!
当然也可以修改rte.cpuflags.mk里面的CPUFLAG解决
运行自带的测试:在脚本那里。
运行pmdtest
输入命令start开始测试,stop停止测试
STOP停止测试:
可以看到发包和收包成功。
DPDK环境到这里就算是搭建并运行成功了!
手动构建(这里我没有手动做,可能有不对的地方。因为上面的是通过脚本自动构建好dpdk环境,所以就不需要手动构建了):
设置hugepages
系统启动前,通过内核参数分配内存:
// 分配1024个2M的页
hugepages=1024
// 分配4个1G的页, 64位应用推荐使用1G的页
default_hugepages=1G hugepagesz=1G hugepages=4
在系统运行的情况,通过修改/proc中参数分配:
// 分配24个2MB的页
echo 24 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
在系统运行时,直接mount挂载hugepages:
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
或者添加到添加到/etc/fstab中,启动时自动挂载:
nodev /mnt/huge hugetlbfs defaults 0 0
1GB的页需要指定页的大小
nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0
准备目标环境:
Make config T= x86_64-native-linuxapp-gcc
修改代码(可省略),编译
Cd /x86_64-native-linuxapp-gcc
Vi .config
make
向内核加载UIO模块:
Modprobe uio
Insmod kmod/igb_uio.ko
手动安装
如果修改config文件,可以先make config T=x86_64-native-linuxapp-gcc,然后cd x86_64-native-linuxapp-gcc,vi .config后再make
例程学习:
开发环境搭建,配置环境变量
export RTE_SDK=/usr/dpdk/dpdk-stable-17.11.4/ (这里就是填你安装的DPDK路径)
export RTE_TARGET=x86_64-native-linuxapp-gcc
1.运行helloworld示例程序
进入helloworld程序目录,执行命令:
make
./build/helloworld –c 3 –n 2
参数说明:
-c表示CPU核的掩码,如果是两个核则可以用3表示
-n表示内存通道数
2.运行l2fwd
L2fwd -c f -n 4 -- -q 8 –p ffff
C CPU核心数
n 内存通道数
q表示每个逻辑核的队列数
p表示端口数,掩码形式表示
3.L3fwd测试:
首先按端口顺序初始化端口
这里l3的转发代码如果是在虚拟机运行的话,可能不会直接成功,需要修改一些地方。
虚拟机的网卡好像一个端口只有一个队列,注意队列数问题,很关键。
修改1:
tx队列数超过网卡的物理队列数问题
修改前:n_tx_queue = nb_lcores;
修改后:n_tx_queue = nb_rx_queue;
修改2:
逻辑核与TX队列绑定关系
修改前:for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++)
修改后:for (lcore_id = 0; lcore_id < RTE_MAX_LCORE && queueid < n_tx_queue; lcore_id++)
即加上TX队列数的限制条件,不得超过TX队列总数。
修改3:
配置修改,执行命令时,加入—parse-ptype,目的是让软件解析数据包类型。