プログラムを変更できないと仮定すると、実装する方法はほとんどありません。
ユーザー空間で 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()
/proc/pid/numa_maps を介して numa ポリシーを変更できることを確認しました (デフォルトから prefer:1 に変更) が、変更が効果的であるとは言えません。
これは侵襲的なプロセスであり、より簡単な代替手段があることを願っています。