클라이언트가 브라우저로 HTTP Request 메시지를 보내면, HTTP Response 메시지가 반환된다. 세부적으로는 서블릿 객체를 호출하여 HttpServletRequest, HttpServletResponse 객체를 생성하고 이를 통해 Response 메시지를 생성하는 것이다. 그렇다면 서블릿 객체는 누가 호출할까?
바로 Thread이다.
Thread란 어플리케이션 코드를 하나씩 순차적으로 실행하는 것이다. 예를 들어 main 메서드를 실행하면 main 스레드가 실행되는 것이다.
스레드는 한번에 하나의 코드 라인만 수행하기 때문에, 동시 처리가 필요하면 스레드를 추가로 생성해야 한다.
동시 처리를 위해서는 여러 가지 방법이 있다.
# 방법1. 요청할 때마다 매번 스레드를 생성하는 방법
1. 장점
- 동시 요청 처리 가능
- 리소스 허용될 때까지 처리
- 하나의 스레드가 지연되어도 정상 동작
2. 단점
- 스레드 생성 비용이 비싸다
- 고객 요청 때마다 스레드를 요청하면, 응답 속도가 늦어진다.
- Context Switching 비용 발생(Core 당 스레드 하나만 수행할 수 있는데, 스레드가 두 개인 경우 하나가 종료되고 다른 하나를 실행한다. 이때 스레드를 스위칭할 때 비용이 발생하는데 이를 Context Switching이라고 한다)
- 스레드 생성에 제한이 없다. (무수한 고객의 요청 시 과부하 발생 가능)
# 방법 2. Thread Pool의 사용(일반)
스레드 풀에 미리 스레드를 생성해 놓고 관리한다. 스레드가 필요하면 스레드 풀에 요청을 하고, 이미 생성되어 있는 스레드를 사용한다. 스레드 사용을 마치면 이를 스레드 풀에 반납한다.
스레드 풀에 생성 가능한 스레드의 개수를 관리해야한다. (Tomcat의 경우 최대 200개) 그런데 만약 스레드 풀에 저장된 스레드 수를 초과하는 요청이 들어오는 경우 어떻게 처리할까?
초과되는 나머지 요청들은 대기 혹은 거절하게 된다.
→ 장점
스레드가 미리 생성되어 있기 때문에, 스레드를 생성하고 종료하는 비용이 절약되고, 응답 시간이 빠르다.
생성 가능한 스레드의 갯수가 정해져 있기 때문에, 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.
WAS 튜닝 포인트 - Max Thread
WAS의 주요 튜닝 포인트는 최대 스레드(Max Thread) 수이다. 이 값을 너무 낮게 설정하면 동시 요청이 많을 경우 CPU 자원은 남아 돌지만, 초과되는 요청을 처리하지 않고 계속 요청이 밀려 결과적으로 장애가 발생한다. 그렇다고 매우 높게 설정하면 동시 요청이 많을 경우 그 많은 요청을 다 받아버리기 때문에 과부하가 발생하여 서버가 죽을 수 있다.
그러므로 적정 값을 찾아서 적당한 Max Thread 수를 설정하는 것이 중요한데 어떻게 찾을 수 있을까? 최적의 해를 도출하기 힘들지만 다음과 같은 조건을 통해 설정할 수 있다.
① 어플리케이션 로직의 복잡도
② CPU
③ Memory
④ IO 리소스
중요한 것은 실제 서비스와 가장 유사한 환경을 구축한 후에 성능 테스트를 해봐야한다. (nGrinder를 통해)
그렇다면 멀티 스레드를 지원하는 코드는 어떻게 작성할까
멀티 스레드에 대한 부분은 WAS가 처리를 하고 있어서, 개발자가 따로 멀티 스레드 코드를 작성할 필요는 없다.
대신 멀티 스레드 환경이기 때문에 싱글톤 객체(서블릿, 스프링 빈)은 주의해서 사용할 필요가 있다.
출처
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'🌱 Spring > MVC ①' 카테고리의 다른 글
[Spring] HTTP 요청 데이터(HttpServletRequest) (0) | 2023.07.12 |
---|---|
[Spring] HttpServletRequest 기능과 정보 (0) | 2023.07.11 |
[Spring] Servlet 구현 (0) | 2023.07.11 |
[Spring] 서블릿 (0) | 2023.07.10 |
[Spring] Web Server & Web Application Server(WAS) (0) | 2023.07.10 |