1 前置知识点学习(了解)

从CPU到实际的存储节点,依据层级划分:Channel > DIMM > Rank > Chip > Bank > Row /Column


1.1 channel

CPU到内存的通路是channel,每个channel对应一个CPU的内存控制器,每个channel可以配有多个DIMM。

双通道:CPU外核或北桥有两个内存控制器,每个控制器控制一个内存通道。理论上内存带宽增加一倍。

四通道同理。

1.2 DIMM

全称Dual-Inline-Memory-Modules(双列直插式存储模块),是目前最常见的内存模块( 可以理解为内存条)。

以前的主机是直接将存储芯片(chip)插在主板上的,然后发展出SIMM(Single In-line Memory Module),将多个chip焊在一片电路板上,成为内存模块,再将它插到主板上。

1.3 Rank

DIMM上一部分或所有chip组成一个rank(64bit),因此内存至少需要有16片4bit的chip或者8bit的chip(不存在4bit和8bit芯片混搭的情况)。

内存控制器只允许CPU每次与内存进行一组64bits的数据交换,对应的就是一个rank。rank也可以理解为连接到同一个CS(chip select)的一组chip。

rank分类:

  • Single-Rank(1R),要动用到DIMM上所有的chip,这些chip由同一个片选信号控制。

  • Double-Rank(2R),产生2个64位rank,由2个片选信号控制,这2个片选信号是交错的,不争抢内存总线。
  • Quad-Rank(4R),产生4个64位rank,由4个片选信号控制,这4个片选信号是交错的,不争抢内存总线。

在地址选择时,只有当片选信号有效时,此片所连的地址线才有效。

1.4 chip

内存条上的黑色芯片就是chip,提供4bit/8bit/16bit/32bit的数据,提供4bit的芯片记作x4,提供8bit的芯片记作x8。

1.5 其他

再往下的bank、Row /Column这里可以暂时不用关心了,通过上文的示意图中了解一下就行。

2 DPDK Mempool 库

内存池是一个具有固定大小的对象分配器。 在DPDK中,它由名称唯一标识,并且使用mempool handler来存储空闲对象。 默认的mempool handler是基于ring的。它提供了一些可选的服务,例如“per-core缓存”和“内存对齐”,内存对齐能确保对象被填充,以在所有DRAM或DDR3通道上均匀分布。

这个库由 Mbuf Library 使用。

2.1 Cookies保护字段

在调试模式中(CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG is enabled),将在块的开头和结尾处添加cookies。 分配的对象包含保护字段,以帮助调试缓冲区溢出。

2.2 Stats统计信息

在调试模式中(CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG is enabled),从池中获取、释放的统计信息存放在mempool结构体中。 为了避免并发访问统计计数器,统计信息是per-lcore的。

2.3 内存对齐约束

根据X86架构上的硬件内存配置,可以通过在对象之间添加特定的填充来极大地提高性能。目的是确保每个对象的起始位置被均匀的分布在不同的channel和rank上,以便实现所有通道的负载均衡。

当执行L3转发或流分类时,对于包缓冲区尤其如此。只访问前64个字节,因此可以通过将对象的开始地址分布在不同的通道中来提高性能。

DIMM上的rank数目是可访问DIMM完整数据位宽的独立DIMM集合的数量。 由于他们共享相同的路径,因此rank不能被同时访问。 DIMM上的DRAM芯片的物理布局不一定与rank数目相关。

当运行app时,EAL命令行选项提供了添加内存通道和rank数目的能力。

注:命令行必须始终指定处理器的内存通道数目。

不同DIMM架构的对齐示例如下两张图所示 。在例子中,我们假设包是16个64字节的块(在实际应用中这是不正确的)。

例1:Two Channels and Quad-ranked DIMM Example

例2:Three Channels and Two Dual-ranked DIMM Example

Intel® 5520芯片组有三个通道,因此,在大多数情况下,对象之间不需要填充。(除了大小为n x 3 x 64B的块)

当创建一个新池时,用户可以指定使用此功能。

我的疑问:

这里的例子是从dpdk官网拷贝过来的,我有个疑问,如果有谁知道麻烦给我留言。

例2中的pkt0根据图上看明明是starts at channel 0, rank0,为什么图上标注的是rank1?如果从图上看,这里只保证了起始于不同channel,但仍是同一个rank而且是同一个DIMM。根据原文描述,pkt只要不是n x 3 x 64B的大小就不需要填充,感觉只是保证起始在不同channel就可以了。这个问题搜索了很久没有满意的答案。

2.4 本地缓存

在CPU使用率方面,由于每个访问需要compare-and-set (CAS)操作,所以多核访问内存池的空闲缓冲区成本比较高。 为了避免对内存池ring的访问请求太多,内存池分配器可以维护per-core cache,并通过实际内存池中具有较少锁定的缓存对内存池ring执行批量请求。 通过这种方式,每个core都可以访问自己空闲对象的缓存(带锁), 只有当缓存填充时,内核才需要将某些空闲对象重新放回到缓冲池ring,或者当缓存空时,从缓冲池中获取更多对象。

虽然这意味着一些buffer可能在某些core的缓存上处于空闲状态,但是core可以无锁访问其自己的缓存提供了性能上的提升。

缓存由一个小型的per-core表及其长度组成。可以在创建池时启用/禁用此缓存。

缓存大小的最大值是静态配置,并在编译时定义的(CONFIG_RTE_MEMPOOL_CACHE_MAX_SIZE)。

不同于per-lcore内部缓存,应用程序可以通过接口 rte_mempool_cache_create() , rte_mempool_cache_free() 和 rte_mempool_cache_flush() 创建和管理外部缓存。 这些用户拥有的缓存可以被显式传递给 rte_mempool_generic_put() 和 rte_mempool_generic_get() 。 接口 rte_mempool_default_cache() 返回默认内部缓存。 与默认缓存相反,用户拥有的高速缓存可以由非EAL线程使用。

2.5 Mempool handlers

这允许外部存储子系统,如外部硬件存储管理系统和软件存储管理与DPDK一起使用。

mempool handler包括两方面:

  • 添加新的mempool操作代码。这是通过添加mempool ops代码,并使用 MEMPOOL_REGISTER_OPS 宏来实现的。

  • 使用新的API调用 rte_mempool_create_empty() 及 rte_mempool_set_ops_byname() 用于创建新的mempool,并制定用户要使用的操作。

在同一个应用程序中可能会使用几个不同的mempool处理。 可以使用 rte_mempool_create_empty() 创建一个新的mempool,然后用 rte_mempool_set_ops_byname() 将mempool指向相关的 mempool处理回调(ops)结构体。

传统的应用程序可能会继续使用旧的 rte_mempool_create() API调用,它默认使用基于ring的mempool处理。 这些应用程序需要修改为新的mempool处理。

对于使用 rte_pktmbuf_create() 的应用程序,有一个配置设置(RTE_MBUF_DEFAULT_MEMPOOL_OPS),允许应用程序使用另一个mempool处理。

2.6 用例

需要高性能的所有分配器应该使用内存池实现。 以下是一些使用实例:

  • Mbuf Library
  • Environment Abstraction Layer
  • 任何需要在程序中分配固定大小对象,并将被系统持续使用的应用程序

引用参考资料:

1)dpdk官方文档:http://doc.dpdk.org/guides-20.02/prog_guide/mempool_lib.html

2)RAM结构与原理:https://www.techbang.com/posts/18381-from-the-channel-to-address-computer-main-memory-structures-to-understand

3)DDR扫盲——single rank与dual-rank:https://www.sohu.com/a/168446287_781333

DPDK Mempool 库原理(学习笔记)的更多相关文章

  1. DPDK LPM库(学习笔记)

    1 LPM库 DPDK LPM库组件为32位的key实现了最长前缀匹配(LPM)表查找方法,该方法通常用于在IP转发应用程序中找到最佳路由匹配. 2 LPM API概述 LPM组件实例的主要配置参数是 ...

  2. [Python ]小波变化库——Pywalvets 学习笔记

    [Python ]小波变化库——Pywalvets 学习笔记 2017年03月20日 14:04:35 SNII_629 阅读数:24776 标签: python库pywavelets小波变换 更多 ...

  3. Unity3D 骨骼动画原理学习笔记

    最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...

  4. DPDK Mbuf Library(学习笔记)

    1 Mbuf库 Mbuf库提供了分配和释放缓冲区(mbufs)的功能,DPDK应用程序可以使用这些mbufs来存储消息缓冲. 消息缓冲存储在内存池中,使用Mempool库. 数据结构rte_mbuf通 ...

  5. DPDK IP分片及重组库(学习笔记)

    1 前置知识学习 1.1 MTU MTU是最大传输单元( Maximum Transmission Unit)的缩写,指一个接口无需分片所能发送的数据包的最大字节数.  MTU范围在46 ~ 1500 ...

  6. Java并发之底层实现原理学习笔记

    本篇博文将介绍java并发底层的实现原理,我们知道java实现的并发操作最后肯定是由我们的CPU完成的,中间经历了将java源码编译成.class文件,然后进行加载,然后虚拟机执行引擎进行执行,解释为 ...

  7. elasticsearch原理学习笔记

    https://mp.weixin.qq.com/s/dn1n2FGwG9BNQuJUMVmo7w 感谢,透彻的讲解 整理笔记 请说出 唐诗中 包含 前  的诗句 ...... 其实你都会,只是想不起 ...

  8. 《C标准库》学习笔记整理

    简介 <C标准库>书中对 C 标准库中的 15 个头文件的内容进行了详细的介绍,包括各头文件设计的背景知识.头文件中的内容.头文件中定义的函数和变量的使用.实现.测试等. 我学习此书的目的 ...

  9. TCP/IP协议原理学习笔记

    昨天学习了杨宁老师的TCP/IP协议原理第一讲和第二讲,主要介绍了OSI模型,整理如下: OSI是open system innerconnection的简称,即开放式系统互联参考模型,它把网络协议从 ...

随机推荐

  1. HMAC算法及其应用

    HMAC算法及其应用 MAC HMAC HMAC的应用 HMAC实现举例 MAC 在现代的网络中,身份认证是一个经常会用到的功能,在身份认证过程中,有很多种方式可以保证用户信息的安全,而MAC(mes ...

  2. JAVA 之 EL表达式

    一.什么是EL表达式 1.Expression Language表达式语言 2.是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据) 语法格式:${expression } 二.EL中的 ...

  3. ASP.NET Core 找不到 npm指令异常

    1.错误再现 利用VS2019预览版创建ASP.NET Core 的单页面Web程序 创建后直接运行,出现如下错误 Ensure that 'npm' is installed and can be ...

  4. zwx_helper

    通过重载c++operator,实现一种轻松的wxWidgets界面编程风格,如html编写页面一样直观容易. 举一例,一个界面页有四块区,如果是开发html的话,是从头到脚一气书写 <div ...

  5. Linux之进程管理工具supervisor

    环境:CentOS 7官方文档:http://supervisord.org/ 安装 # yum install -y epel-release # yum install -y supervisor ...

  6. libevent(二)尾队列 && 最小堆

    本文主要研究libevent中用来存储事件的两个结构体. 尾队列 具体定义位于queue.h中. #define TAILQ_HEAD(name, type) \ struct name { \ st ...

  7. maven的pom.xml配置文件相关依赖jar包

    <!--声明变量--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sou ...

  8. 【认证与授权】Spring Security自定义页面

    在前面的篇幅中,我们对认证和授权流程大致梳理了一遍.在这个过程中我们一直都是使用系统生成的默认页面,登录成功后也是直接调转到根路径页面.而在实际的开发过程中,我们是需要自定义登录页面的,有时还会添加各 ...

  9. 王颖奇 201771010129《面向对象程序设计(java)》第八周学习总结

    实验六 接口的定义与使用 实验时间 2018-10-18 1.实验目的与要求 (1) 掌握接口定义方法: (2) 掌握实现接口类的定义要求: (3) 掌握实现了接口类的使用要求: (4) 掌握程序回调 ...

  10. 【Hadoop离线基础总结】Yarn集群的资源调度

    Yarn集群的资源调度 介绍 概述 Yarn是 Hadoop 2.x 引入的新的资源管理系统模块,主要用于管理集群当中的资源(主要是服务器的各种硬件资源,比如内存.CPU等),它不光管理硬件资源,还管 ...