Erlang如何在同一节点上的进程之间传递消息?

时间:2010-08-02 19:56:55

标签: erlang message-passing

在节点之间,消息(必须)通过TCP / IP传递。但是,它们在同一节点上运行的进程之间传递了什么机制?在这种情况下是否也使用TCP / IP? Unix域套接字? “节点内”和“节点间”消息传递之间的性能差异是什么?

2 个答案:

答案 0 :(得分:14)

  

它们在同一节点上运行的进程之间传递了什么机制?

因为同一节点上的Erlang进程都在单个本机进程中运行 - BEAM仿真器 - 消息结构只是复制到接收者的消息队列中。对于所有标准的无副作用函数编程原因,复制消息结构而不是简单引用。

有关详细信息,请参阅Erlang源代码中erts_send_message()中的erts/emulator/beam/erl_message.c。在R15B01中,与您的问题最相关的位从第980行左右开始,调用erts_queue_message()

如果您确实选择在单个物理计算机上运行多个BEAM仿真器,我猜测消息之间的发送方式与不同物理计算机之间的方式相同。现在BEAM有很好的SMP支持可能没有充分的理由这样做。

  

“在节点内”和“节点之间”消息传递之间的性能差异是什么?

对您而言,一个简单的基准测试对您来说比其他人的轶事证据更有用。

但是,如果您想要通用性,请注意目前内存带宽为around 20 GByte/sec,并且您不可能在节点之间拥有超过10 Gbit / sec的网络链接。这意味着虽然您的实际应用与您执行或找到的任何简单基准之间可能存在许多差异,但这些差异可能无法淹没传输速率的数量级差异。

如果您“仅”在节点之间具有1 Gbit / sec的端到端网络链接,则节点内传输可能比节点间传输快两个数量级。

答案 1 :(得分:6)

“复制Erlang进程之间消息中的所有数据,但同一Erlang节点上的refc二进制文件除外。”:

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