DPDK 抛出 EAL:eal_memalloc_alloc_seg_bulk():在字符串连接上找不到合适的 memseg_list
DPDK throws EAL: eal_memalloc_alloc_seg_bulk(): couldn't find suitable memseg_list on string concatenate
我有一个 DPDK 环境设置,我的程序的错误部分连接了一个字符串。该字符串可以尽可能长(假设最大字符数为 1,000,000)。
我 运行 我的程序 ./program --lcores='0-4'
我正在使用 DPDK 的 rte_malloc、rte_memcpy、rte_strlcat 和 rte_free 函数。下面是代码片段
int current_length = strlen(fx->var);
int new_length = (datalen + current_length) + 1;
char *temp = (char *)rte_malloc("char *", new_length * (*fx->var), 0);
rte_memcpy(temp, fx->var, current_length);
rte_strlcat(temp, data, datalen);
temp[new_length] = '[=12=]';
fx->var = (char *)rte_malloc("var", new_length * (*fx->var), 0);
rte_memcpy(fx->var, temp, new_length);
fx->var[new_length] = '[=12=]';
rte_free(temp);
我的程序在 EAL 一段时间后退出:eal_memalloc_alloc_seg_bulk(): 找不到合适的 memseg_list。以下是我得到的堆栈跟踪
(gdb) where
#0 0x0000555555564d5b in _mm256_storeu_si256 (__A=..., __P=0x0) at /usr/lib/gcc/x86_64-linux-gnu/9/include/avxintrin.h:928
#1 rte_mov32 (
src=0x1a80b5a80 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", dst=0x0) at /usr/local/include/rte_memcpy.h:320
#2 rte_mov64 (
src=0x1a80b5a80 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", dst=0x0) at /usr/local/include/rte_memcpy.h:330
#3 rte_memcpy_aligned (n=88, src=0x1a80b5a80, dst=0x0) at /usr/local/include/rte_memcpy.h:856
#4 rte_memcpy (n=88, src=0x1a80b5a80, dst=0x0) at /usr/local/include/rte_memcpy.h:872
#5 parse_something (flow=0x7ff7c83c8288, id=60806,
data=0x7ff82cd77cc5 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", datalen=89, flags=4) at main.c:1187
#6 0x000055555557c2e1 in process_something (result=0x7fffed7fad88) at main.c:2147
#7 0x000055555557c467 in some_flow (worker=0x7fffed7fad70, result=0x7fffed7fad88) at main.c:2199
#8 0x000055555557e5e0 in some_loop (arg=0x5555556262f0) at main.c:2273
我想知道这里出了什么问题,我是不是遗漏了一些 EAL 配置。在那之前,我正在查看文档并尝试从 DPDK 程序员指南(具体是 EAL、Mbuf、Mempool 库)中理解。
机器规格
- DPDK 20.11.0-rc1
- Ubuntu 20(x86_64 GNU/Linux 内核 5.8.0-44-generic)
- CPU: 32
- 内存:256GB
- 2 个 DPDK 端口(igb_uio) 6-7 GB/s
- 1GB 大页面
如果我在上面的详细信息中遗漏了什么,请告诉我
正如评论中指出的那样,乘法必须给出一个数值。否则将使用 fx->var
的 ASCII 值。因此,评论中的建议是使用 atoi(fx->var)
将数字字符串转换为 int 值。
注意:通过修改代码片段,我可以得到它 运行,因此 rte_malloc.
没有问题
修改后的代码:
#include <rte_eal.h>
#include <rte_memcpy.h>
#include <rte_string_fns.h>
#include <rte_malloc.h>
char *mystring = "test my string: ";
char *data = "My Data.. ";
int datalen = 10;
int main(int argc, char **argv)
{
if (0 == rte_eal_init(argc, argv))
rte_exit(EXIT_FAILURE, "failed to init!");
int current_length = strlen(mystring);
int new_length = (datalen + current_length) + 1;
//char *temp = (char *)rte_malloc("char *", new_length * (*mystring), 0);
char *temp = (char *)rte_malloc("char *", new_length, 0);
if (temp == NULL)
rte_exit(EXIT_FAILURE, "temp is null!");
rte_strlcat(temp, mystring, current_length);
rte_strlcat(temp + current_length - 1, data, datalen);
temp[new_length] = '[=10=]';
mystring = (char *)rte_malloc("var", new_length * (*mystring), 0);
if (mystring == NULL)
rte_exit(EXIT_FAILURE, "mystring is null!");
rte_memcpy(mystring, temp, new_length);
mystring[new_length] = '[=10=]';
printf("(%s)!\n\n", mystring);
rte_free(temp);
printf("Done!");
构建命令:gcc /tmp/t.c $(pkg-config --cflags --libs --static libdpdk) -g
执行命令: sudo ./a.out --no-pci
[Edit-1] 使用 Abid Zaidi
建议的测试字符串更新
结果:(测试我的 string:My 数据..)!
我有一个 DPDK 环境设置,我的程序的错误部分连接了一个字符串。该字符串可以尽可能长(假设最大字符数为 1,000,000)。 我 运行 我的程序 ./program --lcores='0-4'
我正在使用 DPDK 的 rte_malloc、rte_memcpy、rte_strlcat 和 rte_free 函数。下面是代码片段
int current_length = strlen(fx->var);
int new_length = (datalen + current_length) + 1;
char *temp = (char *)rte_malloc("char *", new_length * (*fx->var), 0);
rte_memcpy(temp, fx->var, current_length);
rte_strlcat(temp, data, datalen);
temp[new_length] = '[=12=]';
fx->var = (char *)rte_malloc("var", new_length * (*fx->var), 0);
rte_memcpy(fx->var, temp, new_length);
fx->var[new_length] = '[=12=]';
rte_free(temp);
我的程序在 EAL 一段时间后退出:eal_memalloc_alloc_seg_bulk(): 找不到合适的 memseg_list。以下是我得到的堆栈跟踪
(gdb) where
#0 0x0000555555564d5b in _mm256_storeu_si256 (__A=..., __P=0x0) at /usr/lib/gcc/x86_64-linux-gnu/9/include/avxintrin.h:928
#1 rte_mov32 (
src=0x1a80b5a80 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", dst=0x0) at /usr/local/include/rte_memcpy.h:320
#2 rte_mov64 (
src=0x1a80b5a80 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", dst=0x0) at /usr/local/include/rte_memcpy.h:330
#3 rte_memcpy_aligned (n=88, src=0x1a80b5a80, dst=0x0) at /usr/local/include/rte_memcpy.h:856
#4 rte_memcpy (n=88, src=0x1a80b5a80, dst=0x0) at /usr/local/include/rte_memcpy.h:872
#5 parse_something (flow=0x7ff7c83c8288, id=60806,
data=0x7ff82cd77cc5 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", datalen=89, flags=4) at main.c:1187
#6 0x000055555557c2e1 in process_something (result=0x7fffed7fad88) at main.c:2147
#7 0x000055555557c467 in some_flow (worker=0x7fffed7fad70, result=0x7fffed7fad88) at main.c:2199
#8 0x000055555557e5e0 in some_loop (arg=0x5555556262f0) at main.c:2273
我想知道这里出了什么问题,我是不是遗漏了一些 EAL 配置。在那之前,我正在查看文档并尝试从 DPDK 程序员指南(具体是 EAL、Mbuf、Mempool 库)中理解。
机器规格
- DPDK 20.11.0-rc1
- Ubuntu 20(x86_64 GNU/Linux 内核 5.8.0-44-generic)
- CPU: 32
- 内存:256GB
- 2 个 DPDK 端口(igb_uio) 6-7 GB/s
- 1GB 大页面
如果我在上面的详细信息中遗漏了什么,请告诉我
正如评论中指出的那样,乘法必须给出一个数值。否则将使用 fx->var
的 ASCII 值。因此,评论中的建议是使用 atoi(fx->var)
将数字字符串转换为 int 值。
注意:通过修改代码片段,我可以得到它 运行,因此 rte_malloc.
没有问题修改后的代码:
#include <rte_eal.h>
#include <rte_memcpy.h>
#include <rte_string_fns.h>
#include <rte_malloc.h>
char *mystring = "test my string: ";
char *data = "My Data.. ";
int datalen = 10;
int main(int argc, char **argv)
{
if (0 == rte_eal_init(argc, argv))
rte_exit(EXIT_FAILURE, "failed to init!");
int current_length = strlen(mystring);
int new_length = (datalen + current_length) + 1;
//char *temp = (char *)rte_malloc("char *", new_length * (*mystring), 0);
char *temp = (char *)rte_malloc("char *", new_length, 0);
if (temp == NULL)
rte_exit(EXIT_FAILURE, "temp is null!");
rte_strlcat(temp, mystring, current_length);
rte_strlcat(temp + current_length - 1, data, datalen);
temp[new_length] = '[=10=]';
mystring = (char *)rte_malloc("var", new_length * (*mystring), 0);
if (mystring == NULL)
rte_exit(EXIT_FAILURE, "mystring is null!");
rte_memcpy(mystring, temp, new_length);
mystring[new_length] = '[=10=]';
printf("(%s)!\n\n", mystring);
rte_free(temp);
printf("Done!");
构建命令:gcc /tmp/t.c $(pkg-config --cflags --libs --static libdpdk) -g
执行命令: sudo ./a.out --no-pci
[Edit-1] 使用 Abid Zaidi
结果:(测试我的 string:My 数据..)!