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 프로세스로 생성하기 때문에 성능이 감소한 것 같습니다. 그러나 나는 내가 옳은지 정확하게 모른다.
타이머를 호출하기 전에 목록을 생성 할 수 있습니까? tc? 예 : Seq = 목록 : seq (1,10000), 타이머 : tc (..., Seq). – Isac
@Isac 예, 나는 그것을 시도했지만 비슷한 결과를 얻었습니다. 셸에서 단계별 테스트에 대한 설명과 함께 내 질문을 편집했습니다. – stemm