【问题标题】:How does Erlang pass messages between processes on the same node?Erlang 如何在同一节点上的进程之间传递消息?
【发布时间】:2011-03-24 09:45:05
【问题描述】:

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

【问题讨论】:

    标签: erlang message-passing


    【解决方案1】:

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

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

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

    如果您确实选择在单个物理机器上运行多个 BEAM 仿真器,我猜想它们之间的消息发送方式与不同物理机器之间的发送方式相同。不过,既然 BEAM 具有良好的 SMP 支持,那么可能没有充分的理由这样做。

    “节点内”和“节点间”消息传递在性能上有什么区别?

    对您的实际硬件进行简单的基准测试比其他人的轶事证据对您更有用。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果使用 TCP/IP 作为传输,消息肯定会被“复制”,但如果使用其他机制,它们也可以被复制使用,所以我认为这解决了问题。
      • 同一个 Erlang 节点上 Erlang 进程之间的消息中的所有数据都被复制到内存中。此外,refc 二进制文件在同一 Erlang 节点上的 Erlang 进程之间共享。所以它比 TCP/IP 快得多。
      • 嗯...您是说原始问题中的 Erlang 进程和 Erlang 节点吗?
      猜你喜欢
      • 2016-04-30
      • 2011-03-25
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2020-03-25
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多