節點之間,消息(必須)通過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. 兩個Python程序之間的進程間消息傳遞
- 3. 使用消息隊列在進程之間傳遞消息
- 4. 如何在進程之間傳遞字符串錯誤消息?
- 5. 在兩個進程之間傳遞消息
- 6. 壓縮Erlang節點之間發送的消息
- 7. JMS跨應用程序部署在同一個tomcat之間的消息傳遞
- 8. 進程間消息傳遞 - MSMQ,Service Broker,?
- 9. 在Backbone.js之間傳遞消息Views
- 10. PHP在頁面之間傳遞消息
- 11. socket.io - 在節點之間傳遞事件
- 12. 兩個程序之間的消息傳遞
- 13. 如何在節點中的CPU內核之間發送消息?
- 14. 消息在多個進程之間傳遞,每個進程中有多個線程c
- 15. Lisp Flavored Erlang - 消息傳遞原語
- 16. Erlang新手 - 併發和消息傳遞
- 17. 將消息從C傳遞給erlang
- 18. 如何在子進程和父進程之間傳遞整數
- 19. 如何在web.py中的不同請求之間傳輸消息?
- 20. 如何在Grails控制器之間傳遞錯誤消息?
- 21. 如何在用戶之間實現消息傳遞系統?
- 22. 如何在各種消息事件之間傳遞參數
- 23. 如何在傳遞給HttpWebRequest之前將不同的值傳遞給xml節點
- 24. 在兩個獨立的UIViews之間傳遞消息
- 25. 如何在兩個進程之間傳遞值(.net c#exe)
- 26. 線程間消息傳遞的實現
- 27. Erlang進程的消息接收率
- 28. Java類之間的消息傳遞如何最好地完成?
- 29. 使用多重處理模塊在進程之間傳遞消息
- 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