Implementação De Balanceamento De Carga Utilizando Python

Estou a fazer algumas pesquisas este verão e a trabalhar em paralelo com o código pré-existente. O foco principal agora é uma maneira de equilibrar o código para que ele funcione mais eficiente no cluster. A tarefa atual é fazer uma prova de conceito que cria vários processos com cada um tendo sua própria pilha disponível e quando o processo é concluído o processamento da pilha de consulta os dois mais próximos processos para ver se eles têm mais trabalho disponível na sua pilha.

estou tendo dificuldades para conceituar isso em python, mas estava esperando que alguém pudesse me apontar na direção certa ou ter algum tipo de exemplo que seja semelhante em mpi4py ou ParallelPython. Também se alguém sabe de um módulo melhor ou mais fácil, então isso seria ótimo para saber.

Obrigado.

Author: patemotter, 2010-07-23

2 answers

Eis uma maneira simples de fazer isto.
  1. Criar uma única fila comum de trabalho para fazer. Aplicacao irá preencher esta fila com trabalho a fazer.

  2. Crie um aplicativo que recebe um item da fila, e faz o trabalho.

Este é o design de produtor único e múltiplo consumidor. Funciona bem e pode inundar a sua máquina com processos paralelos.

Para usar a classe de fila incorporada, você precisa de embrulhar a fila de algum tipo de API multi-processamento. http://docs.python.org/library/queue.html . pessoalmente, eu gosto de criar um pequeno servidor web baseado em HTTP que lida com a fila. Cada aplicação Vai buscar o próximo trabalho.

Você pode usar ferramentas como RabbitMQ para criar uma fila compartilhada muito agradável. http://nathanborror.com/posts/2009/may/20/working-django-and-rabbitmq/

Talvez possa usar http://hjb.python-hosting.com / para utilizar JMS fila.

Você vai precisar de uma pequena aplicação para criar e preencher a fila com trabalho.

Crie quantas cópias da aplicação quiser. Por exemplo:

for i in 1 2 3 4 5 6 7 8 9 10
do
    python myapp.py &
done

Isto irá executar 10 cópias simultâneas da sua aplicação. Todos os 10 estão tentando obter trabalho a partir de uma única fila. Eles vão usar todos os recursos disponíveis da CPU e o sistema operacional irá agendá-los muito bem para você.


Ponto, sincronização de nó para nó significa que você tem o(n*(n-1)/2) caminhos de comunicação entre todos no.

Os " dois nós adjacentes "significa que você ainda tem 2*n caminhos de comunicação e o trabalho tem que" de alguma forma " trickle entre os nós. Se todos os nós são inicialmente semeados com trabalho, então alguém fez um monte de planejamento para equilibrar a carga de trabalho. Se você vai fazer tanto planejamento, por que pedir aos nós para sincronizar em tudo?

Se as filas não estiverem cuidadosamente equilibradas para começar do que todos os nós pares podem ser lentos. Cada nó estranho pode ser rápido. Os nós ímpares terminam primeiro, verifique para o trabalho a partir de dois nós pares, e esses nós são (a) não feito e (B) não tem mais trabalho a fazer, também. E agora? Metade dos nós estão a funcionar, metade estão inactivos. Tudo devido ao mau planejamento na distribuição inicial do trabalho.

Mestre-escravo significa que tem n caminhos de comunicação. Além disso, o equilíbrio é automático, uma vez que todos os nós ociosos têm acesso igual ao trabalho. Não existe uma distribuição inicial tendenciosa que leve a um mau desempenho geral.
 11
Author: S.Lott, 2010-07-23 19:53:26

Utilizarmultiprocessamento Módulo

 0
Author: onsy, 2011-04-12 05:51:47