[英]Erlang rpc:pmap on multiple nodes vs. single node
我正在嘗試將計算與rpc:pmap
並行化。 但是我對其性能感到困惑。
這是簡單的示例:
-module(my_module).
-compile(export_all).
do_apply( X, F ) -> F( X ).
首先-在單節點上測試:
1> timer:tc( rpc, pmap, [{my_module, do_apply}, [fun(X) -> timer:sleep(10), X end], lists:seq(1,10000)] ).
{208198,
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27|...]}
之后,我連接了第二個節點(操作系統中的第二個erlang shell進程):
(foo@Stemm.local)24> timer:tc( rpc, pmap, [{my_module, do_apply}, [fun(X) -> timer:sleep(10), X end], lists:seq(1,10000)] ).
{446284,
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27|...]}
最后,我連接了第三個節點:
(foo@Stemm.local)26> timer:tc( rpc, pmap, [{my_module, do_apply}, [fun(X) -> timer:sleep(10), X end], lists:seq(1,10000)] ).
{483399,
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27|...]}
所以- 與單節點相比,三個節點的性能較差 。
我意識到節點之間的通信會有一些開銷。 但是我如何理解在哪種情況下最好在多個節點上執行計算呢?
編輯:
我從shell進行的逐步測試:
1> c(my_module).
{ok,my_module}
2>
2> List = lists:seq(1,10000).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27,28,29|...]
在單節點上測試性能:
3> timer:tc( rpc, pmap, [{my_module, do_apply}, [fun(X)-> timer:sleep(10), X end], List] ).
{207346,
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27|...]}
進入網絡環境:
4> net_kernel:start([one]).
{ok,<0.20066.0>}
(one@Stemm.local)5> erlang:set_cookie(node(), foobar).
true
添加第二個節點:
(one@Stemm.local)6> net_kernel:connect('two@Stemm.local').
true
(one@Stemm.local)7>
(one@Stemm.local)7> nodes().
['two@Stemm.local']
用兩個節點測試性能:
(one@Stemm.local)8> timer:tc( rpc, pmap, [{my_module, do_apply}, [fun(X)-> timer:sleep(10), X end], List] ).
{510733,
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27|...]}
連接第三個節點:
(one@Stemm.local)9> net_kernel:connect('three@Stemm.local').
true
(one@Stemm.local)10> nodes().
['two@Stemm.local',
'three@Stemm.local']
使用三個節點測試性能:
(one@Stemm.local)11> timer:tc( rpc, pmap, [{my_module, do_apply}, [fun(X)-> timer:sleep(10), X end], List] ).
{496278,
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27|...]}
PS我猜想性能會下降,因為我是在同一台物理機上將每個節點創建為新的erlang-shell進程。 但是我不知道我是否正確。
您無需添加節點即可在Erlang中獲得並行性。 每個節點可以在本地支持大量進程。 pmap
已經在並行運行您的函數。 如果您將等待時間延長,這更容易看出:
timer:tc( rpc, pmap, [{my_module, do_apply}, [fun(X) -> timer:sleep(1000), X end], lists:seq(1,10000)] ).
{1158174,
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27|...]}
如果睡眠在一個節點上按順序運行,那么您期望的最小等待時間為1000 * 10000 = 10,000,000
,而我們只需要等待1,158,174
您將創建3個單獨的Erlang VM,並將它們彼此連接。 然后,您正在其中一個VM上運行並行映射。 額外的VM只會損害當前性能,因為它們都試圖使用相同的物理資源,並且其中2個甚至沒有運行任何工作。
如果多個節點在不同的物理資源上運行,則它們只會幫助提高性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.