2012-09-13 3 views
0

rpc:pmap으로 계산을 병렬화하려고합니다. 그러나 나는 그 성능에 대해 약간 혼란 스럽다. 모든Erlang rpc : 여러 노드에서의 pmap 대 단일 노드

-module(my_module). 
-compile(export_all). 

    do_apply(X, F) -> F(X). 

첫째 - 단일 노드에 테스트 : 여기

은 간단한 예입니다 내가 두 번째 노드를 연결 한 (초 내 OS에서 쉘 프로세스를 얼랑) 후

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|...]} 

:

([email protected])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|...]} 

마지막으로 내가 연결 한 제 3 노드 :

([email protected])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|...]} 

그래서 노드 수가 3 개이고 인 경우 의 성능이 저하됩니다.

노드 간 통신에 약간의 오버 헤드가 있음을 알고 있습니다. 그러나 여러 노드에서 어떤 경우에 계산을 수행하는 것이 더 나은지 어떻게 알 수 있습니까?

편집 : 단일 노드에

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|...]} 

입구 환경을 네트워크 :

를 두 개의 노드로

([email protected])6> net_kernel:connect('[email protected]'). 
true 
([email protected])7> 
([email protected])7> nodes(). 
['[email protected]'] 

시험 성능 : 4,

초 노드를 추가합니다 세 개의 노드로

([email protected])9> net_kernel:connect('[email protected]'). 
true 
([email protected])10> nodes(). 
['[email protected]', 
'[email protected]'] 

시험 성능 :

([email protected])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|...]} 

하는 제 3 노드를 연결

([email protected])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|...]} 

P. 동일한 실제 컴퓨터에서 각 노드를 새로운 erlang-shell 프로세스로 생성하기 때문에 성능이 감소한 것 같습니다. 그러나 나는 내가 옳은지 정확하게 모른다.

+0

타이머를 호출하기 전에 목록을 생성 할 수 있습니까? tc? 예 : Seq = 목록 : seq (1,10000), 타이머 : tc (..., Seq). – Isac

+0

@Isac 예, 나는 그것을 시도했지만 비슷한 결과를 얻었습니다. 셸에서 단계별 테스트에 대한 설명과 함께 내 질문을 편집했습니다. – stemm

답변

3

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 명은 아무 작업도 실행하지 않기 때문에 성능이 저하됩니다.

여러 노드가 서로 다른 물리적 리소스에서 실행되는 경우에만 성능 향상에 도움이됩니다.