为什么使用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()(),它工作正常:我得到一个节点号。

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

提前致谢。

3

1 答案

numa_alloc_onnode(3) says:

   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.

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

3
额外
你是对的。你打败了我12秒!事实证明,写入分配的空间(一个简单的ptr [0] = 0;会这样做)使上面的代码按预期工作:它给了我一个节点号。看来,阅读不算数。在我看来,这与手册页相矛盾:这是一个numa_alloc_ *函数,并没有自动处理!我正在使用Debian Squeeze,如果那是相关的。
额外 作者 Rob_before_edits,
我觉得你是对的 :)
额外 作者 Rob_before_edits,
嘿,那点'自动'也让我感到困惑 - 但后来我记得它是由德国内核工程师写的,他可能会想到“自动设置页面错误机制”。 :)
额外 作者 sarnold,