set_mempolicy из другого процесса

Для машин NUMA Linux предоставляет set_mempolicy системный вызов, который позволяет процессу определить свой предпочтительный узел NUMA для выделения памяти.

Есть ли подобная функция, позволяющая изменить политику памяти другого запущенного процесса? Так как то так set_mempolicy(pid, ...) где pid соответствует другому запущенному процессу?

Обратите внимание, что другой процесс (тот, который я хочу изменить в своей политике памяти) уже запущен, и я не могу его контролировать. Итак, решение как это:

set_mempolicy(...);
fork(); // now new process has the same memory policy

это не то, что я ищу.

2 ответа

Решение
  1. создать процессор с mems содержащий желаемый узел (ы), и memory_migrate содержащий 1
  2. записать PID процесса в процессор tasks файл

Новые распределения в процессе будут выполняться в соответствии с процессором mems config, и существующие страницы будут перенесены, когда задача будет добавлена ​​в набор.

NB. Это действительно похоже на Q/A на сервере, но вы можете написать свое управление процессором на C, если это заставит вас чувствовать себя лучше.

Существует несколько способов реализации, так как я предполагаю, что вы не можете изменить программу.

  1. Реализуйте то, чего достигла бы политика NUMA в пользовательском пространстве. Можно перемещать страницы для процесса между различными узлами NUMA. Смотрите страницы перехода. Я полагаю, вам придется запускать это время от времени.

  2. В противном случае вы можете присоединиться через 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, чтобы сказать, что изменение эффективно.

Обратите внимание, что это инвазивный процесс, и, надеюсь, есть более простая альтернатива.

Другие вопросы по тегам