2

NUMA マシンの場合、Linux は set_mempolicy、プロセスがメモリ割り当て用の優先 NUMA ノードを定義できるようにするシステム コールを提供します。

別の実行中のプロセスのメモリ ポリシーを変更できる同様の機能はありますか? では、別の実行中のプロセスに対応するこのようなものはset_mempolicy(pid, ...)どこですか?pid

他のプロセス (メモリ ポリシーを変更したいプロセス) が既に実行されており、それを制御できないことに注意してください。したがって、次のような解決策:

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

私が探しているものではありません。

4

2 に答える 2

0

プログラムを変更できないと仮定すると、実装する方法はほとんどありません。

  1. ユーザー空間で NUMA ポリシーが達成するものを実装します。異なる NUMA ノード間でプロセスのページを移動することができます。移行ページを参照してください。たまにこれを実行する必要があると思います。

  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 に変更) が、変更が効果的であるとは言えません。

これは侵襲的なプロセスであり、より簡単な代替手段があることを願っています。

于 2016-11-18T18:23:23.060 に答える