0、dpdk介绍

DPDK主要用到三个技术点分别为hugetlbpage、uio以及cpu affinity;

1)关于hugetlbpage,它的主要好处当然是通过利用大内存页提高内存使用效率;

2)而uio是实现用户空间下驱动程序的支撑机制,由于DPDK是应用层平台,所以与此紧密相连的网卡驱动程序(当然,主要是intel自身的千兆igb与万兆ixgbe驱动程序)都通过uio机制运行在用户态下;

3)cpu affinity机制是多核cpu发展的结果,在越来越多核心的cpu机器上,如何提高外设以及程序工作效率的最直观想法就是让各个cpu核心各自干专门的事情,比如两个网卡eth0和eth1都收包,可以让cpu0专心处理eth0,cpu1专心处理eth1。DPDK利用cpu affinity主要是将控制面线程以及各个数据面线程绑定到不同的cpu,省却了来回反复调度的性能消耗,各个线程一个while死循环,专心致志的做事,互不干扰;

1、所用系统与软件版本

系统:CentOS Linux release 7.0.1406 64位
dpdk: 1.8.0 (下载页

2、虚拟机配置

虚拟机软件:VMWare WorkStation 10.0.1 build-1379776
CPU: 3个CPU, 每个CPU1个核心
内存:1GB
网卡:intel网卡*2, 用于dpdk试验;另一块网卡用于和宿主系统进行通信

3、dpdk安装/测试

3.1、准备

安装CentOS虚拟机时,如果选择minimal安装,还需要安装其下的基本开发工具集(含gcc,python等)
另外,dpdk提供的dpdk_nic_bind.py脚本中会调用到lspci命令,这个默认没有安装,运行以下命令安装(不安装此工具则无法绑定网卡):

ifconfig默认也没有安装,如果想用它,应运行:

在CentOS上,要绑定给dpdk使用的网卡在绑定前,可能是活动的(active),应将其禁用,否则无法绑定。禁用的一种方式是运行:(eno33554984是接口名,如同eth0一样)

安装kernel-devel

3.2、通过setup脚本进行配置

dpdk提供了一个方便的配置脚本: /tools/setup.sh,通过它可以方便地配置环境;
1) 设置环境变量,这里是linux 64位的配置

2)运行setup.sh,显示如下

选择9

3)选择11, 插入igb_uio模块

4)选择14,配置大页内存(非NUMA),选择后会提示你选择页数,输入64

选择24,可以确认一下大页内存的配置:

5)选择17, 绑定dpdk要使用的网卡

绑定好后,选择16,可以查看当前的网卡配置:

6)选择21, 运行testpmd测试程序

注意,运行这个测试程序,虚拟机最好提供2个网卡用于dpdk;

输入start, 开始包转发

输入stop,停止包转发,这时会显示统计信息

3.3、通过命令配置

1)编译dpdk

进入dpdk主目录,输入

进行编译

2)配置大页内存(非NUMA)

可以用以下命令查看大页内存状态:

3)安装igb_uio驱动

4)绑定网卡

先看一下当前网卡的状态

进行绑定:

5) 运行testpmd测试程序

6)编译运行其他示例程序

<dpdk>/examples下面有很多示例程序,这些程序在dpdk编译时,没有被编译。这里以编译helloworld为例,首先要设置环境变量:

之后进入/examples/helloworld,运行make,成功会生成build目录,其中有编译好的helloworld程序;

4、错误

EAL: Error reading from file descriptor

这个bug已经由dpdk的开发人员修复,patch内容如下:

 

Cause: Creation of mbuf pool for socket 0 failed

肯定是hugepage分配少了…