【问题标题】:set_mempolicy from a different process来自不同进程的 set_mempolicy
【发布时间】:2017-03-25 22:50:45
【问题描述】:

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

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

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

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

不是我要找的。​​p>

【问题讨论】:

    标签: linux memory system-calls numa numactl


    【解决方案1】:
    1. 使用包含所需节点的mems 和包含1memory_migrate 创建一个cpuset
    2. 将进程的PID写入cpuset的tasks文件

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-10-07
        • 1970-01-01
        • 1970-01-01
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2022-10-08
        相关资源
        最近更新 更多