dpdk 在VMware 中的安装部署

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dumpling5232/article/details/53241162

dpdk简介

dpdk 是intel提供的提升数据面报文处理速率的应用程序开发包,它只要是利用一下几个特点优化报文处理过程,从而加快报文处理速度:

1、用大页缓存支持来提高内存访问速率。

2、利用UIO支持,提供应用空间下驱动程序的支持,也就是说驱动程序运行在用户空间的,减少了报文在用户空间和应用空间的多次拷贝。

3、利用Linux 亲和性支持,把控制面的线程及各个数据面线程绑定到不同的cpu 核,节省了线程在cpu间的调度。

4、提供内存池和无锁环形缓存管理,加快内存访问速率。

dpdk在VMware中的部署

1.配置虚拟机

我配置的cpu参数如下:


我安装的是ubuntu 14.04 (32位)Linux 内核版本是:Linux version 4.4.0-47-generic 

其中VMware安装虚拟机默认的网卡是AMD,dpdk 需要intel 的网卡,因此需要在启动虚拟机之前修改vmware 配置,使其成为intel 虚拟网卡。

我的配置文件地址是:E:\ubuntunew\Ubuntu.vmx,在配置文件最后添加:

ethernet1.virtualDev = "e1000"
ethernet2.virtualDev = "e1000"

e1000 是intel网卡中心的一个千兆网卡,因为我添加了两个网卡,所以我这是上面这样配置的,你可以根据你具体的情况做相应修改。

2.部署dpdk

在这之前最好切换到root 

1)、下载源码

在开启虚拟机后,从dpdk官网下载最新的code

  1. git clone git://dpdk.org/dpdk 

2)、设置环境变量

进入dpdk目录,将下面两行放到dpdkrc中,因为我的是32位的,所以我配置的是export RTE_TARGET=i686-native-linuxapp-gcc。

export RTE_SDK=`pwd`
export RTE_TARGET=i686-native-linuxapp-gcc


再source 这个文件。

3)、用dpdk的脚本运行dpdk;

运行脚本进行dpdk测试; 

然后再运行脚本

  1. ./tools/dpdk-setup.sh  





第一步选择gcc 32位编译源码。选6、
第二步安装IGB UIO 选16
第三步设置hugepage 选19 (我填的512 ,太小了会出问题)
第四步绑定网卡 22

注意:把一开始配置的两个intel千兆网卡绑定,这中间可能会报错:
  1. Enter PCI address of device to bind to IGB UIO driver: 02:06.0 02:07.0  
  2. Routing table indicates that interface 0000:02:06.0 is active. Not modifying  
  3. OK  
可能是你绑定的网卡目前处于up状态,所以需要执行 down 命令将其关闭。
例如关闭eth2:
ifconfig eth2 down  
关闭之后再绑定就没问题了。
选21查看网卡状态:
igb_uio 驱动已经绑定上了。

4)、运行测试用例;

选26运行测试用例。虚拟机只有2个cpu ,所以按照16进制掩码就选择了 0x3  ,回车运行一下
输入start 开始,过一会输入stop停止

注意:每次使用

dpdk

的时候,都必须把加载

IGB

模块、设置页大小、绑定网卡做一遍,除

非把这一些操作添加进启动项。


其它:
1、每次使用dpdk 的时候,必须报IGB模块、设置页大小、绑定网卡做一遍。
2、运行测试用例的时候如果报错:
EAL: Error reading from file descriptor 13: Input/output error
解决办法:由于虚拟机里运行机制造成的,需要修改下源码,打开dpdk源代码目录下的 lib/librte_eal/linuxapp/igb_uio里的igb_uio.c文件,找到下图所示的代码:
把代码:
 if (pci_intx_mask_supported(dev)) { 
	 dev_dbg(&dev->dev, "using INTX");
	 udev->info.irq_flags = IRQF_SHARED;
	 udev->info.irq = dev->irq;  
	 udev->mode = RTE_INTR_MODE_LEGACY;     
	 break;             
 }dev_notice(&dev->dev, "PCI INTX mask not supported\n"); 


修改为:

	 dev_dbg(&dev->dev, "using INTX");
	 udev->info.irq_flags = IRQF_SHARED;
	 udev->info.irq = dev->irq;  
	 udev->mode = RTE_INTR_MODE_LEGACY;     
	 break;   

重新编译即可。
3、如果运行测试数据期间报错:
EAL: Error - exiting with code: 1 Cause: Creation of mbuf pool for socket 0 
意思是创建缓冲池失败,我们退回到分配页大小的地方,分配更大的hugepage,如果最大的hugepage仍然报错,就关闭虚拟机,给该虚拟机设置更大的内存,问题就得以解决。

展开阅读全文

没有更多推荐了,返回首页