2010-08-02 9 views
10

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

14

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.

6

"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

+0

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

+0

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

+0

Hmm ... Intendevi i processi di Erlang e il nodo di Erlang nella domanda originale? – hdima

Problemi correlati