Почему выделения с помощью numa_alloc_onnode() приводят к «Страница отсутствует»?

#c #linux #multithreading #memory #numa

#c #linux #многопоточность #память #numa

Вопрос:

Когда я выделяю память на определенном узле NUMA с помощью numa_alloc_onnode() вот так :

 char *ptr;
if ((ptr = (char *) numa_alloc_onnode(1024,1)) == NULL) {
  fprintf(stderr,"Problem in %s line %d allocating memoryn",__FILE__,__LINE__);
  return(1);
}
  

а затем используйте move_pages(), чтобы попытаться подтвердить, что выделенная память действительно находится на узле 1 :

   printf("ptr is on node %dn",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,amp;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(), это работает нормально: я получаю номер узла.

Кто-нибудь имеет представление о том, что здесь происходит?

Заранее спасибо.

Ответ №1:

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.
  

Означает ли это, что вам нужно что-то сохранить на вновь выделенной странице, прежде чем ядро действительно предоставит вам страницу?

Комментарии:

1. Вы правы. Вы опередили меня на 12 секунд! Оказывается, что запись в выделенное пространство (подойдет простой ptr [0] = 0;) заставляет приведенный выше код работать так, как ожидалось: он дает мне номер узла. Похоже, чтение не считается. Мне также кажется, что это противоречит справочной странице: это функция numa_alloc_ *, и она не была обработана автоматически! Я работаю на Debian Squeeze, если это уместно.

2. Хех, эта часть про «автоматически» меня тоже смутила — но потом я вспомнил, что она была написана немецким инженером по ядру, который, вероятно, думает о «автоматической настройке механизма сбоя страницы». 🙂