Thread Pool

2023. 9. 21. 10:11Spring Framework/Apache Tomcat Server

🚀 Apache Tomcat 스레드 풀(Thread Pool) 정리

Apache Tomcat의 스레드 풀(Thread Pool)동시에 여러 클라이언트 Http Request를 처리할 수 있도록 도와주는 중요한 메커니즘입니다.
이를 통해 시스템 자원을 절약하고 성능을 최적화할 수 있습니다.

1️⃣ 스레드 풀의 개념

🖥️ 스레드 풀(Thread Pool) 이란?

  • 일정 수의 스레드를 미리 생성하여 요청이 발생하면 즉시 할당
  • 요청 처리 후 스레드를 반환하여 재사용
  • 새로운 스레드를 매번 생성하는 오버헤드를 줄이고 성능 최적화

🛠️ 동작 방식
1️⃣ Http Request 수신 → 클라이언트 Request를 커넥터가 수신
2️⃣ 스레드 할당 → 스레드 풀에서 사용 가능한 스레드를 할당
3️⃣ 요청 처리 → 할당된 스레드가 요청을 처리
4️⃣ 응답 반환 → 처리 완료 후 클라이언트에 응답
5️⃣ 스레드 반환 → 스레드는 풀로 돌아가 새로운 요청을 대기

 

📌 스레드 풀이 없으면?

  • 요청마다 새로운 스레드를 생성하고 제거해야 함
  • 스레드 생성 비용이 커져 서버 성능 저하

2️⃣ 톰캣의 커넥터와 스레드 풀

🔹 톰캣에서 스레드 풀은 커넥터(Connector)와 함께 동작
톰캣은 HTTP 및 AJP 커넥터 를 통해 요청을 처리하며,
이때 스레드 풀을 사용하여 다수의 요청을 효율적으로 처리합니다.

1. HTTP/1.1 커넥터

  • 클라이언트와 HTTP 프로토콜을 사용하여 통신
  • 설정 예시:
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"
               redirectPort="8443"
               maxThreads="200"
               minSpareThreads="10"
               acceptCount="100" />

2. AJP 커넥터

  • Apache HTTP 서버와 Tomcat 간 빠른 통신을 지원하는 AJP(Apache JServ Protocol) 사용
  • AJP 커넥터도 스레드 풀을 사용하여 요청을 처리

3️⃣ 톰캣 스레드 풀 설정

톰캣의 스레드 풀 설정은 server.xml 에서 각 커넥터별로 설정 가능

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxThreads="200"
           minSpareThreads="10"
           acceptCount="100"
           executor="tomcatThreadPool" />

📌 주요 설정 항목

설정 설명 기본값
maxThreads 톰캣이 동시에 처리할 수 있는 최대 스레드 수 200
minSpareThreads 유지할 최소 유휴(Idle) 스레드 수 10
acceptCount maxThreads 도달 후 추가 요청을 대기할 큐 크기 100
executor 여러 커넥터가 공유할 중앙 관리 스레드 풀 설정 -

📌 설정 예시

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
          maxThreads="300" minSpareThreads="50" />
  • 여러 커넥터가 중앙에서 스레드 풀을 공유
  • CPU 자원을 최적화하고 성능을 향상

4️⃣ 톰캣 스레드 풀 성능 튜닝

1. maxThreads 최적화

  • 너무 낮으면 → 처리 속도 저하 & 요청 대기 증가
  • 너무 높으면 → CPU & 메모리 과부하 발생
  • 애플리케이션 성격에 맞는 적절한 값 설정

2. minSpareThreads 조정

  • 초기에 준비되는 유휴 스레드 개수
  • 너무 많으면 메모리 낭비, 너무 적으면 초기 응답 속도 저하

3. acceptCount 조정

  • maxThreads 초과 요청을 대기열에 추가하여 관리
  • 대기열이 작으면 과부하 시 요청이 거부될 가능성 증가

4. Executor 사용

  • 여러 커넥터가 하나의 스레드 풀을 공유
  • 불필요한 리소스 사용을 줄이고, 스레드 관리 효율 증가

5️⃣ 비동기 처리(Asynchronous Request Processing)와 스레드 풀

🔹 비동기 처리를 사용하면 스레드를 오래 점유하지 않음
🔹 적은 스레드로 더 많은 요청을 처리 가능
🔹 스레드 풀 효율 극대화

비동기 처리 활성화 예제

@WebServlet(urlPatterns = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        AsyncContext asyncContext = request.startAsync();
        asyncContext.start(() -> {
            try {
                Thread.sleep(2000);  // 비동기 작업
                response.getWriter().write("Async Response");
                asyncContext.complete();
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        });
    }
}

📌 특징

  • asyncSupported = true비동기 요청 지원
  • asyncContext.start()비동기 작업을 새로운 스레드에서 실행
  • 스레드가 작업을 끝낼 때까지 다른 요청을 처리 가능

🎯 Summary

Apache Tomcat의 스레드 풀(Thread Pool)은

  • 여러 클라이언트 요청을 동시에 처리할 수 있도록 하는 핵심 메커니즘
  • 스레드 재사용을 통해 자원을 절약하고 성능을 최적화

톰캣의 스레드 풀 설정 (server.xml)

설정 항목 설명 
maxThreads  동시에 처리할 최대 요청 개수 (디폴트 값 200)
minSpareThreads  유지할 최소 유휴 스레드 (디폴트 값 10)
acceptCount  최대 스레드 초과 요청의 대기열 크기 (디폴트 값 100)
executor  여러 커넥터가 공유하는 스레드 풀

스레드 풀 성능 튜닝

  • maxThreads 값 조정 (적절한 최대 스레드 수 설정)
  • minSpareThreads 값 조정 (초기 유휴 스레드 개수 조정)
  • acceptCount 값 조정 (대기열 크기 설정)
  • Executor 사용 → 여러 커넥터가 하나의 스레드 풀을 공유하여 자원 최적화

비동기 요청 처리(Async Processing) 활용

  • 요청이 스레드를 오래 점유하지 않도록 관리
  • 적은 스레드로 더 많은 요청을 처리 가능

🚀 스레드 풀 설정을 최적화하여 톰캣 서버의 성능을 극대화할 수 있습니다! 🎯

'Spring Framework > Apache Tomcat Server' 카테고리의 다른 글

Engine  (0) 2024.05.31
Tomcat Context Root  (0) 2024.04.26
Tomcat 서버에서 정적 페이지를 처리하는 방법  (0) 2023.06.13
Service  (0) 2023.06.06
Host  (0) 2023.06.06