2010-08-02 6 views
10

Entre les nœuds, les messages sont (doivent être) transmis via TCP/IP. Cependant, par quel mécanisme sont-ils transmis entre les processus s'exécutant sur le même nœud? TCP/IP est-il également utilisé dans ce cas? Sockets de domaine Unix? Quelle est la différence de performance entre le passage de message "dans un noeud" et "entre un noeud"?Comment Erlang transmet-il les messages entre les processus sur le même noeud?

Répondre

14

par quel mécanisme sont-ils passés entre les processus en cours d'exécution sur le même noeud?

Parce que les processus Erlang sur le même nœud sont tous en cours d'exécution dans un seul processus natif — les structures de message émulateur BEAM — sont simplement copiés dans la file d'attente de messages du récepteur. La structure du message est copiée, plutôt que simplement référencée, pour toutes les raisons standard de programmation fonctionnelle sans effets secondaires. Voir erts_send_message() dans erts/emulator/beam/erl_message.c dans les sources Erlang pour plus de détails. Dans R15B01, les bits les plus pertinents à votre question commencent à la ligne 980, avec l'appel à erts_queue_message().

Si vous avez choisi d'exécuter plusieurs émulateurs BEAM sur une seule machine physique, je suppose que les messages sont envoyés entre eux de la même manière qu'entre différentes machines physiques. Il n'y a probablement aucune bonne raison de le faire maintenant que BEAM a un bon support SMP, cependant. Quelle est la différence de performance entre le passage de message "à l'intérieur d'un noeud" et "entre deux noeuds"? Un simple benchmark sur votre matériel réel vous serait plus utile que d'autres preuves anecdotiques. Si vous voulez des généralités, cependant, observez que les bandes passantes mémoire sont around 20 GByte/sec ces jours-ci, et que vous avez peu de chances d'avoir un lien réseau plus rapide que 10 Gbit/s entre les nœuds. Cela signifie que bien qu'il puisse y avoir de nombreuses différences entre votre application réelle et tout benchmark simple que vous effectuez ou trouvez, ces différences ne peuvent probablement pas submerger une différence d'ordre de grandeur du taux de transfert. Si vous avez "seulement" une liaison de bout en bout à 1 Gbit/s entre les nœuds, les transferts intranodaux seront probablement plus de deux ordres de grandeur plus rapides que les transferts entre nœuds.

6

« Toutes les données dans les messages entre les processus Erlang est copié, à l'exception des binaires REFC sur le même noeud Erlang. »:

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

+0

Si TCP/IP était utilisé comme transport, le message serait certainement "copié", mais il pourrait également être copié si un autre mécanisme était utilisé, donc je pense que cela résout la question. – mjs

+0

Toutes les données dans les messages entre les processus Erlang sur le même nœud Erlang sont copiées dans la mémoire. De plus, les binaires refc sont partagés entre les processus Erlang sur le même nœud Erlang. Donc, c'est beaucoup plus rapide que TCP/IP. – hdima

+0

Hmm ... Vouliez-vous dire les processus Erlang et le nœud Erlang dans la question originale? – hdima

Questions connexes