Erlang не использует все ядра процессора при выполнении параллельных задач, почему? - PullRequest
2 голосов
/ 18 апреля 2011

В настоящее время я читаю книгу «Программирование на Erlang», и я решил протестировать свою систему в тесте, который создает N процессов, вот код:

-module(my_ring).
-export([start/1, start_proc/2]).

start(Num) ->
    start_proc(Num, self()).

start_proc(0, Pid) ->
    Pid ! ok;
start_proc(Num, Pid) ->
    NPid = spawn(?MODULE, start_proc, [Num - 1, Pid]),
    NPid ! ok,
    receive
        ok ->
            ok
    end.

У меня включен Intel i5Windows 7 x64 и, создавая 100 000 000 процессов, я проверил загрузку своего процессора.Оказалось, что только одно ядро ​​работает на полную мощность, другие ничего не делают (поэтому общая загрузка системы составляет 25%).Я думал, что Erlang VM будет балансировать нагрузку на все 4 доступных ядра, но это не так.

Кто-нибудь знает почему?Что-нибудь плохое в конфигурациях моей Erlang VM?

1 Ответ

6 голосов
/ 18 апреля 2011

Я думаю, что одна вещь, которая ограничивает параллелизм этого примера, состоит в том, что фактически очень мало параллельной работы выполняется. Каждый процесс порождает следующий процесс в цепочке, и немедленно отправляет ему сообщение ok. Это означает, что следующий процесс после запуска следующего процесса получит ok и завершится. Так что, на самом деле, не будет много процессов, выполняющихся одновременно.

Один из способов увидеть это - запустить 100M процессов, в то время как система по умолчанию допускает ~ 34k процессов одновременно .

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

Наличие большого количества процессов не является гарантией параллелизма в вашем приложении. Описание проблемы см. В Законе Амдала .

...