쓰레드를 미리 생성해 두어, 요청이 들어올 때 마다 쓰레드 풀에 있는 쓰레드를 요청한 프로세스에게 할당해 주는 곳. 사용할 쓰레드 갯수를 미리 제한해 두어 사용할 리소스의 상한을 설정해 둔다.
자바에서는 기본적으로 One to One Threading Model로 쓰레드를 생성한다고 한다.
📝 One to One Threading Model이란?출처 : https://afteracademy.com/blog/what-is-the-concept-of-multithreading-in-os-and-what-are-its-benefits/
User Thread와 Kernel Thread를 1대1로 연결하는 방식.
해당 방식을 채택하게 되면 작업 요청이 들어올 때 마다 쓰레드를 만들게 되고,
무분별하게 쓰레드를 만들게 되면
등이 문제가 될 수 있다.
따라서 이 문제를 해결하기 위해, 미리 만들어 둔 쓰레드를 쓰레드 풀에서 꺼내 쓴다.
출처 : https://limkydev.tistory.com/55
작동원리에 앞서, 용어설명 두가지를 정리해 둔다.
CorePoolSize : 쓰레드 풀이 유지해야 하는 최소한의 쓰레드 개수
MaxPoolSize : 쓰레드 풀에 존재할 수 있는 최대 쓰레드의 갯수. 쓰레드 풀에 Core Size보다 많은 쓰레드가 있더라도, queue에 task가 꽉 차 있으면 쓰레드 갯수가 MaxPoolSize까지 늘어날 수 있다.
나뉠수 있는 케이스는 3가지다.
만약 CorePoolSize와 MaxPoolSize를 같게 설정한다면 고정된 사이즈의 스레드 풀을 만드는 것이다.
1) 요청수에 비해 너무 많게 설정 -> 놀고 있는 스레드가 많아져 메모리,cpu 자원 비효율 증대
2) 너무 적게 설정 -> 동시 처리 요청수가 줄어든다. 평균응답시간, TPS 감소
→ NGrinder로 최적화 할 수 있다.