当我使用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的状态表示“该页面不存在”.
如果我将numa_alloc_onnode()替换为普通的malloc(),它将正常工作:我得到一个节点号.
有人知道这里发生了什么吗?
提前致谢.
解决方法:
numa_alloc_onnode(3)说:
All numa memory allocation policy only takes effect when a
page is actually faulted into the address space of a process
by accessing it. The numa_alloc_* functions take care of this
automatically.
这是否意味着您需要在内核实际为您分配页面之前将某些内容存储到新分配的页面中?