簡體   English   中英

多個節點上的Erlang rpc:pmap與單個節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM