[테코톡] Thread Pool


용어 정리

Program

어떤 목적을 달성하기 위해 컴퓨터의 동작들을 하나로 모아놓은 것

 

Process

컴퓨터가 현재 실행중인 프로그램

 

Thread

CPU Core의 실행 단위

 

Kernel

컴퓨터 자원(CPU, 메모리, 파일, 네트워크, 입출력 장치 등)을 관리하는 역할

 

System Call

Kernel이 관리하는 자원을 응용프로그램이 이용할 수 있도록 하는 인터페이스

시스템 콜은 라이브러리 함수 형태로 제공된다.

 

Context Switching

시스템 콜을 호출한 스레드를 커널 모드로 on/off 해주는 것

작업을 시작하게 되면 커널 모드를 on (다른 스레드는 대기)

작업을 마치게 되면 커널 모드를 off (다음 우선순위의 스레드가 커널 모드 on)

 

User Thread

라이브러리를 통해 생성, 관리되는 스레드

 

Kernel Thread

커널에 의해 생성, 관리되는 스레드

운영체제 계층에서 관리하기 때문에 유저 스레드보다 시간이 오래 걸린다.

 

참고


다중 스레드 사용 방식

1. 요청이 들어올 때마다 새로운 스레드 생성

 

단점

  • 스레드 생성 비용(=컴퓨터 자원 소모) 증가
    • 각 스레드의 스택 메모리 생성 증가, 스레드 정보 저장 증가 => 메모리 부족 문제 발생
    • 컨텍스트 스위칭이 빈번해져서 CPU의 스케줄링 부담 증가 => CPU 오버헤드 문제 발생
  • 요청 처리 시간 증가
    • 스레드 생성/제거하는데 걸리는 시간

2. Thread Pool

 

동작 원리

1. 작업 처리 요청

2. 작업 큐(FIFO)에 작업들이 쌓임

3. 스레드 풀에 생성되어 있는 스레드에 각 작업을 할당

4. 스레드의 최대 개수가 정해져 있으므로, 스레드 개수를 넘는 작업이 요청되면 대기하거나/작업 거절

 

 

Thread Pool의 장점 (개선점)

  • 스레드를 재사용 => 요청 처리 시간 감소
  • 스레드 최대 개수 제한 => 스레드 생성 비용 감소
  • 결론적으로 다중 스레드 환경을 안정적으로 관리할 수 있다!

 

자바의 Thread Pool

동작 원리

1. 스레드 풀은 일정 개수(coreThreadPool)까지의 스레드를 생성

2. 작업 큐가 가득 찬 경우, 스레드 풀은 최대 개수(maximumPoolSize)까지 스레드를 생성

3. coreThreadPool을 초과한 스레드가 일정 시간(keepAliveTime)동안 유휴 상태로 존재한다면 해당 스레드를 제거

 

참고


Tomcat의 Thread Pool

대표적인 다중 스레드로 동작하면서 안정적이어야 하는 경우가 바로 Web Server

Tomcat은 자바의 스레드 풀 구현체와 매우 유사한 자체 스레드 풀 구현체를 가진다.

 

  • maxConnections : Tomcat이 동시에 처리할 수 있는 connection의 최대 개수
  • acceptCount : maxConnections 이상의 요청이 들어왔을 때, 요청이 대기하는 큐
  • maxConnections와 acceptCount가 모두 가득 찬 경우, 그 이상의 요청은 거절될 수 있다.

SpringBoot 설정을 통한 Tomcat Thread Pool 설정

스프링부트에서 톰캣을 사용할 때는 application.yml이나 application.properties 파일에 설정

톰캣 공식 문서 참고

 

maxThreads

  • 자바의 maximumPoolSize
  • default = 200
  • 적절한 개수로 설정
    • 너무 적으면 동시에 처리할 수 있는 요청 수가 줄어든다.
    • 너무 많으면 CPU 오버 헤드, 메모리 부족 문제가 발생할 수 있다.

minSpareThreads

  • 자바의 coreThreadPool
  • default = 10
  • 적절한 개수로 설정

maxIdleTime

  • 자바의 keepAliveTime
  • default = 20000 (20초)

maxConnections

  • 실질적인 동시 처리 개수
  • Tomcat 7 버전까지는 Blocking IO 방식
    • 1 Connection 1 Thread
    • 하나의 스레드가 하나의 연결만 처리
    • max-connections == threads.max
  • Tomcat 8 버전부터는 Non-Blocking IO 방식
    • N Connection 1 Thread
    • 하나의 스레드가 여러개의 연결을 처리
    • max-connections > threads.max
    • max-connections가 threads.max보다 적거나 같다면 비효율적
    • default = 10000

acceptCount

  • default = 100
  • 적절한 개수로 설정
    • 너무 많으면 메모리 부족 문제가 발생할 수 있다.
    • 너무 적으면 요청이 몰렸을 때, 들어오는 요청들을 거절하게 된다.

Thread Pool 설정의 필요성

스레드 풀은 응답 시간과, TPS(초당 트랜잭션 수)에 영향을 주는 요소다.

잘 조정된 스레드 풀은 시스템의 성능을 끌어내고 안정적인 앱 운용을 가능하게 한다.

반면에 부적절한 설정은 병목 현상, CPU 오버헤드, 메모리 문제를 유발할 수 있다.

'개발 지식' 카테고리의 다른 글

EOF(End of File) 개념과 사용 예시  (0) 2025.03.27
프로세스와 스레드의 동작 원리  (0) 2025.03.23
NullPointerException(NPE) 런타임 에러  (1) 2025.03.11
JVM 메모리 구조  (0) 2025.02.25
이스케이프 시퀀스  (0) 2025.02.22