2016-11-21 3 views
1

Я хочу создать большое количество процессов. Итак, у меня есть master процесс, который делает это.Нерест большого количества процессов

int master(int argc, char* argv[]){ 
    for (int i = 0; i < 50000; ++i) { 
     std::string name = std::to_string(i); 
     MSG_process_create(name.c_str(), slave, NULL, MSG_host_self()); 
    } 
    return 0; 
    } 

int slave(int argc, char* argv[]){ 
    XBT_INFO("%s", MSG_process_get_name(MSG_process_self())); 
    return 0; 
} 

После того как я запустить эту программу, у меня есть следующий вывод:

.... 
.... 
[Master:32734:(32736) 0.000000] [master/INFO] 32734 
[Master:32735:(32737) 0.000000] [master/INFO] 32735 
[0.000000] /home/ken/Downloads/simgrid-master/src/simix/smx_context.cpp:187: [xbt/CRITICAL] Failed to protect stack: Cannot allocate memory 

Process finished with exit code 134 (interrupted by signal 6: SIGABRT) 

Тогда мне посоветовали использовать contexts/stack-size параметр для изменения стека, размер, так как предыдущая программа по умолчанию требуется 50000 * 8192 KiB ,

Я добавил этот параметр --cfg=contexts/stack-size:10, но у меня есть один и тот же вывод:

... 
... 
[Master:32735:(32737) 0.000000] [master/INFO] 32735 
[0.000000] /home/ken/Downloads/simgrid-master/src/simix/smx_context.cpp:187: [xbt/CRITICAL] Failed to protect stack: Cannot allocate memory 

Process finished with exit code 134 (interrupted by signal 6: SIGABRT) 

Или :

... 
... 
[Master:32734:(32736) 0.000000] [master/INFO] 32734 
[0.000000] /home/ken/Downloads/simgrid-master/src/simix/smx_context.cpp:187: [xbt/CRITICAL] Failed to protect stack: Cannot allocate memory 

Это может показаться, что моя программа не видит этот параметр, но это ISN» t, потому что параметр стопки равен 5 дает мне:

Finally, if nothing of the above applies, this can result from a stack overflow. 
Try to increase stack size with --cfg=contexts/stack_size (current size is 1 KiB). 

Что я сделал не так?

ответ

2

Вы можете попробовать, возможно, увеличить значение максимального количества разрешений на каждый процесс в вашей системе?

Вы можете сделать это с Судо Sysctl -w vm.max_map_count = 500000 установить максимальное значение 500000

Мы видели недавно, что это вызывает некоторые проблемы на некоторых работает SMPI, может быть, это то же самое с вашей стороны , Сообщение «Невозможно выделить память» действительно может вводить в заблуждение, так как код ошибки ENOMEM устанавливается по разным причинам (и согласно http://man7.org/linux/man-pages/man2/mprotect.2.html, одним из них может быть количество отображений).

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