2023. 9. 21. 10:11ㆍSpring 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 |