2016-11-11 21 views
1

Для машин NUMA Linux предоставляет системный вызов set_mempolicy, который позволяет процессу определять его предпочтительный узел NUMA для распределения памяти.set_mempolicy от другого процесса

Есть ли подобная функция, которая позволяет изменить политику памяти другого запущенного процесса? Так что-то вроде этого set_mempolicy(pid, ...), где pid соответствует другому ходу?

Обратите внимание, что другой процесс (тот, который я хочу изменить для своей политики памяти) уже запущен, и я не контролирую его. Таким образом, решение вроде этого:

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

не то, что я ищу.

ответ

1
  1. создать cpuset с mems, содержащую нужный узел (ы), и memory_migrate содержащий 1
  2. написать процесс PID в tasks файле cpuset в

Новые ассигнования процесса будут выполнены в соответствии с конфигурацией cpuset mems, а существующие страницы будут перенесены при добавлении задачи в набор.

NB. Это действительно похоже на Q/A serverfault, но вы можете написать управление cpuset на C, если вам станет лучше.

0

Есть несколько способов реализовать, учитывая, что я предполагаю, что вы не можете изменить программу.

  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() 

Я проверил, что я могу изменить NUMA политику через/Proc/PID/numa_maps (меняется от по умолчанию: 1), но я не слишком хорошо знаком с numa, чтобы сказать, что изменение является эффективным.

Обратите внимание, что это инвазивный процесс и, надеюсь, есть более простая альтернатива.

 Смежные вопросы

  • Нет связанных вопросов^_^