代码之家  ›  专栏  ›  技术社区  ›  mjs

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

  •  10
  • mjs  · 技术社区  · 14 年前

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

    2 回复  |  直到 14 年前
        1
  •  14
  •   Warren Young    12 年前

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

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

    如果您选择在一台物理机器上运行多个波束模拟器,我猜消息在它们之间的发送方式与在不同物理机器之间的发送方式相同。不过,既然BEAM有很好的SMP支持,可能就没有什么好的理由这么做了。

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

    在你的实际硬件上建立一个简单的基准对你来说比其他人的轶事证据更有用。

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

        2
  •  6
  •   hdima    14 年前

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

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