繁体   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