为什么使用 numa_alloc_onnode() 进行分配会导致“页面不存在”?
当我使用 numa_alloc_onnode() 在特定的 NUMA 节点上分配内存时,如下所示:
char *ptr;
if ((ptr = (char *) numa_alloc_onnode(1024,1)) == NULL) {
fprintf(stderr,"Problem in %s line %d allocating memory\n",__FILE__,__LINE__);
return(1);
}
然后使用 move_pages() 尝试确认分配的内存确实位于节点 1 上:
printf("ptr is on node %d\n",get_node(ptr));
我得到的
// This function returns the NUMA node that a pointer address resides on.
int get_node(void *p)
{
int status[1];
void *pa;
unsigned long a;
// round p down to the nearest page boundary
a = (unsigned long) p;
a = a - (a % ((unsigned long) getpagesize()));
pa = (void *) a;
if (move_pages(0,1,&pa,NULL,status,0) != 0) {
fprintf(stderr,"Problem in %s line %d calling move_pages()\n",__FILE__,__LINE__);
abort();
}
return(status[0]);
}
答案是“ptr 在节点 -2 上”。从 errno-base.h 中,我发现 2 是 ENOENT,并且 move_pages() 手册页显示,在此上下文中 -ENOENT 的状态意味着“该页面不存在”。
如果我用普通的 malloc() 替换 numa_alloc_onnode() ,它可以正常工作:我得到一个节点号。
有谁知道这里发生了什么事吗?
提前致谢。
When I allocate memory on a specific NUMA node using numa_alloc_onnode() like this :
char *ptr;
if ((ptr = (char *) numa_alloc_onnode(1024,1)) == NULL) {
fprintf(stderr,"Problem in %s line %d allocating memory\n",__FILE__,__LINE__);
return(1);
}
and then use move_pages() to try and confirm that the memory allocated is indeed on node 1 :
printf("ptr is on node %d\n",get_node(ptr));
where
// This function returns the NUMA node that a pointer address resides on.
int get_node(void *p)
{
int status[1];
void *pa;
unsigned long a;
// round p down to the nearest page boundary
a = (unsigned long) p;
a = a - (a % ((unsigned long) getpagesize()));
pa = (void *) a;
if (move_pages(0,1,&pa,NULL,status,0) != 0) {
fprintf(stderr,"Problem in %s line %d calling move_pages()\n",__FILE__,__LINE__);
abort();
}
return(status[0]);
}
I get the answer "ptr is on node -2". From errno-base.h I find that 2 is ENOENT, and the move_pages() man page says that a status of -ENOENT in this context means "The page is not present".
If I replace numa_alloc_onnode() with ordinary malloc() it works fine : I get a node number.
Does anyone have any idea what's going on here?
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
numa_alloc_onnode(3)
说:这是否意味着您需要在内核实际为您提供页面之前将某些内容存储到新分配的页面中?
numa_alloc_onnode(3)
says:Does this mean you need to store something into the newly-allocated page before the kernel actually gives you the page?