2010-08-02 24 views
10

entre nodos, mensaje están (deben ser) pasa a través de TCP/IP. Sin embargo, ¿por qué mecanismo se pasan entre los procesos que se ejecutan en el mismo nodo? ¿Se usa TCP/IP en este caso también? Zócalos de dominio Unix? ¿Cuál es la diferencia en el rendimiento entre el paso de mensajes "dentro del nodo" y "entre nodos"?¿Cómo pasa Erlang mensajes entre procesos en el mismo nodo?

Respuesta

14

por qué mecanismo se pasaron entre los procesos que se ejecutan en el mismo nodo?

Debido a que los procesos de Erlang en el mismo nodo están ejecutando dentro de un solo proceso nativo — las estructuras de los mensajes BEAM emulador — simplemente se copian en la cola de mensajes del receptor. La estructura del mensaje se copia, en lugar de simplemente hacer referencia, para todos los motivos de programación funcional sin efectos secundarios.

Consulte erts_send_message() en erts/emulator/beam/erl_message.c en las fuentes de Erlang para obtener más información. En R15B01, los bits más relevantes a su pregunta comienzan en la línea 980 o menos, con la llamada a erts_queue_message().

Si habéis elegido para ejecutar múltiples emuladores BEAM en una única máquina física, yo supongo mensajes se envían entre ellos del mismo modo que entre las diferentes máquinas físicas. Probablemente no haya una buena razón para hacerlo ahora que BEAM tiene un buen soporte SMP.

¿Cuál es la diferencia de rendimiento entre los mensajes "dentro del nodo" y "entre nodos"?

Un punto de referencia simple en su hardware real sería más útil para usted que la evidencia anecdótica de los demás.

Si desea generalidades, sin embargo, tenga en cuenta que los anchos de banda de memoria son around 20 GByte/sec en estos días, y que es poco probable que tenga un enlace de red de nodos de más de 10 Gbit/seg. Eso significa que, si bien puede haber muchas diferencias entre su aplicación real y cualquier referencia sencilla de llevar a cabo o se encuentra, probablemente, estas diferencias pueden no pantano un orden de magnitud de diferencia en la velocidad de transferencia.

Si "solo" tiene un enlace de red de extremo a extremo de 1 Gbit/seg entre nodos, las transferencias intranode probablemente serán más de dos órdenes de magnitud más rápidas que las transferencias de internodos.

6

"Todos los datos en los mensajes entre procesos Erlang se copia, con la excepción de los binarios REFC en el mismo nodo Erlang.":

http://erlang.org/doc/efficiency_guide/processes.html#id2265332

+0

Si TCP/IP se utiliza como el transporte, el mensaje sería sin duda "copia", pero también se podría copiar utilizarse si se utiliza algún otro mecanismo, por lo que creo que esto resuelve la cuestión. – mjs

+0

Todos los datos en mensajes entre procesos de Erlang en el mismo nodo de Erlang se copian en la memoria. Además, los binarios de refc se comparten entre los procesos de Erlang en el mismo nodo de Erlang. Por lo tanto, es mucho más rápido que TCP/IP. – hdima

+0

Hmm ... ¿Se refiere a los procesos de Erlang y Erlang nodo en la pregunta original? – hdima

Cuestiones relacionadas