为什么使用 numa_alloc_onnode() 进行分配会导致“页面不存在”?

Rob*_*its 4 c linux memory multithreading numa

当我使用 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);
}
Run Code Online (Sandbox Code Playgroud)

然后使用 move_pages() 尝试确认分配的内存确实位于节点 1 上:

  printf("ptr is on node %d\n",get_node(ptr));
Run Code Online (Sandbox Code Playgroud)

在哪里

// 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]);

}
Run Code Online (Sandbox Code Playgroud)

我得到的答案是“ptr 在节点 -2 上”。从 errno-base.h 中,我发现 2 是 ENOENT,并且 move_pages() 手册页显示,在此上下文中 -ENOENT 的状态意味着“该页面不存在”。

如果我用普通的 malloc() 替换 numa_alloc_onnode() ,它可以正常工作:我得到一个节点号。

有谁知道这里发生了什么事吗?

提前致谢。

sar*_*old 5

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.
Run Code Online (Sandbox Code Playgroud)

这是否意味着您需要在内核实际为您提供页面之前将某些内容存储到新分配的页面中?