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

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

查看所有标签

猜你喜欢:

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

硅谷之火

硅谷之火

迈克尔·斯韦因 / 王建华 / 机械工业出版社 / 2001-1-1 / 34.00

我们今天正处于这样一个时代:充满幻想的人们发现他们获得了他们曾经梦寐以求的力量,并且可以利用这个力量来改造我们的世界。 这是个转折的时代,跨国公司迷失了发展方向,而小企业家却举起了计算机革命的大旗,成了开拓未来的先锋。在这个时代里,计算机奇才的脸上露出了胜利的微笑,胸怀 大志者成了富有理想的人,而富有理想的人则成了亿万富翁。这是一场真正的革命,它促使人们变得伟大,变得富有而充满理想,自豪而富......一起来看看 《硅谷之火》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具