Ubuntu16.04 虚拟机环境下搭建DPDK教程

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

 

下面是执行安装过程:

  1. 下载压缩包

wget https://fast.dpdk.org/rel/dpdk-17.11.4.tar.xz

  1. 内核版本查看、glibc版本查看,内核版本> = 3.2glibc> = 7

uname –r

ldd –version

  1. 解压压缩包
tar -xvf dpdk-17.11.4.tar.xz
  1. 进入目录usertools
cd ./usertools
  1. 运行./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,目的是让软件解析数据包类型。

猜你喜欢

转载自blog.csdn.net/shhchen/article/details/88554777