쿼드코어에서 병렬 프로세싱 실험

사실 요즘 회사서 리서치 용으로 몇가지 간단한 파일 처리 프로그램을 만들었는데, 이 리서치 기간에 Erlang으로 그 프로그램을 만들었다.
뭐 완전한 프로그램으로는 Erlang으로 처음 만드는 것이라서 시행착오도 많이 했지만 그럭저럭 잘 마무리를 지은거 같다.

다 코딩하고 프로파일링 후 이 Erlang 코드의 어느 특정 부분에서 처리 시간이 굉장히 오래 먹는다는걸 알았다. 바로 텍스트 정규식을 처리해 그것의 중복검사까지 하는 로직인데…

그렇다면 이 부분에 대해서 파일 각각에 대해서 병렬 프로세스를 열고 그 프로세스에 위 작업을 지시하고 결과만 리턴하게 하는 방법을 쓰면 어떨까 하고 생각해 봤다.
따라서 멀티코어 용(?) map 함수인 p(parallel)map으로 간단하게 replace하고 결과 비교를 해봤다.

아래는 동일 환경에서 수행 시간과 cpu 사용률 뽑아 봤다.

일단 싱글 프로세스로 우리가 일반적인 프로그래밍 방식으로 코딩한 erlang으로 돌린 결과이다.
 
걸린 시간 : 287290003 마이크로 세컨드 -> 대략 287초

수행 시간 대부분의 cpu 사용률 : 100%

사용자 삽입 이미지

그리고 아래는 일부 map 함수를 pmap함수로 교체하고 돌린 결과이다.
이렇게 함으로 다중의 각각 다른 파일을 동시에 열어 처리하고 결과만 부모프로세스에 리턴하게 된다.

걸린 시간 : 183248482 마이크로 세컨드 -> 183초

수행 시간 대부분의 cpu 사용률 : 195%

사용자 삽입 이미지

top에서 100%가 넘어서 200%가 되는걸 솔직히 오늘 처음 봤는데, 아마도 쿼드 코어여서 그런거 같다는 예상이 된다.
각 칩셋 core 4개이고 칩이 두개 박힌 머신이니…
한개 칩당 100으로 잡고 사용률을 계산하나 보다.

코드 한번 바꾸는 것만으로 약 60%의 성능 향상이 있었다.
그러면 2개 칩으로 계산하니 143초가 걸려야 하는데 왜 40초가 더 걸렸냐고 반문할 수 있는데, 이건 데이터 전송과 프로세스 생성에 따른 패널티로 보인다.

C, C++ 같은 언어로 쓰레드를 쓰지 않는 싱글 프로세스 방식이라면 100%의 cpu 사용률이 한계일 거라 예상하고 공유 메모리 방식 언어의 쓰레드 관련 프로그래밍이 상당한 버그를 동반 할 수 있는 경우가 많은데  Erlang에서는 고작 코드의 함수 변형 약간만 해주면 쓰레드를 쓰는 것 이상의 성능 향상과 안정성을 확보 할 수 있다는 사실이 굉장히 흥미로웠다.

아래는 Joe Armstrong의 책에서 공개한 pmap함수이다.
일반 map 함수가 f()에 입력된 리스트의 item을 순차적으로 적용해 결과를 리턴받는데, 아래 함수에서는 그 함수를 process로 띄워 버리고 결과를 리턴 받는다.

[CODE php]
pmap(F, L) ->
    S = self(),
    Ref = erlang:make_ref(),
    foreach(fun(I) ->
            spawn(fun() -> do_f1(S, Ref, F, I) end)
        end, L),
    %% gather the results
    gather(length(L), Ref, []).

do_f1(Parent, Ref, F, I) ->
    Parent ! {Ref, (catch F(I))}.

gather(0, _, L) -> L;
gather(N, Ref, L) ->
    receive
    {Ref, Ret} -> gather(N-1, Ref, [Ret|L])
    end.
[/CODE]

Joe 아저씨의 책과 부록에 실무에 바로 쓰일 수 있으며, 줄곳 참고하면서 이렇게도 코딩을 할 수 있겠구나 하고 놀랄만한 코드들이 꽤 많이 등장하는데 부록으로 제공하는 소스코드도 정말 값진것이 아닐 수 없다.

ps. 여러 관련 자료를 찾아보니 언어 자체의 퍼포먼스는 Python, Ruby, PHP와 비슷한 결과를 보인다. 실험에서 아마도 위와 같은 언어적 특징은 적용하지 않은듯 보인다.

CC BY-NC 4.0 쿼드코어에서 병렬 프로세싱 실험 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.