Вопрос

Кто-нибудь знает, есть ли в стандартной библиотеке 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 структура сначала расширяется, а затем копируется в другой процесс.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top