스레드 풀 (thread pool)

강민승·2023년 4월 13일
0

요청마다 스레드를 생성하는 경우

  • 스레드 생성에 소요되는 시간 때문에 요청 처리가 더 오래 걸림.
  • 처리 속도보다 더 빠르게 요청이 늘어나면
    • 스레드가 계속 생성
      • 메모리가 점점 고갈됨
    • 컨텍스트 스위칭이 더 자주 발생
    • CPU 오버헤드 증가로 CPU time 낭비
    • 어느 순간 서버 전체가 응답 불가능 상태에 빠짐

그래서 나온게 thread pool

미리 스레드를 여러 개 만들어 놓고 재사용

→ 스레드 생성 시간 절약

제한된 개수의 스레드를 운용

→ 스레드가 무제한으로 생성되는 것을 방지

그럼 언제 사용?

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

thread per request 모델

task를 subtask로 나눠 동시에 처리

순서 상관없이 동시 실행이 가능한 task 처리

Tread pool 사용 팁

  1. 스레드 풀에 몇 개의 스레드를 만들어 두는 게 적절한가?

    1. cpu의 코어 갯수와 task의 성향에 따라 다름
    • 만약 cpu-bound task라면 코어 갯수 만큼 혹은 그 보다 몇 개 더 많은 정도
    • 만약 I/O bound task라면 코어 갯수보다 1.5배인지 두배, 세베 인지는 경험적으로 찾아야 한다.
  2. 스레드 풀에서 실행될 task 개수에 제한이 없다면 스레드 풀의 큐가 사이즈 제한이 있는지 꼭 확인할 것.

    즉, 사이즈 제한이 없는 큐는 상황에 따라서 메모리를 고갈시키는 잠재적인 위험 요인이 될 수 있음.

    → 이때 큐가 다 차면, 그 이후에 들어오는 요청이나 task같은 경우 일단 버리더라도 전체 시스템을 보호하는 형태로 진행한다.

    pool 이라는 개념은 스레드에만 쓰이는 것이 아님.

    process pool, connection pool도 있음.

출처 | 쉬운코드 유튜브

profile
Step by Step goes a long way. 꾸준하게 성장하는 개발자 강민승입니다.

0개의 댓글