2010-07-23 19 views
5

Estoy investigando este verano y estoy trabajando en la paralelización del código preexistente. El enfoque principal en este momento es una forma de balancear la carga del código para que funcione más eficientemente en el clúster. La tarea actual es hacer una prueba de concepto que cree varios procesos con cada uno teniendo su propia pila disponible y cuando el proceso termine de procesar la pila, consulte los dos procesos más cercanos para ver si tienen más trabajo disponible en su pila.Implementando el equilibrio de carga con Python

Tengo dificultades para conceptualizar esto en python, pero esperaba que alguien me pudiera orientar en la dirección correcta o tener algún tipo de ejemplo similar en mpi4py o ParallelPython. Además, si alguien sabe de un módulo mejor o más fácil, sería genial saberlo.

Gracias.

Respuesta

11

Aquí hay una manera simple de hacerlo.

  1. Crea una sola cola común de trabajo compartida para hacer. Esta aplicación llenará esta cola con tareas pendientes.

  2. Crea una aplicación que obtiene un elemento de la cola y hace el trabajo.

Este es el diseño de un solo productor-consumidor múltiple. Funciona bien y puede inundar su máquina con procesos paralelos.

Para utilizar la clase de cola incorporada, debe envolver la cola en algún tipo de API de multiprocesamiento . http://docs.python.org/library/queue.html. Personalmente, me gusta crear un pequeño servidor web basado en HTTP que maneje la cola. Cada aplicación hace un GET para buscar el siguiente trabajo.

Puede usar herramientas como RabbitMQ para crear una cola compartida muy agradable. http://nathanborror.com/posts/2009/may/20/working-django-and-rabbitmq/

Es posible que pueda utilizar http://hjb.python-hosting.com/ para hacer uso de las colas JMS.

Necesitará una pequeña aplicación para crear y completar la cola con el trabajo.

Crea tantas copias de la aplicación como quieras. Por ejemplo:

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

Esto ejecutará 10 copias simultáneas de su aplicación. Los 10 están tratando de obtener trabajo de una sola cola. Usarán todos los recursos de CPU disponibles y el sistema operativo los programará muy bien para usted.


Peer, la sincronización de nodo a nodo significa que tiene O rutas de comunicación (n * (n-1)/2) entre todos los nodos.

Los "dos nodos adyacentes" significa que todavía tiene 2 * n rutas de comunicación y el trabajo tiene que "de alguna manera" gotear entre los nodos. Si todos los nodos están inicialmente sembrados de trabajo, entonces alguien hizo una gran cantidad de planificación para equilibrar la carga de trabajo. Si vas a hacer tanta planificación, ¿por qué pedirles a los nodos que se sincronicen?

Si las colas no se balancean cuidadosamente para comenzar, entonces cada nodo par podría ser lento. Cada nodo impar podría ser rápido.Los nodos impares terminan primero, verifican el trabajo desde dos nodos pares, y esos nodos son (a) no terminados y (b) tampoco tienen más trabajo por hacer. ¿Ahora que? La mitad de los nodos funcionan, la mitad están inactivos. Todo debido a una planificación deficiente en la distribución inicial del trabajo.

Master-slave significa que tiene n rutas de comunicación. Además, el balanceo es automático ya que todos los nodos inactivos tienen igual acceso al trabajo. No existe una distribución inicial sesgada que conduzca a un rendimiento general deficiente.

+0

Gracias, esto es similar al diseño actual del programa, sino que está deseando tener un nodo de estructura de nodos en lugar de una estructura maestro-esclavo. Además, si se tiene acceso a una sola cola muchas veces desde varios procesos, ¿se crea un posible cuello de botella en un clúster? – patemotter

+0

@DistortedLojik: la cola individual no debería ser un problema a menos que cada paquete de trabajo sea microscópicamente pequeño. Es pura sobrecarga, por lo que desea que el costo del acceso a la cola se amortice con una gran cantidad de trabajo de alto valor. –

Cuestiones relacionadas