DPDK 源码的不完全笔记(一) 初识DPDK

栏目: 服务器 · 发布时间: 5年前

内容简介:本系列记录了作者在项目过程中由于好奇心驱使而了解到的部分您可以学习到您不能学习到

写在前面

本系列记录了作者在项目过程中由于好奇心驱使而了解到的部分 DPDK 实现细节。比较适合有同样好奇心的 DPDK初学者 ,通过本系列文章

您可以学习到

  • DPDK的整体工作原理以及部分实现细节

您不能学习到

  • 应用DPDK进行性能调优

如果对 DPDK 的起源不是很清楚的话,可以先浏览下 绝对干货!初学者也能看懂的DPDK解析 ,重点就是 Linux + x86网络IO瓶颈 这部分,总结一句话就是 Linux内核协议栈太慢了 ,为了突破这种性能瓶颈, DPDK 的方案是绕过(bypass)内核,直接从网卡把数据抓到用户空间。

一些基本的概念

EAL

首先必须明白的一点就是, DPDK 是以若干个 lib 的形式提供给应用链接使用,其中最终要的一个 lib 就是 EAL 了, EAL 的全称是(Environment Abstraction Layer, 环境抽象层),它负责为应用间接访问底层的资源,比如内存空间、线程、设备、定时器等。如果把我们的应用比作一个豪宅的主人的话, EAL 就是这个豪宅的管家。

lcore & socket

这两个概念在 DPDK 的代码中随处可见, 注意 这里的 socket 不是网络编程里面的那一套东西,而是 CPU 相关的东西。具体的概念可以参看 Differences between physical CPU vs logical CPU vs Core vs Thread vs Socket 或者其翻译版本 physical CPU vs logical CPU vs Core vs Thread vs Socket(翻译)

对我们来说,只要知道可以 DPDK 可以运行在多个 lcore 上就足够了.

DPDK 如何知道有多少个 lcore 呢 ? 在启动时解析文件系统中的特定文件就可以了, 参考函数 eal_cpu_detected

DPDK的运行形式

大部分 DPDK 的代码是以 lib 的形式运行在用户应用的进程上下文.为了达到更高的性能。应用通常都会 多进程 或者 多线程 的形式运行在不同的 lcore

多线程的场景:

DPDK 源码的不完全笔记(一) 初识DPDK

多进程的场景:

多进程的场景下,多个应用实例如何保证关键信息(比如内存资源)的一致性呢? 答案是不同进程将公共的数据 mmap 同一个文件,这样任何一个进程对数据的修改都可以影响到其他进程。

DPDK 源码的不完全笔记(一) 初识DPDK

Primary & Secondary

多进程场景下,进程有两种角色 Primary 或者 Secondary ,正如其名字, Primary 进程可以 create 资源,而 Secondary 进程只能 attach 已存在的资源。一山不容二虎,一个多进程的应用,有且只有一个 Primary 进程,其余都是 Secondary 进程。应用可以通过命令行参数 --proc-type 来指定应用类型。

DPDK的入口

如同 main 函数在应用程序中的地位, rte_eal_init 函数便是 DPDK 梦开始的地方(其实前面的图已经画出来了!),我们来看看它做了什么事。

/* Launch threads, called at application init(). */
int
rte_eal_init(int argc, char **argv)
{
    thread_id = pthread_self();

    rte_eal_cpu_init();

    eal_parse_args(argc, argv);

    rte_config_init();

    rte_eal_intr_init();

    rte_mp_channel_init();
    
    rte_eal_memzone_init();
    
    rte_eal_memory_init();

    rte_eal_malloc_heap_init()
    
    eal_thread_init_master(rte_config.master_lcore);

    RTE_LCORE_FOREACH_SLAVE(i) {
        /* create a thread for each lcore */
        ret = pthread_create(&lcore_config[i].thread_id, NULL,
                     eal_thread_loop, NULL);
    
        .....
    }

    /*
     * Launch a dummy function on all slave lcores, so that master lcore
     * knows they are all ready when this function returns.
     */
    rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER);
    
    rte_eal_mp_wait_lcore();

    ......
}

总结起来就是

lcore

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

集体智慧编程

集体智慧编程

TOBY SEGARAN / 莫映、王开福 / 电子工业出版社 / 2009-1 / 59.80元

本书以机器学习与计算统计为主题背景,专门讲述如何挖掘和分析Web上的数据和资源,如何分析用户体验、市场营销、个人品味等诸多信息,并得出有用的结论,通过复杂的算法来从Web网站获取、收集并分析用户的数据和反馈信息,以便创造新的用户价值和商业价值。全书内容翔实,包括协作过滤技术(实现关联产品推荐功能)、集群数据分析(在大规模数据集中发掘相似的数据子集)、搜索引擎核心技术(爬虫、索引、查询引擎、Page......一起来看看 《集体智慧编程》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具