쓰레드란?
웹브라우저에서 WAS로 요청이 온다고 생각해보자.
요청이 오면 WAS는 Servlet을 호출하여 웹 브라우저와 연결해 줄 것이다.
그럼 Servlet은 누가 호출해 줄까?
이 애플리케이션 코드를 하나하나 순차적으로 실행해 주는 것을 쓰레드라고 부른다.
자바 코딩을 하다보면 가장 처음 보게되는 것이 Main 메서드 인데, 예를 들어 자바 Main 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행되게 된다.
만약 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하며 쓰레드는 한번에 하나의 코드라인만 수행 가능하기 때문에 동시 처리가 필요하다면 쓰레드를 추가로 생성해야한다.
단일 쓰레드
만약 단일 요청이 오게 된다면 쓰레드는 하나만 사용하게 될 것이다.
과정을 생각해 보면 요청이 들어오기 전까지 쓰레드는 WAS에서 휴식하고 있다가 요청이 들어오게 되면 쓰레드가 할당 되어 WAS의 Servlet을 호출하고 웹브라우저와 연결하게 된다.
그리고 Servlet에서 처리가 완료되면 응답을 보내고 쓰레드는 다시 휴식 상태로 들어가게 된다.
그렇다면 만약 단일 쓰레드에서 요청이 다중으로 들어오면 어떻게 될까?
단일 쓰레드에서 다중 요청이 들어오면 쓰레드는 순차적으로 요청을 처리하게 된다.
그런데 만약 첫번째 요청을 하는 중 어떤 이유로 처리가 지연되었다고 생각해보자.
코드를 동작시키는 것은 쓰레드이기 때문에 2번째로 들어온 요청은 1번째로 들어온 요청이 처리될 때 까지 대기상태로 기다려야 한다.
그렇다는 말은 첫번째와 두번째 요청 자체가 둘다 지연이 되고 있다는 것을 의미한다.
이런 상황을 막기 위해서 요청이 들어올때 마다 쓰레드를 생성하여 쓰레드 지연이 발생 하지 않도록 하고 어떤 요청의 처리가 지연되더라도 다음 요청이 대기하는 상황을 막을 수 있다.
이렇게 요청마다 쓰레드를 생성하면 동시 요청을 처리할 수 있고, 리소스가 허용할 때 까지 처리가 가능하며 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작하도록 만들 수 있다.
하지만 이런 방식은 문제가 있는데, 우선 쓰레드는 생성 비용이 매우 비싸기 때문에 고객 요청마다 쓰레드를 생성하면 필연적으로 응답 속도가 늦어지는 현상이 생긴다.
또한 컨텍스트 스위칭 비용이라는 것이 발생하는데, 예를 들어 코어 1개인 경우 실제로는 1개의 쓰레드만 처리가 가능한데 만약 2개를 처리하는 경우 각 쓰레드를 교체하는 비용을 컨텍스트 스위칭 비용이라고 한다.
또한 쓰레드 생성에는 제한이 없기 때문에, 고객의 요청이 너무 많이 오는 경우 CPU나 메모리 임계점을 넘어서 서버가 죽어버릴 수도 있다.
쓰레드 풀
위와 같은 현상을 막기위해서 실제로 WAS는 쓰레드 풀이라는 것을 이용하게 된다.
쓰레드 풀이란 가용한 쓰레드를 보관하는 곳으로 웹 브라우저 요청이 들어오면 WAS의 쓰레드 풀에서 쓰레드를 요청 하고 할당 받아서 사용하는 것이다.
이후 처리가 완료되면 다시 쓰레드를 쓰레드 풀에 반납한다.
이런 식으로 하면 전체 쓰레드의 갯수를 제한할 수 있고 요청마다 쓰레드를 생성하는 것이 아니기 때문에 비싼 쓰레드 생성 비용을 절약할 수 있다.
예를 들어 전체 쓰레드 풀에 200개의 쓰레드가 있다면 200개의 쓰레드가 모두 사용중 인 경우 쓰레드 대기, 거절을 통하여 서버 자원을 관리하고 비용을 절약할 수 있는 것이다.
그렇다면 쓰레드 풀에 대한 실무 팁을 살펴보자.
- WAS의 주요 튜닝 포인트는 최대 쓰레드(max Thread) 수이다.
최대 쓰레드를 너무 낮게 설정하면 서버 리소스는 여유롭지만 클라이언트는 금방 응답이 지연되는 현상이 나타나며 최대 쓰레드를 너무 높게 설정하면 CPU나 메모리 리소스 임계점 초과로 서버가 다운될 수도 있다.
따라서 서버의 적정 쓰레드 최대값을 설정 하는 것이 중요하며 클라우드라면 일단 서버부터 증설하고 이후에 튜닝을 하면 되지만 클라우드가 아니라면 튜닝을 열심히 하는 방법 뿐이다.
그렇다면 쓰레드 풀의 적정 숫자는 어떻게 구할까?
쓰레드 풀의 적정 숫자는 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 다르며 일반 적으로 성능 테스트를 통해 구하게 된다.
최대한 실제 서비스와 유사하게 테스트를 하는 것이 좋으며 아파치 ab, 제이미터, nGrinder 같은 툴을 사용하면 좋다.
WAS의 멀티 쓰레드 지원
사실 멀티 쓰레드에 대한 부분은 WAS가 처리한다.
따라서, 개발자가 멀티 쓰레드 관련 코드를 신경 쓰지 않고 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발 하면 된다.
단, 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용할 필요가 있다.
'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC - 서블릿 (0) | 2024.05.16 |
---|---|
Spring MVC - Web Server와 Web Application Server (0) | 2024.05.11 |