rte_malloc内存分配实验 - promisechen/dpdk GitHub Wiki
#rte_malloc内存分配实验 ##相关命令 dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range
##实验1 1.修改l2fwd rte_eal_init之后,添加代码 size_t t2 = (size_t)10241024512*6;//5则为2.5G 6则为3G 8则为4G `
void *p0 = rte_malloc_socket("BIG", t2 , 64, 0);
if(!p0)
{
printf("3G -- error:%d\n",__LINE__);
return -1;
}
`
A.每页2MB,每个cpu分配5192页即每个cpu分配10G 共7个8G内存条 2个4G内存
| memsize(GB) | result |
|---|---|
| 3.5 | yes |
| 4 | no |
B.每页2MB,每个cpu分配2596页即每个cpu分配5G 共7个8G内存条 2个4G内存
| memsize(GB) | result |
|---|---|
| 3.5 | yes |
| 4 | no |
C.每页2MB,每个cpu分配5192页即每个cpu分配10G 共8个8G内存条
| memsize(GB) | result |
|---|---|
| 3.5 | yes |
| 4 | no |
结论:
1.虽然设置了10G的大页,但实际只能分配出3.5G.
2.通过A B对比,设置10G和设置5G的大页,实际也能分配出3.5G. 根源--不知
3.通过A C对比,A有两根4G内存,C全是8G内存,实际也都只能分配3.5G. 根源--不知
##实验2 将每页大小修改为1G后,无法设置大页 default_hugepagesz=1G hugepagesz=1G hugepages=4
##实验3 a. 分配5个2G内存p0 p1 p2 p3 p4,分配成功 分配5个2G内存p0 p1 p2 p3 p4,p5,分配成功 b. 分配一个3G的内存,在分配5个2G内存p0 p1 p2 p3 p4,分配p3时失败。
c. 分配5个2G内存p0 p1 p2 p3 p4 ,在释放p0 p2 在分配3G内存,分配失败
分配5个2G内存p0 p1 p2 p3 p4 ,在释放p0 p1 在分配3G内存,分配失败
分配5个2G内存p0 p1 p2 p3 p4 ,在释放p0 p1 p2在分配3G内存,分配失败
分配5个2G内存p0 p1 p2 p3 p4 ,在释放p0 p1 p2 p3 p4 在分配3G内存,分配失败
d. 分配5个2G内存p0 p1 p2 p3 p4 ,在释放p0 p1 p2 p3 p4 在分配2G内存,分配成功
分配5个2G内存p0 p1 p2 p3 p4 ,在释放p0在分配2G内存,分配成功
从b和c来看,dpdk没有对碎片进行整理。一旦被打成5个2G的内存块,则不能在分配出3G整块内存。
代码
`
size_t t2 = (size_t)102410245124;
size_t t3 = (size_t)102410245126;
size_t t4 = (size_t)102410241024*4;
void *p0 = rte_malloc_socket("BIG", t2 , 64, 0);
if(!p0)
{
printf("2G -- error:%d\n",__LINE__);
return -1;
}
void *p1 = rte_malloc_socket("BIG", t2 , 64, 0);
if(!p1)
{
printf("2G -- error:%d\n",__LINE__);
return -1;
}
void *p2 = rte_malloc_socket("BIG", t2 , 64, 0);
if(!p2)
{
printf("2G -- error:%d\n",__LINE__);
return -1;
}
void *p3 = rte_malloc_socket("BIG", t2 , 64, 0);
if(!p3)
{
printf("2G -- error:%d\n",__LINE__);
return -1;
}
void *p4 = rte_malloc_socket("BIG", t2 , 64, 0);
if(!p4)
{
printf("2G -- error:%d\n",__LINE__);
return -1;
}
rte_free(p0);
rte_free(p1);
rte_free(p2);
rte_free(p3);
rte_free(p4);
void *p5 = rte_malloc_socket("BIG", t2 , 64, 0);
if(!p5)
{
printf("2G -- error:%d\n",__LINE__);
return -1;
}
void *p10 = rte_malloc_socket("BIG", t4 , 64, 01);
if(!p10)
{
printf("4G-1 -- error:%d\n",__LINE__);
return -1;
}
void *p11 = rte_malloc_socket("BIG", t3 , 64, 0);
if(!p11)
{
printf("4G-0 -- error:%d\n",__LINE__);
return -1;
} `