2010-08-02 64 views
10

節點之間,消息(必須)通過TCP/IP傳遞。但是,通過在同一節點上運行的進程之間傳遞什麼機制?在這種情況下是否也使用TCP/IP? Unix域套接字? 「在節點內」和「節點之間」消息傳遞之間的性能有什麼不同?Erlang如何在同一個節點上的進程之間傳遞消息?

回答

14

通過什麼樣的機制在他們進程上運行之間傳遞同一個節點?

由於在同一節點上Erlang進程都在單個機進程—光束模擬器—消息結構被簡單地複製到接收器的消息隊列中運行。對於所有標準的無副作用函數編程原因,消息結構被複制,而不是簡單地引用。

請參閱erts_send_message()erts/emulator/beam/erl_message.c在Erlang來源中的更多詳細信息。在R15B01中,與您的問題最相關的位開始於980行左右,撥打電話erts_queue_message()

如果您確實選擇在單個物理機器上運行多個BEAM仿真器,那麼我會猜測它們之間的消息會以與在不同物理機器之間相同的方式發送。雖然BEAM具有良好的SMP支持,但現在可能沒有理由這麼做。

「內節點」和「節點間」消息傳遞之間的性能有什麼區別?

對於你來說,一個關於你的實際硬件的簡單基準比其他人的軼事證據更有用。

但是,如果您希望獲得一般性,請注意最近的存儲器帶寬爲around 20 GByte/sec,並且您不太可能在節點之間的網絡鏈路速度快於10 Gbit/sec。這意味着雖然您的實際應用程序與您執行或找到的任何簡單基準測試之間可能存在很多差異,但這些差異可能無法彌補傳輸速率的差異。

如果您「僅」在節點之間具有1 Gbit/sec的端到端網絡鏈接,則節點內傳輸可能比節點間傳輸快兩個數量級。

6

「在Erlang進程之間的消息複製所有數據,與REFC二進制文件相同的Erlang節點上的例外。」:

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

+0

如果使用TCP/IP作爲傳輸,那麼消息肯定會被「複製」,但如果使用其他機制,也可以複製它們,所以我認爲這可以解決問題。 – mjs 2010-08-02 22:04:20

+0

在同一個Erlang節點上的Erlang進程之間的所有數據都被複制到內存中。而且,在同一個Erlang節點上的Erlang進程之間共享refc二進制文件。所以它比TCP/IP要快得多。 – hdima 2010-08-02 22:30:02

+0

嗯......你是說原始問題中的Erlang進程和Erlang節點? – hdima 2010-08-02 22:34:20