鉴于我假设您无法更改程序,因此实现的方法很少。
实施 NUMA 策略将在用户空间中实现的目标。可以在不同的 NUMA 节点之间移动进程的页面。请参阅migratepages。我想你必须偶尔运行一次。
否则,您可以通过 gdb 附加并设置策略。请注意,我不能 100% 确定这是否会影响已分配的页面。在此步骤之前,您可能必须运行 migratepages。
创建一个设置首选 numa 策略的函数:
注入.c
#include "inject.h"
void inject(){
printf("Changing memory policy\n");
unsigned long nodemask = 1L << 1;
set_mempolicy(MPOL_PREFERRED, &nodemask, 3);
}
注入.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 ),但我对 numa 不太熟悉,无法说更改是有效的。
请注意,这是侵入性过程,希望有更简单的替代方法。