set_mempolicy из другого процесса
Для машин NUMA Linux предоставляет set_mempolicy
системный вызов, который позволяет процессу определить свой предпочтительный узел NUMA для выделения памяти.
Есть ли подобная функция, позволяющая изменить политику памяти другого запущенного процесса? Так как то так set_mempolicy(pid, ...)
где pid
соответствует другому запущенному процессу?
Обратите внимание, что другой процесс (тот, который я хочу изменить в своей политике памяти) уже запущен, и я не могу его контролировать. Итак, решение как это:
set_mempolicy(...);
fork(); // now new process has the same memory policy
это не то, что я ищу.
2 ответа
- создать процессор с
mems
содержащий желаемый узел (ы), иmemory_migrate
содержащий1
- записать PID процесса в процессор
tasks
файл
Новые распределения в процессе будут выполняться в соответствии с процессором mems
config, и существующие страницы будут перенесены, когда задача будет добавлена в набор.
NB. Это действительно похоже на Q/A на сервере, но вы можете написать свое управление процессором на C, если это заставит вас чувствовать себя лучше.
Существует несколько способов реализации, так как я предполагаю, что вы не можете изменить программу.
Реализуйте то, чего достигла бы политика NUMA в пользовательском пространстве. Можно перемещать страницы для процесса между различными узлами NUMA. Смотрите страницы перехода. Я полагаю, вам придется запускать это время от времени.
В противном случае вы можете присоединиться через GDB и установить политику. Обратите внимание, я не уверен на 100%, повлияет ли это на уже выделенные страницы. Возможно, вам придется запустить migratepages перед этим шагом.
Создайте функцию, которая устанавливает предпочитаемую вами политику numa:
inject.c
#include "inject.h"
void inject(){
printf("Changing memory policy\n");
unsigned long nodemask = 1L << 1;
set_mempolicy(MPOL_PREFERRED, &nodemask, 3);
}
inject.h
#include <stdio.h>
#include <numaif.h>
extern void inject();
libinject.so
gcc -c -Wall -Werror -lnuma -fPIC inject.c
gcc -shared -o libinject.so inject.o -lnuma
** Присоединить к pid и вызвать функцию, которую вы определили **
gdb -p pid
(gdb) call __libc_dlopen_mode("/path_to/libinject.so", 0x0002)
(gdb) call inject()
Я подтвердил, что могу изменить политику numa с помощью /proc/pid/numa_maps (изменено со значения по умолчанию на предпочтение:1), но я не слишком знаком с numa, чтобы сказать, что изменение эффективно.
Обратите внимание, что это инвазивный процесс, и, надеюсь, есть более простая альтернатива.