set_mempolicy 来自不同的进程
set_mempolicy from a different process
对于 NUMA 机器,Linux 提供
set_mempolicy
允许进程为内存分配定义其首选 NUMA 节点的系统调用。
是否有一些类似的函数允许更改另一个 运行 进程的内存策略?所以像这样 set_mempolicy(pid, ...)
其中 pid
对应于不同的 运行 进程?
请注意,另一个进程(我想更改其内存策略的进程)已经 运行,我无法控制它。所以这样的解决方案:
set_mempolicy(...);
fork(); // now new process has the same memory policy
不是我要找的。
鉴于我假设您无法更改程序,实现的方法很少。
在用户空间实现 NUMA 策略。可以在不同的 NUMA 节点之间移动进程的页面。参见 migratepages。我想你必须偶尔 运行 这个。
否则,您可以通过 gdb 附加并设置策略。请注意,我不能 100% 确定这是否会影响已分配的页面。在此步骤之前,您可能需要 运行 迁移页面。
创建一个函数来设置您的首选 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 )但是我对 numa 不太熟悉所以说更改是有效的。
请注意,这是侵入性过程,希望有更简单的替代方法。
- 创建一个 cpuset
mems
包含所需的节点,memory_migrate
包含 1
- 将进程的 PID 写入 cpuset 的
tasks
文件
进程的新分配将根据 cpuset 的 mems
配置完成,现有页面将在任务添加到集合时迁移。
注意。这真的感觉像是一个服务器故障 Q/A,但是如果你感觉更好的话,你可以用 C 写你的 cpuset 管理。
对于 NUMA 机器,Linux 提供
set_mempolicy
允许进程为内存分配定义其首选 NUMA 节点的系统调用。
是否有一些类似的函数允许更改另一个 运行 进程的内存策略?所以像这样 set_mempolicy(pid, ...)
其中 pid
对应于不同的 运行 进程?
请注意,另一个进程(我想更改其内存策略的进程)已经 运行,我无法控制它。所以这样的解决方案:
set_mempolicy(...);
fork(); // now new process has the same memory policy
不是我要找的。
鉴于我假设您无法更改程序,实现的方法很少。
在用户空间实现 NUMA 策略。可以在不同的 NUMA 节点之间移动进程的页面。参见 migratepages。我想你必须偶尔 运行 这个。
否则,您可以通过 gdb 附加并设置策略。请注意,我不能 100% 确定这是否会影响已分配的页面。在此步骤之前,您可能需要 运行 迁移页面。
创建一个函数来设置您的首选 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 )但是我对 numa 不太熟悉所以说更改是有效的。
请注意,这是侵入性过程,希望有更简单的替代方法。
- 创建一个 cpuset
mems
包含所需的节点,memory_migrate
包含1
- 将进程的 PID 写入 cpuset 的
tasks
文件
进程的新分配将根据 cpuset 的 mems
配置完成,现有页面将在任务添加到集合时迁移。
注意。这真的感觉像是一个服务器故障 Q/A,但是如果你感觉更好的话,你可以用 C 写你的 cpuset 管理。