2010-01-03 6 views
3

필자가 작성한 테스트에서 목표는 파서를 만드는 것이다. 그래서 저는 파일에서 모든 메시지를 읽는 개념 증명을 만들었습니다. 그리고 모든 것을 메모리로 밀어 넣은 후에 각 메시지를 구문 분석하기 위해 하나의 프로세스를 생성합니다. 그 때까지는 모든 것이 잘되고 몇 가지 좋은 결과가 있습니다. 그러나 나는 erlang VM이 내 테스트를 수행 할 때 내 프로세서의 약 25 %를 사용하고있는 사실, 모든 쿼드 코어를 사용하는 모든 프로세서 전원을 사용하지 않고 있음을 알 수있었습니다. 나는 4 개의 쓰레드를 사용하는 C++을 사용하여 카운터 테스트를 만들었고 명백하게 100 %를 사용하여보다 나은 결과를 얻었습니다. (나는 같은 큐 모델 erlang이 사용하는 것을 존중했습니다).얼랑 (Erlang) 프로세스의 성능 최적화

그래서 내 얼랑 테스트를 "느리게"할 수 있는지 궁금합니다. 메시지 당 하나의 프로세스가 생성되므로 직렬화 문제가 아니라는 것을 알고 있습니다. 내가 생각한 한가지는 아마도 내 메시지가 너무 작아서 (각 약 10k) 프로세스의 많은 부분을 만드는 것이 훌륭한 성능을 달성하는 데 도움이되지 않는다는 것입니다. 시험에 대한

몇 가지 사실 :

106K 메시지 (25 % 프로세서 전원 사용) 얼랑에 - 204 밀리 내 C에 ++ 테스트 (사용 100 % 프로세서 전원) - 80 밀리

차이가 그렇게 크지는 않지만, 더 많은 전력을 사용할 수 있다면 확실하게 개선의 여지가 더 많습니다. 맞습니까?

아, 필자는 몇 가지 기능을 수행 했으므로 최적화를위한 또 다른 방법을 찾을 수 없었습니다. 대부분 함수 호출이 없으며 대부분이 개체 변환을위한 문자열입니다.

업데이트 :

Woooow! 하산시 에드 (Hassan Syed) 아이디어에 따르면, 저는 C++에서 80에 비해 35 밀리 초를 달성했습니다! 이것은 대단하다!

+0

즉각적인 생각은 당신이 메시지를 구문 분석에 비해 파일을 검색에 들어가는 시간이 얼마나 알고 있는지 여부이다. 스캐닝은 본질적으로 순차적이므로 산란 프로세스의 병렬 효과가 손실 될 수 있습니다. 이것은 코어가 사용되지 않는 이유를 설명 할 수 있습니다. – rvirding

답변

4

erlang VM이 코어를 하나만 사용하고있는 것으로 보입니다.

이처럼 시작해보십시오 :

erl -smp enable +S 4 

을 플래그를 사용 -smp하면 (각 코어에 대해 1) 4 얼랑 스케줄러를 시작 + S 4를 을 활성화 SMP를 지원하는 런타임 시스템을 시작

얼랑을 알려줍니다

당신이 SMP를 사용할 수있는 경우는 쉘 시작할 때 당신은 볼 수 있습니다

Erlang R13B01 (erts-5.7.2) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false] 

Eshell V5.7.2 (abort with ^G) 
1> 

[SMP : 2 : 2] 2 schedu을 활성화 SMP 실행되는 이야기를 LER들 2 schesulers 온라인

+0

(+1)이 문제 일 가능성이 큽니다. P. 그러나 현대적인 빔은 SMP를 지원하지 않고 시작됩니다. –

+0

예 최신 버전은 자동으로 SMP를 시작하지만 25 % CPU 사용량은 1 코어 만 사용하는 것 같습니다. 따라서 scooterman은 이전 버전을 사용하고 있거나 SMP없이 컴파일 될 수 있습니다. – filippo

+0

hmmm 윈도우에서 분명히 SMP가 비활성화되어 흥미롭지 만 오래된 버전 (R13B1)을 사용하고 있습니다. 현재 프로세서 사용량은 더 많지만 파싱 속도는 전혀 변하지 않았습니다. 고마워. – scooterman

2

원본 파일이 있고 "표현식"당 하나의 프로세스를 생성하는 경우 실제로 병렬화 할 때를 이해할 수 없습니다. 하나의 프로세스로 전체 파일을 처리하는 것보다 표현을 처리하고 처리하는 데 더 많은 비용이 소요됩니다. 적합한 전략은 표현마다 하나의 프로세스가 아닌 파일 당 하나의 프로세스를 갖는 것입니다.

또 다른 대체 전략은 파일을 2, 3 또는 x 청크로 분할하여 해당 청크를 처리하는 것입니다. 물론 이것은 소스가 선형 적으로 의존하지 않고 청크의 처리 시간이 프로세스를 생성하고 생성하는 데 걸리는 시간을 초과해야한다고 가정합니다 (프로세스 X의 시간 낭비가 시스템의 나머지 부분에서 제거되므로 시간이 많이 걸립니다) .

- 얼랑하고 결과 대 토론 C++ -

얼랑는 OS 커널의 기본 요소를 많이 에뮬레이트하는 사용자 공간 커널을 가지고있다. 특히 스케줄러와 블로킹 프리미티브. 즉, 과 동일한 전략을 C++와 같은 절차 적 원시 언어와 비교할 때 약간의 오버 헤드가 있음을 의미합니다. 해당 특성에 따라 구현 공간 (CPU/메모리/OS/프로그래밍 언어)의 모든 항목에 작업 분할을 조정해야합니다.

+0

@Hassan 네, 당신이 말한 것을 이해했습니다. 나는 아직도 필요한만큼 많은 프로세스를 생성하는 것이 갈 길이라고 생각한다. 내가 할 수있는 일은 당신이 말한 것처럼 일괄 파싱을하는 것인데, 그래서 프로세스 생성/파기 비용은 파싱에 걸리는 시간까지 정규화 될 수있다. 나는 나중에 오늘 시험 할 것이고 결과를 업데이트 할 것이다. 그리고 C++의 차이점에 대해서도 그렇습니다. 나는 방금 내가 예상해야 할 속도에 대해 낮은 마진을 갖기 위해 카운터 테스트를 만들었으며, 나는 erlang의 힘이 파싱 자체가 아니기 때문에 동일한 결과를 얻으 려하지 않는다. – scooterman

2

당신은 CPU 코어에 스케줄러를 결합해야합니다

erlang:system_flag(scheduler_bind_type, processor_spread).