Может ли пользовательский процесс сообщить ОС о перемещении сопоставления, выполненного mmap, на другой узел NUMA?

Рассмотрим такой сценарий: пользовательский процесс, работающий на машине NUMA, вызывает mmap для создания нового сопоставления в виртуальном адресном пространстве. Затем он использует память, возвращенную mmap, для своей обработки (хранения своих данных и т. д.). Теперь по некоторым причинам пользовательский процесс запланирован на другой узел NUMA. Может ли пользовательский процесс сообщить ОС о перемещении уже сопоставленной памяти (на другой узел NUMA) при сохранении данных?


person Bao Bui    schedule 03.11.2017    source источник
comment
Существует mremap для перемещения памяти и функции libnuma для перемещения физической памяти: man7.org/linux/man-pages/man2/migrate_pages.2.html   -  person osgx    schedule 03.11.2017
comment
Я знаю о функции migrate_pages и libnuma. Но я не хочу перемещать все страницы, только ранее сопоставленную память, сделанную mmap.   -  person Bao Bui    schedule 03.11.2017
comment
С помощью mbind вы можете перенести часть страниц: man7.org/linux/man -pages/man2/mbind.2.html Пример: stackoverflow.com/a/41385103 документ ядра kernel.org/doc/Documentation/vm/page_migration позволяет процессу вручную переместите узел, на котором расположены его страницы, с помощью параметров MF_MOVE и MF_MOVE_ALL, задав новую политику памяти с помощью mbind()   -  person osgx    schedule 03.11.2017


Ответы (1)


Миграция физической памяти возможна с помощью migrate_pages вызова из libnuma (-lnuma): http://man7.org/linux/man-pages/man2/migrate_pages.2.html

 long migrate_pages(int pid, unsigned long maxnode,
                      const unsigned long *old_nodes,
                      const unsigned long *new_nodes);

Link with -lnuma.

migrate_pages() пытается переместить все страницы pid процесса, находящиеся в узлах памяти old_nodes, в узлы памяти в new_nodes. Страницы, не расположенные ни в одном узле в old_nodes, не будут перенесены. Насколько это возможно, ядро ​​поддерживает отношение относительной топологии внутри old_nodes во время перехода к new_nodes.

Существует также инструмент migratepages в пакете numactl для переноса всех страниц pid: http://man7.org/linux/man-pages/man8/migratepages.8.html

Вы также можете изменить политику памяти с помощью set_mempolicy: http://man7.org/linux/man-pages/man2/set_mempolicy.2.html

mbind системный вызов можно использовать для переноса подмножества страниц в некоторые НУМА-узел:

https://www.kernel.org/doc/Documentation/vm/page_migration

... позволяет процессу вручную перемещать узел, на котором расположены его страницы, с помощью параметров MF_MOVE и MF_MOVE_ALL при установке новой политики памяти с помощью mbind()

http://man7.org/linux/man-pages/man2/mbind.2.html

  If MPOL_MF_MOVE is specified in flags, then the kernel will attempt
   to move all the existing pages in the memory range so that they
   follow the policy.  Pages that are shared with other processes will
   not be moved.  If MPOL_MF_STRICT is also specified, then the call
   will fail with the error EIO if some pages could not be moved.
person osgx    schedule 03.11.2017