Pergunta

Alguém sabe se existe uma espécie de 'balanceador de carga' na biblioteca padrão erlang? Quer dizer, se eu tiver algumas operações muito simples em um realmente grande conjunto de dados, a sobrecarga de construir um processo para cada item será maior do que executar a operação sequencialmente. Mas se eu posso equilibrar o trabalho no 'número certo' de processo, ele terá um desempenho melhor, então estou basicamente perguntando se existe uma maneira fácil de realizar essa tarefa.

A propósito, alguém sabe se um aplicativo OTP faz algum tipo de carga equilíbrio? Quer dizer, em um aplicativo OTP existe o conceito de um "processo de trabalho" (como um trabalhador fio java-ish)?

Foi útil?

Solução

O plists módulo provavelmente faz o que quiser. É basicamente uma implementação paralela do módulo lists, projetar para ser usado como um substituto. No entanto, você também pode controlar como ele parallelizes suas operações, por exemplo, definindo quantos processos de trabalho devem ser gerados etc.

Você provavelmente iria fazê-lo por meio do cálculo algum número de trabalhadores, dependendo do comprimento da lista ou a carga do sistema etc.

A partir do site:

plists é um substituto para as listas do módulo Erlang, tornando mais operações lista paralela. Pode operar em cada elemento em paralelo, para operações de IO-ligados, em sublists em paralelo, para tirar vantagem de máquinas de vários núcleos com CPU-bound operações, e entre os nós Erlang, para parallizing dentro de um aglomerado. isto erros alças e falhas nó. isto pode ser configurado, sintonizado, e mexido para obter um ótimo desempenho, enquanto minimizando a sobrecarga.

Outras dicas

Veja módulos pg2 e pool.

implementos pg2 bastante simples pool de processos distribuídos. pg2:get_closest_pid/1 retornos pid "mais próximo", ou seja, processo local aleatório se disponível, processo remoto de outra forma aleatória.

implementos pool balanceamento de carga entre os nós iniciados com o módulo slave.

Não há, na minha opinião, usefull ferramenta de balanceamento de carga genéricos no otp. E talvez seja útil somente para ter um em casos específicos. É fácil o suficiente para implementar um você mesmo. plists pode ser útil nos mesmos casos. Eu não acredito em paralelo bibliotecas como um substituto para a coisa real. Amdahl vai assombrá-lo para sempre se você trilhar este caminho.

O número certo de processos de trabalho é igual ao número de programadores. Isso pode variar, dependendo do que outro trabalho é feito no sistema. Uso,

erlang:system_info(schedulers_online) -> NS

para obter o número de programadores.

A noção de sobrecarga quando inundando o sistema com uma abundância de processos de trabalho é um pouco defeituoso. Há sobrecarga com novos processos, mas não tanto quanto com os-threads. O principal sobrecarga é a cópia de mensagens entre processos, esta pode ser aliviada com o uso de binários uma vez que apenas a referência para o binário é enviado. Com eterms a estrutura é primeiro expandido, em seguida, copiados para o outro processo.

Não há nenhuma maneira como prever o custo do trabalho mecanicamente sem medida que por exemplo fazê-lo. Alguma pessoa deve determinar como particionar trabalho para alguma classe de tarefas. Na palavra do balanceador de carga Eu entendo algo muito diferente do que na sua pergunta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top