Балансировка процессов в Erlang
-
21-08-2019 - |
Вопрос
Кто-нибудь знает, есть ли в стандартной библиотеке erlang своего рода «балансировщик нагрузки»?Я имею в виду, что если у меня есть действительно простые операции с действительно большим набором данных, накладные расходы на построение процесса для каждого элемента будут больше, чем на последовательное выполнение операции.Но если я смогу сбалансировать работу в «нужном количестве» процессов, она будет работать лучше, поэтому я в основном спрашиваю, есть ли простой способ выполнить эту задачу.
Кстати, кто-нибудь знает, выполняет ли OTP-приложение какую-то балансирующую нагрузку?Я имею в виду, что в приложении OTP есть концепция «рабочего процесса» (например, Java-потока)?
Решение
А plists
модуль, вероятно, делает то, что вы хотите.По сути, это параллельная реализация lists
модуль, предназначенный для использования в качестве замены.Однако вы также можете контролировать, как он распараллеливает свои операции, например, определяя, сколько рабочих процессов должно быть создано и т. д.
Вероятно, вы бы сделали это, рассчитав некоторое количество рабочих в зависимости от длины списка или загрузки системы и т. д.
С веб-сайта:
PLISS-это замена для списков модулей Erlang, что делает большинство операций списков параллельными.Он может работать на каждом элементе параллельно, для IO-связанных операций, параллельно, для того, чтобы использовать многоядерные машины с операциями с процессорами, и через узлы Erlang, для параллирования внутри кластера.Он обрабатывает ошибки и сбои узлов.Он может быть настроен, настроен и настроен, чтобы получить оптимальную производительность при минимизации накладных расходов.
Другие советы
См. модули pg2
и pool
.
pg2
реализует довольно простой пул распределенных процессов. pg2:get_closest_pid/1
возвращает «ближайший» pid, т.е.случайный локальный процесс, если он доступен, в противном случае случайный удаленный процесс.
pool
реализует балансировку нагрузки между узлами, запущенными с модуля slave
.
На мой взгляд, в otp нет полезного универсального инструмента балансировки нагрузки.И, возможно, иметь его полезно только в определенных случаях.Достаточно легко реализовать его самостоятельно.plists могут быть полезны в тех же случаях.Я не верю в параллельные библиотеки как в замену реальной вещи.Амдал будет преследовать тебя вечно, если ты пойдешь по этому пути.
Нужное количество рабочих процессов равно количеству планировщиков.Это может варьироваться в зависимости от того, какие еще работы выполняются в системе.Использовать,
erlang:system_info(schedulers_online) -> NS
чтобы получить количество планировщиков.
Представление о накладных расходах при переполнении системы множеством рабочих процессов несколько ошибочно.При использовании новых процессов возникают накладные расходы, но не такие большие, как при использовании потоков операционной системы.Основные накладные расходы — это копирование сообщений между процессами. Эту проблему можно уменьшить с помощью двоичных файлов, поскольку отправляется только ссылка на двоичный файл.При использовании eterms структура сначала расширяется, а затем копируется в другой процесс.
Невозможно механически спрогнозировать стоимость работы, не измерив ее, например, не сделав это.Кто-то должен определить, как распределить работу по определенному классу задач.Под словом балансировщик нагрузки я понимаю совсем другое, чем в вашем вопросе.