【问题标题】:How to track memory allocation via DPDK API rte_malloc?如何通过 DPDK API rte_malloc 跟踪内存分配?
【发布时间】:2021-09-13 10:19:02
【问题描述】:

基于 DPDK API 文档 rte_malloc_dump_stats 被称为 将指定类型转储到文件中。但是自定义应用程序或app/test/test_malloc.c 都没有共享所需的结果。

期望:对于 DPDK API rte_malloc、rte_calloc 和 rte_zmalloc 是用const char *type 创建的。可以使用rte_malloc_dump_stats 查询特定const char *type 的统计信息

当前结果:DPDK API rte_malloc_dump_stats 给出了整体堆使用情况,没有任何关于哪个“类型”使用多少的信息。

问题:DPDK 中是否有任何其他 API 可用于跟踪大页面 malloc 的使用情况?任何 DPDK 补丁都会有用吗?

示例代码流程:

/* with huge page */
rte_eal_init 

/* create memory location for various object type */
rte_malloc ("objecttype-1")
rte_malloc ("objecttype-2")
rte_malloc ("objecttype-3")
rte_malloc ("objecttype-4")

/* dump stats for object type - 1 */
rte_malloc_dump_stats ("objecttype-1")

我的应用程序调用了 rte_calloc,它调用了一些其他内部子例程,最后调用了 heap_alloc(其中的“类型”似乎是 unsed)。 heap_alloc(struct malloc_heap *heap, const char *type __rte_unused, size_t size, unsigned int flags, size_t align, size_t bound, bool contig)。堆分配目前似乎忽略了“类型”参数。如何跟踪堆内存使用情况?

【问题讨论】:

  • 函数 heap_alloc 是一个内部静态函数,如果你的意图是跟踪内存分配和释放,则使用传递给 rte_malloc/rte_calloc/rte_zmalloc 的特定名称。为了清楚起见,我要求编辑问题。有一种方法可以根据名称进行跟踪
  • 感谢您的回复。如何跟踪每种类型的内存分配?应用程序可以使用哪些 API 来分配和转储统计信息? [ rte_calloc 与 malloc_dump_stats - 组合无助于跟踪每个“类型”分配统计信息]
  • 感谢更新,DPDK 中没有自动执行此操作的 API 我可以共享代码 sn-p(不修改库)我用来实现相同目的的代码。这对你有用吗?
  • 当然。这会有所帮助。请分享。让我检查一下并恢复。
  • 我已更新问题以反映真实问题。请接受更改以确认这是否是有意的问题。它会让事情更容易回答。

标签: dpdk


【解决方案1】:

观察是正确的,目前 DPDK API rte_malloc、rte_zalloc、rte_calloc 丢弃了第一个参数表示为const char *type 的名称字段。因此,使用 DPDK API rte_malloc_dump_stats 转储或查询不会返回特定的const char *type。

有几个解决这个问题的方法(不修改 DPDK 库),例如

  1. rte_memzone_reserve 创建一个命名区域(可以是所需的类型)作为替换。
  2. rte_mempool_create_empty 创建一个命名为空的内存池。

这两种方法都有其缺点

  1. memzone:通常针对较大的区域并调用一次,因此对小对象频繁调用 memzone_reserve 会对性能产生影响。还必须使用rte_memzone_walk 来遍历所需的const char *type 以获得详细信息。
  2. empty_mempool:期望放入的所有对象都具有相同的大小,因此它在创建可重用计数器池或列表等地方很有用。但是使用rte_mempool_lookup 可以更轻松地访问池,以获取元素数量、大小和每个核心缓存的元素等详细信息。

通过简单地创建Create a container to hold malloc|calloc|zalloc name, pointer and size using fb_arry,有一个更简单的选择。在每次成功分配时,从 fb_array 获取一个元素持有者并更新详细信息。这种方法的主要优点是fb_arry can be extended on huge page via rte_memzone_reserve,这使得对const char *type 的监控几乎不需要修改。

代码片段:

struct rte_memzone *mptr = NULL;

struct elements {
    char name[256];
    void *ptr;
};

/* right after rte_eal_init */
mptr = rte_memzone_reserve_aligned("MALLOC_REGIONS",
            sizeof(struct rte_fbarray), SOCKET_ID_ANY,
            RTE_MEMZONE_2MB, 8);

/* create a wrapper or MACRO to insert details of each alloc with type field */
do
{
    ptr = rte_malloc(NULL, size_dataoibject, 0);
    if (ptr == NULL)
        return NULL;

    int index = rte_fbarray_find_next_free((struct rte_fbarray *)mptr->addr, 0);
    if (index < 0) {
        printf("fail in rte_fbarray_find_next_free %d", index);
        rte_free(ptr);
        return NULL;
    }

    return ptr;
} while(0);

/* in the data processing thread, invoke the MACRO/function*/

参考:

  1. DPDK debug guide
  2. malloc monitor

【讨论】:

  • 感谢您的建议。我们将尝试建议的方法。
  • [1] rte_memzone_reserve_aligned 中的“1000”(最后一个参数)是什么? API 指南说最后一个 argt 是对齐。 [2] “结构元素”在哪里使用? [3] 每个 alloc 和每个 free - 需要从 fbarray 插入/删除吗? [4] 整个 fbarray API 都表示“rte experimental”——是否推荐使用这些?通常我们不使用实验性 API。 [5] 为什么没有哈希表——每个“malloc 组”——插入/删除——从哈希表中用于分配/删除。使用 fbarray 有什么好处?请澄清。非常感谢您的支持。
  • 与请求共享的电子邮件Requesting to set up a meeting with the team (cisco), to better understand the ask?
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2010-10-28
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2022-09-27
相关资源
最近更新 更多