DPDK-mempool(3)

简介: DPDK-mempool(3)

前言


内存池该概念

内存池是固定大小的对象分配器。 在DPDK中,它由名称唯一标识,并且使用mempool操作来存储空闲对象。 默认的mempool操作是基于ring的。它提供了一些可选的服务,如per-core缓存和对齐帮助,以确保对象被填充, 方便将他们均匀扩展到DRAM或DDR3通道上。


提示:以下是本篇文章正文内容,下面案例可供参考


一、本地缓存


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


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


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


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

6c74c780e93202039f2ef92ecfda26da_c2ed93458f82414e9bc9441b56ba07ae.png

不同于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线程使用。


二、Mempool Handlers


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


mempool 操作包括两方面:


添加新的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处理。

996ba8f31482046b9ddf34b1a7bff609_ab63b7d5b63142349ef57c728b6beddb.png

用例


All allocations that require a high level of performance should use a pool-based memory allocator. Below are some examples:


  • Mbuf Library Environment
  • Abstraction Layer , for logging service
  • Any application that needs to allocate fixed-sized objects in the data plane and that will be continuously utilized by the system.(任何需要在程序中分配固定大小对象,并将被系统持续使用的应用程序)

参考


参考

DPDK 官网

dpdk mempool cache 机制

目录
相关文章
|
7月前
|
存储 前端开发 Linux
DPDK-mempool(1)
DPDK-mempool(1)
153 0
|
7月前
|
存储 缓存 Linux
基于dpdk的用户态协议栈设计实现(二)
基于dpdk的用户态协议栈设计实现(二)
127 0
|
4月前
|
负载均衡 网络协议 安全
DPDK用户态协议栈-KNI
DPDK用户态协议栈-KNI
|
4月前
|
Ubuntu 编译器
|
7月前
|
编译器 网络性能优化 C语言
VPP DPDK,不是翻墙!!
VPP DPDK,不是翻墙!!
|
7月前
|
Ubuntu
[DPDK] dpdk测试收包
[DPDK] dpdk测试收包
|
7月前
|
存储 开发框架 Linux
DPDK学习之DPDK边界
DPDK学习之DPDK边界
135 0
|
7月前
|
安全 API 数据处理
基于dpdk的用户态协议栈设计实现(一)
基于dpdk的用户态协议栈设计实现(一)
154 0
|
存储 缓存 网络协议
2.8 基于DPDK的UDP用户态协议栈实现
2.8 基于DPDK的UDP用户态协议栈实现
318 0
|
存储 缓存 Linux
Linux用户态协议栈与DPDK构建高性能应用
本文深入探讨了如何利用Linux用户态协议栈与DPDK构建高性能应用的方法和技巧。在现代网络编程中,性能是至关重要的,特别是在需要处理大量并发连接的场景下。传统的内核态网络栈在面对高负载时可能会遇到性能瓶颈,而本文介绍了如何借助用户态协议栈和DPDK来突破这些限制。从零开始搭建一个基于用户态协议栈和DPDK的网络应用并不是一件容易的事情,但本文将通过实际示例和步骤指导读者完成这一过程。最后,本文总结了使用用户态协议栈和DPDK构建高性能应用的益处,并展望了这些技术在未来网络设计中的潜在作用。
516 0
Linux用户态协议栈与DPDK构建高性能应用