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
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测试;
然后再运行脚本
./tools/dpdk-setup.sh
第一步选择gcc 32位编译源码。选6、
第二步安装IGB UIO 选16
第三步设置hugepage 选19 (我填的512 ,太小了会出问题)
第四步绑定网卡 22
注意:把一开始配置的两个intel千兆网卡绑定,这中间可能会报错:
Enter PCI address of device to bind to IGB UIO driver: 02:06.0 02:07.0
Routing table indicates that interface 0000:02:06.0 is active. Not modifying
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仍然报错,就关闭虚拟机,给该虚拟机设置更大的内存,问题就得以解决。