ノード間で、メッセージは TCP/IP を介して渡されます (する必要があります)。ただし、同じノードで実行されているプロセス間でどのようなメカニズムで渡されるのでしょうか? この場合も TCP/IP を使用しますか? Unix ドメインソケット? 「ノード内」と「ノード間」のメッセージ パッシングのパフォーマンスの違いは何ですか?
2 に答える
同じノードで実行されているプロセス間でどのようなメカニズムで渡されますか?
同じノード上の Erlang プロセスはすべて単一のネイティブ プロセス (BEAM エミュレーター) 内で実行されているため、メッセージ構造は単に受信者のメッセージ キューにコピーされます。メッセージ構造は、標準的な副作用のない関数型プログラミングのすべての理由から、単に参照されるのではなく、コピーされます。
詳細についてerts_send_message()
はerts/emulator/beam/erl_message.c
、Erlang のソースを参照してください。R15B01 では、質問に最も関連するビットは 980 行目あたりから始まり、erts_queue_message()
.
単一の物理マシンで複数の BEAM エミュレーターを実行することを選択した場合、メッセージは異なる物理マシン間と同じ方法でそれらの間で送信されると思います。ただし、BEAM が優れた SMP をサポートしているため、これを行う正当な理由はおそらくないでしょう。
「ノード内」と「ノード間」のメッセージ パッシングのパフォーマンスの違いは何ですか?
実際のハードウェアでの単純なベンチマークは、他の人からの逸話的な証拠よりも有用です。
ただし、一般論が必要な場合は、最近のメモリ帯域幅は約 20 GByte/秒であり、ノード間で 10 Gbit/秒よりも高速なネットワーク リンクを使用する可能性は低いことに注意してください。つまり、実際のアプリケーションと、実行または見つけた単純なベンチマークとの間には多くの違いがあるかもしれませんが、これらの違いはおそらく、転送速度の桁違いの違いを圧倒することはできないということです。
ノード間に 1 ギガビット/秒のエンドツーエンド ネットワーク リンクが「のみ」ある場合、ノード内転送はおそらくノード間転送よりも 2 桁以上高速になります。
"同じ Erlang ノード上の refc バイナリを除いて、Erlang プロセス間のメッセージ内のすべてのデータがコピーされます。":
http://erlang.org/doc/efficiency_guide/processes.html#id2265332