Tra i nodi, i messaggi sono (devono essere) passati su TCP/IP. Tuttavia, con quale meccanismo vengono passati tra processi in esecuzione sullo stesso nodo? TCP/IP è usato anche in questo caso? Socket di dominio Unix? Qual è la differenza di prestazioni tra "within node" e "between node" message passing?In che modo Erlang trasmette messaggi tra processi sullo stesso nodo?
risposta
qual è il meccanismo che passati tra processi in esecuzione su lo stesso nodo?
Poiché i processi di Erlang sullo stesso nodo sono tutti in esecuzione all'interno di un unico processo nativo — delle strutture dei messaggi BEAM emulatore — sono semplicemente copiati nella coda di messaggi del ricevitore. La struttura del messaggio viene copiata, piuttosto che semplicemente referenziata, per tutti i motivi di programmazione funzionale standard senza effetti collaterali.
Vedere erts_send_message()
in erts/emulator/beam/erl_message.c
nelle fonti di Erlang per ulteriori dettagli. In R15B01, i bit più rilevanti per la tua domanda iniziano alla riga 980 o giù di lì, con la chiamata a erts_queue_message()
.
Se si è scelto di eseguire più emulatori BEAM su una singola macchina fisica, suppongo che i messaggi vengano inviati tra di loro allo stesso modo che tra diverse macchine fisiche. Probabilmente non ci sono buone ragioni per farlo ora che BEAM ha un buon supporto SMP.
Qual è la differenza di prestazioni tra "entro il nodo" e "tra il nodo" che passa il messaggio?
Un semplice punto di riferimento sul vostro hardware reale sarebbe più utile per voi di prove aneddotiche da altri.
Se si desidera che le generalità, tuttavia, osservino che le larghezze di banda di memoria sono around 20 GByte/sec in questi giorni e che è improbabile che si abbia un collegamento di rete più veloce di 10 Gbit/sec tra i nodi. Ciò significa che mentre possono esserci molte differenze tra la tua applicazione reale e qualsiasi benchmark semplice che esegui o trovi, queste differenze probabilmente non possono sommergere una differenza di ordine di grandezza nella velocità di trasferimento.
Se "solo" un collegamento di rete end-to-end da 1 Gbit/sec tra i nodi, i trasferimenti intranodici saranno probabilmente superiori a due ordini di grandezza più veloci rispetto ai trasferimenti internodi.
"Ogni dato nella messaggi tra processi Erlang viene copiato, ad eccezione dei binari refC sullo stesso nodo Erlang.":
http://erlang.org/doc/efficiency_guide/processes.html#id2265332
- 1. Loop di messaggi Erlang
- 2. Scrittura affidabile sullo stesso file da processi diversi
- 3. In che modo i processi di supervisione controllano i processi? Lo stesso può essere fatto sulla JVM?
- 4. scrittura simultanea sullo stesso file utilizzando thread e processi
- 5. Riduzione dei processi di Erlang
- 6. In che modo l'accesso a erlang è una risorsa condivisa?
- 7. Due processi di lettura/scrittura sullo stesso file Python
- 8. Jenkins non consente che lo stesso lavoro venga eseguito contemporaneamente sullo stesso nodo?
- 9. Processi leggeri in stile Erlang in .NET
- 10. Erlang C nodo connessa interrogazione
- 11. Java a messaggi di Erlang
- 12. Più utenti che scrivono sullo stesso file
- 13. In che modo un'applicazione Metro in Windows 8 può comunicare con un'app desktop back-end sullo stesso computer?
- 14. Comunicazione tra due applicazioni PHP sullo stesso server?
- 15. In che modo il bilanciamento del carico del sistema operativo tra più processi accetta lo stesso socket?
- 16. Come i processi di Erlang accedono contemporaneamente alla cassetta postale
- 17. Che cosa è esattamente un nodo in node.js?
- 18. Erlang: RPC a un nodo con output su quel nodo
- 19. Classificare i processi del nodo con MPI e FORTRAN
- 20. Come impostare le autorizzazioni in modo che due utenti possano lavorare sullo stesso repository hg?
- 21. Come configurare VirtualHosts in modo che punti due porte sullo stesso IP a diversi nomi server?
- 22. Più grafici sullo stesso grafico in seaborn
- 23. In che modo Phusion Passenger riutilizza thread e processi?
- 24. come mantenere le variabili che condividono tutti i processi del nodo nel nodo cluster?
- 25. Angular2 - * ngFor e * ngIf sullo stesso elemento che produce errore
- 26. git diff due file sullo stesso ramo, stesso commettono
- 27. Come monitorare un nodo di erlang remoto che era inattivo e in fase di riavvio
- 28. Esiste un'API di comunicazione tra processi di alto livello implementata sia in C++ che in Javascript
- 29. Come posso condividere la memoria tra i processi in MATLAB?
- 30. In che modo gli attori di Erlang differiscono dagli oggetti OOP?
Se TCP/IP fosse utilizzato come trasporto, il messaggio verrebbe sicuramente "copiato", ma potrebbero essere copiati anche se fossero utilizzati altri meccanismi, quindi penso che questo risolva la domanda. – mjs
Tutti i dati nei messaggi tra i processi di Erlang sullo stesso nodo Erlang vengono copiati nella memoria. Inoltre i binari di refc sono condivisi tra i processi di Erlang sullo stesso nodo di Erlang. Quindi è molto più veloce di TCP/IP. – hdima
Hmm ... Intendevi i processi di Erlang e il nodo di Erlang nella domanda originale? – hdima