DPDK之初识与环境搭建

来源:互联网 发布:波士顿矩阵图怎么制作 编辑:程序博客网 时间:2024/06/08 07:01

DPDK是什么?

Intel® DPDK全称Intel Data Plane Development Kit,是intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它不同于Linux系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。基于DPDK开发的服务或应用都运行与Linux的用户空间,这样大大增加了其灵活性和应用的广泛性。
DPDK的产生有其历史发展的原因,在互联网发展的初期,人们面对的主要是10K问题,但是随着操作系统技术的进步,各种I/O框架的不断优化与发展,10K问题在今天早已不存在。但问题总是不断产生的,随着互联网的发展,对于服务器的处理要求也不断加大,所以人们想出了多线程模型,多进程模型等服务器开发方法,甚至到目前的分布式模型,像负载均衡技术也是基于这样的背景下为了结局分布式模型下存在的问题而产生的。
到这儿有人可能会说网络I/O和处理应该是能够满足我们的要求了吧,但正如前面所说的,问题总是不断产生的,需求也是不断在变化的。所以DPDK又应运而生,DPDK所主要解决的问题有两方面,进一步提高网络I/O的性能,另一个方面是提供网络开发中更多的灵活性和更大的想象空间。
DPDK基于现有Linux网络模型所存在的问题进行了如下方面的改进:

  1. 数据层全部由应用程序来处理,减少系统调度、系统调用、系统中断,上下文切换等。
  2. 摒弃Linux内核协议栈,将数据包传输到用户空间定制协议栈。
  3. 使用多核编程技术替代多线程,将OS绑在指定核上运行。
  4. 针对SMP系统,使CPU尽量使用所在NUMA系统节点的内存,减少内存刷写。
  5. 使用大页面,减少访问。
  6. 采用无锁技术解决多核或多线程的竟争问题。

环境搭建

对DPDK有一个基础的背景认识我们就可以来看看DPDK具体是个什么东西了。在开始前我们需要先准备如下几个东西:

  • DPDK源码:git clone git://dpdk.org/dpdk ;当然也可以从http://dpdk.org/download直接下载。
  • 虚拟机,这儿我们以qemu为例,当然也可以选择其它虚拟机,或者你的网卡直接支持DPDK也可以忽略以下将要讲的虚拟机安装的步骤。
    qemu: http://www.qemu.org/
    网卡支持查询: http://dpdk.org/doc/nics
  • Linux系统镜像,在这推荐Ubuntu 16.04

虚拟机安装与系统安装

  • 安装虚拟机
$ sudo apt-get install qemu$ sudo apt-get install virt-manager
  • 安装系统
    执行以下命令打开虚拟机管理界面
$ virt-manager
  • 新建虚拟机
    点击‘新建虚拟机’按钮,配置从iso image引导安装,架构选择x86_64,然后点击’下一步‘
    配置第一步

    这一步配置好我们准备好的系统镜像路径:
    这里写图片描述

    配置虚拟机参数:
    这里写图片描述

    为虚拟机创建一块硬盘:
    这里写图片描述

    接下来点击下一步直到完成虚拟机创建,点击完成后会自动启动并开始安装指定的linux系统,安装过程这儿不再介绍,等到系统安装完成后我们再执行下面的步骤
    这里写图片描述

    双击上图的虚拟机打开如下图那样的虚拟机管理界面,并切换到虚拟机硬件详情界面添加网卡,在这儿网卡的型号特别重要,如图选择的是’e1000’,其它默认即可。
    这里写图片描述
    一切的设置好后启动虚拟机,可以查看到如下网卡信息
    网卡信息

在开始下一步之前我们需要将我们需要的网卡down掉

$ sudo ifconfig eth1 down$ sudo ifconfig eth2 down$ sudo ifconfig eth3 down

编译与运行第一个例子

完成了以上步骤后,我们就可以开始开始编译DPDK了,跳转到DPDK的源码路径,然后开始编译。如下所示,(注:下面’…’的地方为对命令输出内容的省略,实际操作时会打印详细的操作提示; Option:为操作提示的选项,按顺序执行如下选项的操作即可完成DPDK的编译)

$ source ./usertools/dpdk-setup.sh...Option: 12 (选择目标并编译)Option: 15 (加载驱动)Option: 18 (配置HugePage,选18后要求输入的参数任意,可按提示输入64)Option: 21 (这一步是绑定网卡与驱动,参数值为xx:xx.x形式的pci地址,可多个网卡同时绑定,中间用空格分隔,如:00:09.0 00:0a.0 00:0b.0)Option: 25 (这一步执行测试程序,如果执行是出现"Connot allocate memory"的错误,只要把app/test-pmd/testpmd.c源码中的mp_anon的值从0改成1就可以了,这个问题的本质原因是内存中没有大块的连续内存空间了)Option: 32

完成以上所有操作后DPDK编译环境就配置ok了,在DPDK源码路径下会出现一个新的目录x86_64-native-linuxapp-gcc, 同时RTE_SDK和RTE_TARGET两个环境变量也被设置,这两个环境变量查看方法如下:

$ env | grep RTE_

至此DPDK的所有环境与配置都已经完成,接下来我们可以编译基于DPDK开发的应用并运行。
和许多计算机技术的入门学习一样,DPDK的example中提供了一个helloworld示例,我们进入helloworld路径并编译执行。

$ cd examples/helloworld$ make$ sudo ./build/helloworld

如下 图所示,一个基于DPDK开发的应用就这样编译运行了起来,其中有一点需要特别注意,程序执行是必须加sudo权限,因为程序初始化阶段会对HugePage做相关初始化操作,只有具有root权限的用户才能操作HugePage
运行截图

helloworld已经运行起来了,我们就来看看其源码,了解下helloworld都做了什么?

static intlcore_hello(__attribute__((unused)) void *arg){        unsigned lcore_id;        lcore_id = rte_lcore_id();        printf("hello from core %u\n", lcore_id);        return 0;}intmain(int argc, char **argv){        int ret;         unsigned lcore_id;        ret = rte_eal_init(argc, argv);        if (ret < 0)                rte_panic("Cannot init EAL\n");        /* call lcore_hello() on every slave lcore */        RTE_LCORE_FOREACH_SLAVE(lcore_id) {                rte_eal_remote_launch(lcore_hello, NULL, lcore_id);        }        /* call it on master lcore too */        lcore_hello(NULL);        rte_eal_mp_wait_lcore();        return 0;}

我们按步骤分析其过程:

  1. rte_eal_init,首先调用了这个接口完成了一个初始化操作,这个接口是DPDK最重要也是最基础的一个接口,所有基于DPDK的应用开发,在使用DPDK的其它任何接口前都应该先调用这个接口完成DPDK整个运行环境的初始化,否则其它接口几乎都不能使用。
  2. 20-27行完成了一个任务分发的工作,首先利用rte_eal_remote_launch接口让每个slave logic core执行lcore_hello这个任务,同时master logic core也执行这个任务,master core任务执行完后,等待其它logic core任务执行完毕,都执行完毕后整个进程结束。

hello world这个例子演示了一个基本的基于DPDK的程序框架,其它还有很多DPDK所提供的高级特性和接口,比如多进程编程,多核并发,分布式处理架构等等,这些在以后的章节将对其原理和应用进行详细描述。

原创粉丝点击