병렬성, 병목현상, 그리고 Concurrency Visualizer Tool

멀티스레드에서의 병렬성, 병목현상, 그리고 분석도구인 Concurrency Visualizer 에 대해 알아보자.



병렬성(Parallelism)과 병목현상(Bottleneck)

프로그래밍에서 병렬성이란, 멀티 스레드 환경에서 여러 CPU가 각 스레드가 연산을 해서 동시 처리량을 올리는 것을 의미한다. 물론 제대로된 연사을 위해서는 lock 을 사용하여 적절한 동기화 작업을 해줘야 한다.

하지만, 어떤 상황에서는 이런 병렬성의 효율이 떨어지는다. 병렬로 실행되게 프로그램을 만들었지만, 여러 스레드의 동기화 문제로 병렬 처리를 제대로 못하는 현상을 병목현상이라고 한다. 이런 현상을 가리켜 암달의 법칙(Amdlahl’s Law) 혹은 암달의 저주라고 한다.

간단히 정리해보면, 벙렬 처리를 위해 무작정 스레드를 늘리다 보면 오히려 병렬성이 떨어진다는 것이다.

흔히 프로그래밍에서 최적의 스레드 수는 ‘CPU 코어 수 x 2 + 1~2’ 라고 한다. 하지만, 이러한 계산 방식이 확실한 기준이 되지는 못한다. 동기화가 전혀 없는 방식에서라면 어쩌면 맞을 수도 있지만, 그것 또한 확실하진 않다. 멀티 스레드를 사용하는 상황이라면 대부분 동기화를 신경써야 할 것이고, 이 동기화 때문에 실제로 테스트를 해보면서 해당 프로그램에서의 최적의 수를 찾아야만 한다. 특히나 게임서버와 같이 동기화가 많이 필요한 부분에서는 위에서 언급한 최적의 스레드 수를 단순 계산식으로 설정한다는 것은 잘못된 방법이라고 생각한다. 그러므로, 위의 계산식을 기준으로 플러스, 마이너스 하며 최적의 수를 찾아야 한다.



Concurrency Visualizer Tool for Visual Studio

사실 이 도구를 언급하고 싶어서 병렬과 병목현상에 대해서 알아본 것이나 마찬가지다. 이 도구는 멀티스레드 환경에서 스레드 들이 정말 연산을 동시에 잘 수행하는지를 분석해 정보를 시각화하여 보여준다. 이 도구를 사용하면, 특정 프로세스에서 생성한 스레드가 행동한 일에 대한 내용을 비율로 보여고, 어떤 부분에서 동기화를 위해 멈춰있었는지, 그리고 대기하고 있었는지 위치를 보여주는 등 다양한 정보를 확인할 수 있다.


사용 방법

비주얼 스튜디오에서 아래와 같이 concurrency visualizer 를 설치하자.

설치가 완료되면, 분석하려는 프로그램을 실행하고 아래와 같이 프로세스를 연결하자.

프로세스 연결을 누르면 아래와 같이 ‘수집 추적’ 을 하는데, 몇 초 뒤에 ‘수집 취소’를 누르자. 주의 할 점은 계속 수집하면 PC 의 모든 용량을 차지할 때 까지 수집을 하므로 몇 초만 수집하면 된다. ‘수집 취소’를 누르면, 수집 보고서를 분석하는데, 이 것은 다 분석할 때 까지 기다리고 있으면 된다.

분석이 완료되면 아래와 같이 나올 것이다. 주목할 부분은 스레드 탭이다.

영역에 대해 간단히 설명하자면, 1번의 경우는 해당 프로세스에서 실행 된 스레드 정보다. 2번은 스레드들이 어떤 일을 했는지에 대해 수치로 표시된 것이고, 3번은 표로 보여준 것이다. 2번 영역에서 ‘실행’ 이라는 항목은 일한 시간의 28% 가 Runnable 상태였다는 것이고, ‘동기화’ 항목은 동기화를 위해 일한 시간의 51% 를 사용했다는 뜻이다. ‘대기’ 항목은 말 그대로 대기를 위해서 얼마나 시간을 소비했는지에 대한 수치이다.

동기화를 위해 시간을 더 많이 사용하게 된 것을 확인할 수 있다. 미처 캡처를 하지 못했지만, 스레드가 2개일 때는 ‘실행’ 항목이 90% 이상 나온걸 보면, 스레드가 많다고 절대로 병렬성이 향상되지 않는 다는 것을 눈으로 확인할 수 있었다.

만약, 어디서 동기화를 위해 시간을 소비했는지 확인하고 싶다면, 아래와 같이 하면 된다. 2번 항목의 영역은 프로세스의 정보를 수집하는 동안 CPU 가 한 행동을 나타낸 것으로, 주황색으로 표시된 동기화 부분을 선택해보자. 그러면, 아래의 3번 항목에 표시된 ‘현재’ 탭에 관련된 정보가 표시될 것이다. 5번 항목의 함수에서 동기화를 위해 시간을 소비했고, 4번 항목의 글 처럼 스레드 ID 40380에 의해서 동기화가 해제됬다는 것을 확인할 수 있다. 그리고 5번 항목을 더블 클릭하면 실제 코드의 위치로 이동도 해준다. 만약, 스레드 ID 40380 이 어떤 영역인지 확인하고 싶다면, 3번 항목 옆의 ‘스택 차단 해제 중’ 탭을 클릭해보자.

2번 항목을 보면 스레드 ID 32404 가 해제되었다는 글을 확인할 수 있고, 아래의 함수로 인해서 해제되었다는 정보가 나온다. 마찬가지로, 3번 항목을 더블 클릭하면 코드가 있는 부분으로 이동된다.

지금까지 병렬성과 병목현상을 눈으로 확인할 수 있는 도구에 대해 알아보았다. 내 경우에는 혼자 방구석에서 개발하는 코어단이 있기 때문에 사용할 일이 있겠지만, 라이브 컨텐츠를 개발하면서 이런 기능을 사용할 일은 거의 없을 것이다. 하지만, 이런 정보를 확인 할 수 있는 것과 뇌내망상 하는 것은 비교할 수 없기 때문에 알아두면 좋은 정보인 것 같다.




Reply