[트래픽 핸들링] Thread pool 과 Queue (Feat.Tomcat WAS)
[트래픽 핸들링] Thread pool 과 Queue (Feat.Tomcat WAS)
Thread pool
Tomcat WAS는 Thread를 이용해 사용자의 요청을 처리한다.
이 요청들은 Thread per request 모델로 처리된다.
- Thread 하나당 요청 한개를 담당해서 처리한다는 뜻이다.
이 Thread들은 Thread pool에 의해 관리된다.
Thread의 생애주기를 관리한다고 생각하자
유저들로부터 HTTP 요청이 들어올 때 요청들은 Queue에 저장된다.
WAS의 Thread pool이 수용할 수 있는 수(thread pool size)의 요청까지만 Thread들이 각각 요청을 담당해서 동시적으로 작업을 처리하고 나머지 요청은 Queue에서 대기한다.
Thread pool의 특징
Thread pool은 Thread를 생성하는 비용이 크기 때문에 쓰래드들을 미리 생성해두고 관리하며 쓰래드를 재사용함으로써 효율적으로 사용한다.
- 미리 여유있게 쓰래드를 생성해둠으로써 생성시간을 줄인다.
몇개의 쓰래드를 미리 생성할지는 경험적으로 찾아야한다.
- 쓰래드를 무한히 생성하지 않고 제한된 개수의 스레드를 운용 및 재사용함으로써 CPU의 오버플로를 방지한다.
서버 성능에 맞게 Thread의 최대 수치를 제한시킨다.
참고로 tomcat default thread size는 200이다.
만약 Thread pool이 없었다면?
처리 속도보다 더 빠르게 요청이 들어오는 상황에 Tread pool이 없다면 각 요청마다 Thread가 무한히 생성될것이다.
- Thread는 생성 비용이 크다고 했다. 서버 메모리가 점점 고갈될것이다.
- 컨텍스트 스위칭이 많아지고 CPU의 오버헤드 증가로 서버가 마비될수도있다.
*따라서 이런 문제를 방지하기위해 Thread pool을 도입해서 스래드의 무한 생성을 제한하고 제한된 개수의 스래드를 관리 운용해야한다,.
대량의 트래픽이 발생하면?
만약 대량의 트래픽이 들어와 thread pool size를 지속적으로 초과하게 된다면 요청들이 작업이 처리될 때까지 Queue에서 계속해서 기다려야한다.
이런 현상을 Thread pool hell이라고 한다.
Thread pool이 감당할 수 있는 요청수를 넘는 순간부터는 평소보다 수배나 많은 지연시간을 보여준다.
Thread pool이 감당할수없는 트래픽이 몰려 요청이 Queue에 계속 적재되면 서버 메모리낭비가 심각해 질것이다.
따라서 Queue 또한 전체 크기에 제한을 두고 그 이상의 요청을 차단해 서버의 마비를 방지해야할것이다.
정리
대량의 트래픽으로부터 서버를 보호하기 위해서
- Thread pool을 이용해서 Thread의 무한 생성을 제한하고 제한된 개수의 스래드를 재사용하여 요청을 효율적으로 처리해야한다.
- 또한 Queue의 크기 제한이 필수적이다.
Reference
(5) 스레드 풀(thread pool)은 왜 쓰는 걸까요? 어떻게 쓰는게 잘 쓰는 걸까요? 지금 이 영상으로 스레드 풀! 깔끔하게 정리하시죠! - YouTube