목표

  • Thread pool의 사용 목적을 이해한다.
  • Spring boot에서 Tomcat의 Thread pool 설정 방법을 이해한다.

Thread Pool

  • DB, 웹 서버 등의 프로그램에서 요청이 도착할 떄마다 새 스레드를 생성하는 방법은 문제점이 있다.
    • 요청을 처리할 때마다 스레드를 생성하고 삭제하는 것은 많은 시간과 시스템 리소스를 사용한다.
    • 너무 많은 요청이 오면, 동시에 너무 많은 스레드가 생성되어 시스템 리소스가 부족해질 수 있다. 스레드 수를 제한할 필요가 있다.
  • 이 문제를 해결하기 위해서 이전에 미리 생성된 스레드를 재사용하기 위한 Thread pool을 사용한다.
    • thread pool을 나타내는 대표적인 구현체는 ThreadPoolExecutor가 있고 ExecutorService 인터페이스를 구현하고 있다.

Tomcat의 요청 처리 방식

  • Tomcat은 모든 요청이 Connector를 통해서 들어온다.
  • Service는 하나의 Engine과 여러 개의 Connector를 매핑시켜준다.
    • Service 내에는 Executor라는 thread pool이 존재한다.
    • 예전에는 커넥터 하나 당 하나의 thread pool을 들고 있었지만, 지금은 Tomcat 내 컴포넌트 간에 thread pool을 공유하고 있다.
  • EngineConnector로 부터 온 모든 요청을 처리한다.
  • Host는 가상 호스트를 나타낸다. 가상 호스트에 대한 Context를 매핑하고 있다.
  • Context가 가상 호스트에 대한 웹 애플리케이션을 나타낸다. 요청이 들어오면 정의된 Servlet 매핑에 따라 Servlet을 선택한다.

Spring boot에서 thread pool 설정하는 방법

  • Spring Boot에서는 properties 파일을 통해 tomcat의 thread pool을 설정할 수 있다.
    • server.tomcat.thread.min-spare: thread의 최소 개수
    • server.tomcat.thread.max: thread의 최대 개수
  • 주의점: tomcat의 최대 thread 수가 한 번에 맺을 수 있는 최대 connection 수가 아니다.
    • Tomcat 7 이전 버전에서는 BIO(blocking I/O) 방식으로 하나의 connection이 하나의 thread를 할당했다.
    • 이후에는 NIO(non-blocking I/O) 방식으로 thread 개수보다 connection의 개수가 많아질 수 있다.
    • Java NIO의 간단한 설명: buffer를 만들어두고 읽을 수 있는 데이터가 있을 때 thread를 할당해 처리하는 방식

참고 자료