Pregunta

¿Alguien sabe si existe una especie de 'equilibrador de carga' en la biblioteca estándar de erlang?Quiero decir, si tengo algunas operaciones realmente simples en un conjunto de datos realmente grande, la sobrecarga de construir un proceso para cada elemento será mayor que la de realizar la operación secuencialmente.Pero si puedo equilibrar el trabajo en el "número correcto" de procesos, funcionará mejor, por lo que básicamente pregunto si existe una manera fácil de realizar esta tarea.

Por cierto, ¿alguien sabe si una aplicación OTP realiza algún tipo de carga de saldo?Quiero decir, en una aplicación OTP existe el concepto de "proceso de trabajo" (como un trabajador de subprocesos de Java).

¿Fue útil?

Solución

El plists módulo probablemente hace lo que quiere. Se trata básicamente de una aplicación paralela de la lists módulo, el diseño para ser utilizado como una gota en el reemplazo. Sin embargo, también se puede controlar la forma en que paraleliza sus operaciones, por ejemplo, mediante la definición de cuántos procesos de trabajo deben ser generado etc.

Es probable que lo haría mediante el cálculo de un número de trabajadores en función de la longitud de la lista o la carga del sistema, etc.

Desde el sitio web:

  

plists es un reemplazo de acogida para   las listas del módulo Erlang, por lo que la mayor parte   la lista de operaciones paralelas. Puede   operar en cada elemento en paralelo,   para las operaciones de IO de ruedas, en sublistas   en paralelo, para aprovechar las   máquinas de múltiples núcleos con CPU-bound   operaciones, ya través de los nodos de Erlang,   para parallizing dentro de un clúster. Eso   se ocupa de los errores y fallos en los nodos. Eso   Se pueden configurar, en sintonía, y ajustado   para obtener un rendimiento óptimo mientras   minimizar la sobrecarga.

Otros consejos

Ver módulos pg2 y pool.

pg2 Implementa un grupo de procesos distribuidos bastante simple. pg2:get_closest_pid/1 devuelve el pid "más cercano", es decirproceso local aleatorio si está disponible; de ​​lo contrario, proceso remoto aleatorio.

pool implementa el equilibrio de carga entre nodos iniciados con el módulo slave.

No hay, en mi opinión, muy útil herramienta de equilibrio de carga genérica en OTP. Y tal vez sólo es útil tener uno en casos específicos. Es bastante fácil de implementar uno mismo. plists pueden ser útiles en los mismos casos. Yo no creo en paralelo las bibliotecas como un sustituto de la cosa real. Amdahl perseguirá para siempre si usted camina este camino.

El número correcto de los procesos de trabajo es igual al número de programadores. Esto puede variar dependiendo de lo que otros trabajos se realiza en el sistema. El uso,

erlang:system_info(schedulers_online) -> NS

para obtener el número de programadores.

La noción de sobrecarga cuando inundar el sistema con una gran cantidad de procesos de trabajo es algo defectuosa. Hay por encima con nuevos procesos, pero no tanto como con os-hilos. La sobrecarga principal es la copia de mensajes entre procesos, esto puede ser aliviado con el uso de los binarios ya que sólo la referencia al binario se envía. Con eterms la estructura primero se expande entonces copia en el otro proceso.

No hay manera de cómo predecir coste de los trabajos mecánica, sin medirlo por ejemplo hacerlo. Alguna persona debe determinar cómo dividir el trabajo por alguna clase de tareas. En palabra equilibrador de carga entiendo algo muy diferente que en su pregunta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top