mjs*_*mjs 10 erlang message-passing
在节点之间,消息(必须)通过TCP/IP传递.但是,它们在同一节点上运行的进程之间传递了什么机制?在这种情况下是否也使用TCP/IP?Unix域套接字?"节点内"和"节点间"消息传递之间的性能差异是什么?
War*_*ung 14
通过什么机制在同一节点上运行的进程之间传递?
因为同一节点上的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