2

对于 NUMA 机器,Linux 提供 set_mempolicy系统调用,允许进程定义其首选 NUMA 节点以进行内存分配。

是否有一些类似的功能可以更改另一个正在运行的进程的内存策略?那么像这样set_mempolicy(pid, ...)的东西pid对应于不同的运行过程?

请注意,另一个进程(我想更改其内存策略的那个)已经在运行,我无法控制它。所以像这样的解决方案:

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

不是我要找的。

4

2 回答 2

2
  1. mems创建一个包含所需节点的cpuset ,并memory_migrate包含1
  2. 将进程的 PID 写入 cpuset 的tasks文件

进程的新分配将根据 cpuset 的mems配置完成,并且在将任务添加到集合时将迁移现有页面。

注意。这感觉就像一个服务器故障问答,但如果它能让你感觉更好,你可以用 C 编写你的 cpuset 管理。

于 2016-11-23T14:46:24.367 回答
0

鉴于我假设您无法更改程序,因此实现的方法很少。

  1. 实施 NUMA 策略将在用户空间中实现的目标。可以在不同的 NUMA 节点之间移动进程的页面。请参阅migratepages。我想你必须偶尔运行一次。

  2. 否则,您可以通过 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 不太熟悉,无法说更改是有效的。

请注意,这是侵入性过程,希望有更简单的替代方法。

于 2016-11-18T18:23:23.060 回答