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
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.
« 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
- 1. Erlang et les processus
- 2. Communication entre les formulaires "Pas même processus"
- 3. Erlang: démarrer le noeud esclave
- 4. Boucles de messages Erlang
- 5. Messages Java à Erlang
- 6. processus de registre Erlang
- 7. Distinction entre les messages diffusés et les messages directs
- 8. Tuyau entre le processus en cours et les autres processus
- 9. Même communication Erlang Machine
- 10. socket passant entre les processus
- 11. WINAPI: Regardez les messages d'un autre processus
- 12. Émuler la souris sélectionnez les messages entre les fenêtres
- 13. erlang - comment limiter la file d'attente des messages ou l'émuler?
- 14. C# passer des messages entre les classes
- 15. Processus de génération sur un cluster erlang
- 16. SVN: traduction entre le chemin et les ID de noeud?
- 17. Comment communiquer entre les modèles Rhapsody dans différents processus/systèmes?
- 18. Django - Temps minimum entre les messages
- 19. Est-ce que les applications Erlang séparées doivent partager la même machine virtuelle sur la même machine?
- 20. PHP passer des messages entre les pages
- 21. Création d'un motif pour séparer les messages du processus réel
- 22. erreur de restriction sur les messages entre SQLSERVER et dot.net
- 23. Erlang: Noeud non autorisé/Peut-être Question de cookie
- 24. killall sur le processus du même nom
- 25. Comment transférer des données sensibles entre les processus dans Windows?
- 26. fichier Duplication gère entre les processus d'erreur
- 27. Comment obtenir l'identifiant de processus du processus appelant dans erlang?
- 28. Comment débugger les fonctions d'includes dans Erlang?
- 29. Opérations binaires sur les binaires Erlang?
- 30. comment identifier les messages d'erreur IE Messages
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
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
Hmm ... Vouliez-vous dire les processus Erlang et le nœud Erlang dans la question originale? – hdima