스레드 풀(thread pool)

이다혜·2024년 1월 19일
0

영상후기

목록 보기
11/12

❓ 만약 서버에 들어오는 요청마다 스레드를 새로 만들어서 처리하고 처리가 끝난 스레드는 버리는 식으로 동작한다면 어떤 문제가 발생할까?

  • 스레드 생성에 소요되는 시간 때문에 요청 처리가 더 오래 걸리게 된다.

  • 처리 속도보다 더 빠르게 요청이 늘어나면
    -> 스레드 계속 생성(스레드 수 증가)
    -> 컨텍스트 스위칭이 더 자주 발생
    -> CPU 오버헤드 증가로 CPU time 낭비
    -> 어느 순간 서버 전체가 응답 불가능 상태에 빠지게 된다.

  • 메모리가 점점 고갈된다.

📰 Tread Pool

  1. 제한된 개수만큼 미리 스레드를 만들어둔다.
  2. 요청들은 thread poll에서 내부적으로 관리하는 queue로 들어온다.
  3. 스레드 풀 안에 있는 스레드 중에 일이 없는 스레드에게 요청이 할당된다.
  4. 요청 처리가 끝나면 스레드는 버려지지 않고 스레드 풀로 돌아온다.
  • 미리 스레드를 여러 개 만들어 놓고 재사용하는 방식
    -> 스레드 생성 시간 절약

  • 제한된 개수의 스레드를 운용
    -> 스레드가 무제한 생성되는 것을 방지

❓ 언제 사용할까?

여러 작업을 동시에 처리해아할 때

  • thread per request 모델
  • task를 subtask로 나뉘어서 동시에 처리
  • 순서 상관 없이 동시 실행이 가능한 task 처리

✔ Thread pool 사용 팁

1. 스레드 풀에 몇 개의 스레드를 만들어 두는게 적절할까

CPU의 코어 개수와 스레드 풀에 할당될 task의 성향에 따라 다르다.

  • cpu-bound task 일 때
    : 코어 개수 만큼 혹은 그 보다 몇 개 더 많은 정도
  • io-bound task 일 때
    : 경험적으로 찾아야 한다.

2. 스레드 풀의 큐 사이즈 확인하기

큐에 요청이 무한정 쌓인다면 메모리를 고갈시킬 수 있기 때문에 큐 사이즈에 제한을 둬야 한다.

💻 자바의 Executors 클래스

static 메서드로 다양한 형태의 thread pool을 제공
기본 설정으로는 queue size가 20억으로 사실상 제한이 없다.
size 제한 없는 큐는 상황에 따라서는 메모리를 고갈시키는 잠재적인 위험 요인이 될 수 있다.

0개의 댓글