티스토리 뷰
자바 웹 서버에서 요청들이 오면 해당 요청들을 처리하는 것이 서블렛이다. 이 서블렛들은 싱글톤으로 관리된다 했는데 서블렛을 부르는 존재는 누구일까?
쓰레드
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이 쓰레드이다.
- 프로그램의 수행단위가 쓰레드.
- 자바 메인 메서드를 처음 실행하면 main이라는 이름을 가진 쓰레드가 실행된다.
- 쓰레드가 없다면 자바 애플리케이션 실행 조차 불가능하다.
- 쓰레드는 한번에 하나의 코드라인만 수행한다. 이를 위해 각 쓰레드는 PC라는 프로그램 카운터를 갖는다.
- 동시 처리가 필요하면 쓰레드를 추가 생성한다.
WAS에 클라이언트로부터 요청이 들어오고 -> 해당 요청에 쓰레드가 할당된다 -> 쓰레드에 요청에 맞는 서블렛을 불러와서 코드를 실행을 하게 된다.
Q. 만약 쓰레드가 할당되고 할당된 쓰레드에서 서블렛을 배정해서 처리를 하는 일련의 과정에 지연이 발생하고 그때 또 다른 요청이 들어온다면 어떻게 될까?
A. 단일 쓰레드라면 1번 요청은 지연이 발생해서 요청에 실패하고, 2번 요청은 쓰레드를 계속 기다리다가 time-out으로 요청에 실패하게 된다.
해결: 요청이 올 때마다 새롭게 쓰레드를 생성해서 처리하도록 하면 된다.
장점
- 동시 요청을 처리할 수 있다.
- 리소스가 허용할 때 까지 처리할 수 있다.
- 하나의 쓰레드가 지연되도 다른 쓰레드는 영향을 받지 않는다.
단점
- 쓰레드의 생성 비용은 매우 비싸다. 고객의 요청이 올 때 마다 쓰레드를 생성하면, 응답속도가 늦어진다.
- 쓰레드는 Context Switching 비용이 발생한다.
- 쓰레드 생성에 제한이 없다. 요청이 너무 많이 오면 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다.
이러한 문제로 쓰레드 풀(Thread Pool)을 이용해서 쓰레드를 미리 일정한 양만큼 생성해 놓고 거기서 가져다 쓰는 방식으로 구현된다. 요청을 완료하면 해당 쓰레드를 다시 쓰레드 풀에 반납하게 된다.
쓰레드 풀 (Thread Pool)
- 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다.
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. 톰캣은 기본설정으로 200개가 되어있다.
- 쓰레드가 필요하면 쓰레드 풀에서 꺼내서 사용하고 없으면 대기하거나 요청을 거절하게 된다. 이때 대기하는 요청의 개수를 설정할 수 있다.
- 사용이 종료된 쓰레드는 다시 반납한다.
장점
- 쓰레드가 이미 생성되어 있으므로 생성/종료하는 비용이 절약되고 응답시간 빨라진다.
- 생성 가능한 쓰레드의 수가 정해져 있으므로 너무 많은 요청이 들어와도 가능한 요청까지만 안정적으로 처리할 수 있다.
예시
스프링 부트에서 쓰레드 풀을 설정할 때는 application.yml 파일을 아래와 같은 방식으로 작성하면 된다.
server:
tomcat:
threads:
max: 200 # 생성할 수 있는 thread의 총 개수
min-spare: 10 # 항상 활성화 되어있는(idle) thread의 개수
accept-count: 100 # 작업 큐의 사이즈
그렇다면 중요한건 결국 쓰레드 풀의 적정 숫자를 잡는것이 가장 중요해 보인다. 그렇다면 이 값을 어떻게 정확히 알 수 있을까?
바로 알 수 는 없고 성능테스트를 통해서 찾아야 한다.
애플리케이션의 로직 복잡도, CPU, 메모리, IO 리소스에 따라 제각각이므로 테스트를 통해 파악해야한다.
nGrinder와 같은 테스트 툴을 이용하도록 하자!
결론적으로 WAS는 멀티 쓰레드 관련 부분을 알아서 처리하므로 해당 부분은 신경쓰지 않고 적절한 풀 크기만 찾아서 세팅해주면 된다.
반응형
'Web > 정리글' 카테고리의 다른 글
SYN Flooding Attack(DDos) 대응 정리 (0) | 2021.12.27 |
---|---|
자바 웹 역사 정리 (0) | 2021.12.21 |
HTTPS, TLS 정리 (0) | 2021.10.19 |
DB 트랜잭션 정리 (0) | 2021.10.04 |
Exception & Transaction rollback 정리 (0) | 2021.09.23 |
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday