節點之間,消息(必須)通過TCP/IP傳遞。但是,通過在同一節點上運行的進程之間傳遞什麼機制?在這種情況下是否也使用TCP/IP? Unix域套接字? 「在節點內」和「節點之間」消息傳遞之間的性能有什麼不同?Erlang如何在同一個節點上的進程之間傳遞消息?
10
A
回答
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
相關問題
- 1. 在erlang進程之間傳遞消息?
- 2. 同時在MPI中的所有節點之間傳遞消息
- 3. 兩個Python程序之間的進程間消息傳遞
- 4. 使用消息隊列在進程之間傳遞消息
- 5. 如何在進程之間傳遞字符串錯誤消息?
- 6. 在兩個進程之間傳遞消息
- 7. 壓縮Erlang節點之間發送的消息
- 8. 進程間傳遞的消息
- 9. 兩個類之間的消息傳遞
- 10. JMS跨應用程序部署在同一個tomcat之間的消息傳遞
- 11. 如何在後臺和內容之間同步消息傳遞?
- 12. Erlang節點到節點消息傳遞吞吐量,超時和保證
- 13. erlang進程和消息傳遞體系結構
- 14. Erlang進程發送消息
- 15. 從一個節點發送Erlang消息到另一個節點返回badarg
- 16. PHP在頁面之間傳遞消息
- 17. 在Backbone.js之間傳遞消息Views
- 18. 在EventMachine連接之間傳遞消息
- 19. 代表使用Erlang的消息傳遞
- 20. socket.io - 在節點之間傳遞事件
- 21. msgpack:C++和java之間的消息傳遞
- 22. mqtt.js節點 - 傳遞qos消息
- 23. 如何在節點中的CPU內核之間發送消息?
- 24. 兩個程序之間的消息傳遞
- 25. 消息在多個進程之間傳遞,每個進程中有多個線程c
- 26. Erlang gen_server如何在另一個節點上啓動一個gen_server?
- 27. 如何監視兩個Erlang節點之間的通信
- 28. Lisp Flavored Erlang - 消息傳遞原語
- 29. 將消息從C傳遞給erlang
- 30. 消息傳遞變量和「直接」erlang
如果使用TCP/IP作爲傳輸,那麼消息肯定會被「複製」,但如果使用其他機制,也可以複製它們,所以我認爲這可以解決問題。 – mjs 2010-08-02 22:04:20
在同一個Erlang節點上的Erlang進程之間的所有數據都被複制到內存中。而且,在同一個Erlang節點上的Erlang進程之間共享refc二進制文件。所以它比TCP/IP要快得多。 – hdima 2010-08-02 22:30:02
嗯......你是說原始問題中的Erlang進程和Erlang節點? – hdima 2010-08-02 22:34:20