
성능 테스트를 위해 간편하게 사용할 수 있는 ApacheBench를 사용하였습니다.
개인적인 생각으로 성능 측정 도구는 아무거나 사용해도 무방하며 out을 해석하는 능력이 더욱 중요합니다.

다음과 같이 측정을 해보았습니다.



결과를 보니 쓰레드 풀을 사용할 때, 워커 쓰레드 수 4, 생산자 소비자 패턴을 위한 버퍼 16 인 경우가 가장 결과가 좋게 나왔습니다.

이로써 일꾼(쓰레드)가 많다고 일을 잘하는 것은 아니다! 라는 결론을 내릴 수 있겠네요!


다음과 같이 일꾼과 코어가 있을 때 각 코어는 하나의 쓰레드만 담당하면 될 것입니다! 실행하는 것 외에는 신경쓸게 없죠!

하지만 코어는 2개지만 일꾼은 4명이라면 어떻게 될까요?? 열심히 일을 하다가 본인의 시간이 끝나면 다른 일꾼에게 자리를 비켜주어야 할 것입니다.
이것을 컨텍스트 스위칭이라고 하는데요. 이는 순수 오버헤드이기 때문에 많이 발생할 경우 프로그램 성능에 악영향을 미칠 수 있습니다.


오케이, 그럼 쓰레드가 많다고 효율을 무작정 내는 매커니즘이 아니라는 것을 알았습니다. 그렇다면 몇 개의 쓰레드를 할당하여야 할까요?

컨텍스트 스위칭 비용을 가장 적게 만들 수 있는 쓰레드 수를 설정하면 되겠지요.
따라서 CPU bound의 경우 코어 수 = 쓰레드 수 (+1)이 적당합니다.
-> (+1) 해주는 이유는 혹시 모를 I/O가 일어났을 때 CPU를 쉬게 하지 않기 위해서입니다!
반면에 I/O bound의 경우 계속 I/O가 일어날겁니다. 따라서 이론적인 접근보다 여러 경우를 넣어보며 적정치를 찾는 것이 제일 현명하고 옳은 방법입니다.

그런데 제 노트북은 12코어 16쓰레드 노트북인데 4 쓰레드 / 버퍼 크기 16인 경우가 가장 성능이 좋습니다. 왜 그럴까요? 앞서 말한대로 16개의 쓰레드를 사용할 때 가장 적정한 것 아닌가요?
지금까지 말씀드린 것은 어디까지나 이론적이며 직접 쓰레드 개수를 변경해가며 알맞은 쓰레드 수를 조정해가야 합니다! (처음 기준 잡기는 좋겠죠?)

나름대로 원인을 추측해봤는데요.
제 코드는 현재 lock을 사용하는 코드가 존재합니다. 따라서 많은 쓰레드들이 락에 대해 경쟁을 하고 재우고 깨우는 과정들이 병렬로 일처리하는 것보다 더 많은 오버헤드를 가질 경우 성능을 감소할 수 있을것이라 추측할 수 있습니다.

두 번째는 현재 테스트는 로컬에서 진행되었습니다. 따라서 제 노트북의 자원을 여러 서버가 나누어서 사용하므로 이론과 달랐을 것이라 추측하고 있습니다.
추가적으로 실제 성능 테스트에서는 절대 로컬에서 하시면 안되고 서버마다 모두 다른 환경에서 하셔야 합니다!!!