一. 概述
内存池是固定大小对象的分配器。 在DPDK中,它通过名称标识,并使用mempool句柄存储空闲对象。默认的mempool句柄是基于环的。 它提供了一些其他可选服务,例如单核本地缓存一部分数据和一个对齐帮助器
以确保对象被填充以将它们均匀地扩展到所有DRAM或DDR3通道上。这个技术在Mbuf Library库中使用。
DPDK的内存管理与硬件关系紧密,并为应用的高效存取服务。在DPDK中,数据包的内存操作对象被抽象画为Mbuf结构,而有限的rte_mbuf结构对象则存储在内存池中。内存池使用环形缓存区来保存空闲对象。内存池在内存中的逻辑表现如下图:
当一个网络帧被网卡接收时,DPDK的网卡驱动将其存储在一个高效的环形缓冲区中,同时在Mbuf的环形缓冲区中创建一个Mbuf对象。当然,两个行为都不涉及向系统申请内存,这些内存已经在内存池被穿件时就申请好了。Mbuf对象被创建好后,网卡驱动根据分析出的帧信息将其初始化,并将其和实际帧逻辑相连。对网络帧的分析处理都集中于Mbuf,仅在必要的时候访问实际网络帧。这就是内存池的双环形缓存区结构。
为增加对Mbuf的访问效率,内存池还拥有内存通道/Rank对齐辅助方法。内存池还允许用户设置核心缓存区大小来调节环形内存块的读写频率。
实践证明,在内存对象之间补零,以确保每个对象和内存的一个通道和Rank起始处对齐,能大幅减少未命中的发生概率且增加存取效率。在L3转发和流分类应用中尤为如此。内存池以更大内存占有量的代价来支持此项技术。在创建一个内存池时,用户可选择是否启用该技术。 多核CPU访问同一个内存池或者同一个环形缓存区