Thread Pool

구범모·2023년 9월 13일
0

쓰레드풀이란?

쓰레드를 미리 생성해 두어, 요청이 들어올 때 마다 쓰레드 풀에 있는 쓰레드를 요청한 프로세스에게 할당해 주는 곳. 사용할 쓰레드 갯수를 미리 제한해 두어 사용할 리소스의 상한을 설정해 둔다.

쓰레드풀을 왜 쓰지?

자바에서는 기본적으로 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로 연결하는 방식.

해당 방식을 채택하게 되면 작업 요청이 들어올 때 마다 쓰레드를 만들게 되고,

무분별하게 쓰레드를 만들게 되면

  • 쓰레드간의 context switching이 자주 일어나게 되어 CPU 오버헤드 발생
  • 각 쓰레드의 작동시간이 줄어듦.
  • 쓰레드의 생성으로 인한 메모리 부족(Out Of Memory)

등이 문제가 될 수 있다.

따라서 이 문제를 해결하기 위해, 미리 만들어 둔 쓰레드를 쓰레드 풀에서 꺼내 쓴다.

쓰레드풀의 작동 원리


출처 : https://limkydev.tistory.com/55

작동원리에 앞서, 용어설명 두가지를 정리해 둔다.

CorePoolSize : 쓰레드 풀이 유지해야 하는 최소한의 쓰레드 개수

MaxPoolSize : 쓰레드 풀에 존재할 수 있는 최대 쓰레드의 갯수. 쓰레드 풀에 Core Size보다 많은 쓰레드가 있더라도, queue에 task가 꽉 차 있으면 쓰레드 갯수가 MaxPoolSize까지 늘어날 수 있다.

나뉠수 있는 케이스는 3가지다.

  1. CorePoolSize보다 적은 쓰레드가 활동중인데, 새로운 요청이 들어오면 쓰레드를 만든다.
  2. CorePoolSize보다 많은 쓰레드가 활동중인데, 그 수가 MaxPoolSize보다 적다면 queue가 꽉 찼을 때만 새로 쓰레드를 만든다.
  3. MaxPoolSize까지 활동쓰레드를 늘림에도 불구하고 queue가 꽉 찬다면, task는 거부된다.

만약 CorePoolSize와 MaxPoolSize를 같게 설정한다면 고정된 사이즈의 스레드 풀을 만드는 것이다.

Thread Pool 사용시 주의할 점

1) 요청수에 비해 너무 많게 설정 -> 놀고 있는 스레드가 많아져 메모리,cpu 자원 비효율 증대

2) 너무 적게 설정 -> 동시 처리 요청수가 줄어든다. 평균응답시간, TPS 감소

→ NGrinder로 최적화 할 수 있다.

ref

profile
우상향 하는 개발자

0개의 댓글