Есть несколько способов реализовать, учитывая, что я предполагаю, что вы не можете изменить программу.
Внедрение политики NUMA в пользовательском пространстве. Можно перемещать страницы для процесса между различными узлами NUMA. См. migratepages. Я бы предположил, что вам придется запускать это время от времени.
В противном случае вы можете подключиться через 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, чтобы сказать, что изменение является эффективным.
Обратите внимание, что это инвазивный процесс и, надеюсь, есть более простая альтернатива.