서버 프로그래밍

쓰레드 풀에서 CPU 사용량 줄이기

하늘흐늘 2021. 12. 2. 20:32
반응형

쓰레드풀에서 흔하게 사용되는 방법이 워커 쓰레드를 N개 생성하여 놓고 공유하는 작업 큐에서 데이터를 받아와 워커 쓰레드에서 실행하는 방법입니다. 이 때 작업 큐가 비었을 때 워커 쓰레드를 재워주는 처리를 해주지 않으면 CPU 사용량이 올라가게 됩니다. sleep을 해주는 것도 재운 시간에 작업 큐에 데이터가 들어왔다면 그 만큼 워커 쓰레드에서 늦게 실행하게 되어 재우는 시간도 민감하게 설정하여야 합니다. 
이 때 사용할 수 있는 방법이 작업 큐에 조건 락(conditional lock)을 사용하는 것입니다. 이 방법을 바탕으로 작업 큐가 비어 있을 때만 워커 쓰레드를 재우고 작업 큐에 데이터가 들어왔을 때는 깨울 수 있습니다. 이 방법은 워커 쓰레드의 사용성은 높이면서 CPU 사용량을 줄이는 방법입니다. 조건 락은 C++ 11이상이라면 OS API 뿐만 아니라 C++ 표준 라이브러리를 사용할 수 있습니다. 
쓰레드 풀에서 사용할 만한 작업 큐 예제로  [c++ 예제] 멀티스레드에 안전한 notify_queue 클래스라는 글의 소스에 있는 NotifyQueue 클래스가 좋은거 같습니다. 이 분의 글은 큐와 함께 생산자와 소비자 패턴을 설명하고 있습니다. 이 예제 소스는 읽기-쓰기 락(read-write lock)이 가능한 shared_mutex까지 사용하여 성능에도 민감하게 작성된거 같습니다. 
참고로 이 분 예제 보시려면 C++ 이상에서 추가된 락 관련 클래스 많이 이해하거나 찾아보아야 합니다. 멀티 쓰레드에 익숙하지 않다면 락 관련 클래스가 사용되는 일반적인 상황도 이론적으로 같이 공부하시는 것이 좋을거 같습니다.

반응형