在节点之间,消息(必须)通过 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/sec,并且节点之间的网络链接速度不太可能超过 10 Gbit/sec。这意味着,虽然您的实际应用程序与您执行或找到的任何简单基准测试之间可能存在许多差异,但这些差异可能不会淹没传输速率的一个数量级差异。
如果您“仅”在节点之间拥有 1 Gbit/sec 的端到端网络链接,则节点内传输可能比节点间传输快两个数量级以上。
“Erlang 进程之间消息中的所有数据都被复制,同一个 Erlang 节点上的 refc 二进制文件除外。”:
http://erlang.org/doc/efficiency_guide/processes.html#id2265332