2009-02-04 5 views
4

Кто-нибудь знает, существует ли какая-то «балансировка нагрузки» в стандартной библиотеке erlang? Я имею в виду, если у меня есть действительно простые операции с действительно большим набором данных, накладные расходы на создание процесса для каждого элемента будут больше, чем выполнение операции последовательно. Но если я смогу сбалансировать работу в «правильном числе» процесса, он будет работать лучше, поэтому я в основном спрашиваю, есть ли простой способ выполнить эту задачу.Балансировка процесса в Erlang

Кстати, знает ли кто-нибудь, что приложение OTP выполняет какую-то балансировку? Я имею в виду, что в приложении OTP существует понятие «рабочий процесс» (например, рабочий поток java-ish)?

ответ

3

Модуль plists, вероятно, делает то, что вы хотите. Это в основном параллельная реализация модуля lists, который будет использоваться в качестве замены. Тем не менее, вы также можете контролировать, как он распараллеливает свои операции, например, определяя, сколько рабочих процессов должно быть порождено и т. Д.

Возможно, вы сделали бы это, вычислив некоторое количество работников в зависимости от длины списка или нагрузки системы и т.д.

с сайта:

plists является заменой для списков модулей Erlang, что делает большинство список операций параллельно. Он может работать на каждый элементе параллельно, для IO-связанных операций, на подсписках параллельно, с точкой зрения использования многоядерных машин с CPU-связанной операций, и через Эрланг узлы, для parallizing внутри кластера , Он обрабатывает ошибки и сбои узлов. Это может быть настроено, настроено и изменено , чтобы получить оптимальную производительность, в то время как минимизирует накладные расходы.

13

См. Модули pg2 и pool.

pg2 реализует довольно простой распределенный пул процессов. pg2:get_closest_pid/1 возвращает «ближайший» pid, то есть случайный локальный процесс, если он доступен, в противном случае случайный удаленный процесс.

pool осуществляет балансировку нагрузки между узлами, начатыми с модуля slave.

0

Невозможно предсказать стоимость работ механически без меры, например, сделать это. Кто-то должен определить, как разделить работу на какой-то класс задач. В слове балансировки нагрузки я понимаю нечто совершенно иное, чем в вашем вопросе.

1

Нет, на мой взгляд, полезный универсальный инструмент балансировки нагрузки в otp. И, возможно, это полезно только в отдельных случаях. Его достаточно просто реализовать самостоятельно. плиты могут быть полезны в тех же случаях. Я не верю в параллельные библиотеки в качестве замены реальной вещи. Амдаль будет преследовать вас навсегда, если вы пойдете по этому пути.

Правильное количество рабочих процессов равно количеству планировщиков. Это может варьироваться в зависимости от того, какая другая работа выполняется в системе. Использование,

erlang:system_info(schedulers_online) -> NS 

для получения количества планировщиков.

Понятие накладных расходов при наводнении системы изобилием рабочих процессов несколько ошибочно. Накладные расходы связаны с новыми процессами, но не так сильно, как с os-thread. Основными издержками являются копирование сообщений между процессами, это может быть облегчено с использованием двоичных файлов, поскольку отправляется только ссылка на двоичную информацию. С eterms структура сначала расширяется, а затем копируется в другой процесс.