DPDK内存池创建失败如何解决?

How to resolve DPDK mempool creation fail?

我一直坚持使用 rte_mempool_create,无论我给什么配置,函数都只是 return NULL.

下面是我的代码,

int main(argc, **argv) {
        int ret;
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
                printf("eal init fail!!!\n");
        unsigned lcore_id;
        lcore_id = rte_lcore_id();
        printf("lcore %u\n", lcore_id);

        struct rte_mempool *mp;
        mp = rte_mempool_create("MP", 1024,
                                32, 32, 0,
                                NULL, NULL, NULL, NULL,
                                0, 0);
        if (NULL == mp) {
                printf("mempool init fail\n");
                return -1;
        }
        printf("mempool init pass\n");

        rte_mempool_free(mp);
        printf("mempool uninit pass\n");
        return 0;
}

和运行结果,

EAL: Detected 96 lcore(s)
EAL: Detected 4 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
EAL: No available hugepages reported in hugepages-32768kB
EAL: No available hugepages reported in hugepages-64kB
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: No legacy callbacks, legacy socket not created
lcore 0
mempool init fail

如何正确创建池?

DPDK 代码或库没有问题。修改了代码片段并使用以下配置进行测试

  • DPDK 版本:19.11.5 LTS
  • CPU:Intel(R) Xeon(R) CPU E5-2699 v4,88 线程
  • 大页面:Hugepagesize:1048576 kB,HugePages_Total:16,HugePages_Free:15
  • 命令:./build/test

[EDIT-1] 在@LinconFive 的评论中更新,问题是没有为正确的 NUMA 设置大页面(忽略交叉编译,因为 arm 二进制文件不会 运行 在 x86 上)

测试结果:通过

代码:

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <sys/queue.h>

#include <rte_memory.h>
#include <rte_launch.h>
#include <rte_eal.h>
#include <rte_per_lcore.h>
#include <rte_lcore.h>
#include <rte_debug.h>

int
main(int argc, char **argv)
{
        int ret;
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
                printf("eal init fail!!!\n");
        unsigned lcore_id;
        lcore_id = rte_lcore_id();
        printf("lcore %u\n", lcore_id);

        struct rte_mempool *mp;
        mp = rte_mempool_create("MP", 1024,
                                32, 32, 0,
                                NULL, NULL, NULL, NULL,
                                0, 0);
        if (NULL == mp) {
                printf("mempool init fail\n");
                return -1;
        }
        printf("mempool init pass\n");

        while(1);

        rte_mempool_free(mp);
        printf("mempool uninit pass\n");
        return 0;
}

日志:

lcore 0
mempool init pass

注:

  • 在版本、平台和特定错误方面向@LinconFive 发出了多个请求,因为我怀疑平台和配置。
  • DPDK 代码或库没有问题。