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