Thread
Thread란 프로세스 내부에서 실행되는 작은 작업 단위로 애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 말한다.
Java에서 main method를 실행하면 main이라는 이름을 가진 Thread가 실행되며 하나의 Thread는 한번에 하나의 코드 라인만 수행한다. 만약 동시 처리가 필요하다면 Thread를 추가적으로 생성 해야한다.
Servlet 객체의 호출
클라이언트에서 Request가 전달되면 Thread가 Servlet 객체를 호출한다.
그림에서 Example Servlet을 호출하는 무언가는(그림에서 물음표) Thread이다.
Single Thead일 때 단일 요청
단일 Thread에 요청이 하나일 때 동작 과정은 다음과 같다.
- 클라이언트 요청 및 TCP/IP 연결
- Thread 할당 후 Servlet 호출
- 응답 후 Thread 반환
Single Thread일 때 동시 요청
Single Thread일 때 동시 요청이 오면 동작과정은 다음과 같다.
- 첫번째 요청의 작업을 Single Thread가 수행중이다.
- 두번째, 세번째 요청이 들어오고 WAS와 연결을 완료햇다.
- 두번째, 세번째 요청은 Thread를 사용하기 위해 첫번째 요청 작업이 끝날 때 까지 대기한다.
- 요청이 모두 사라질 때까지 (대기 → 작업수행 → 스레드 반환) 작업을 반복한다.
만약, 아래 그림과 같이 첫번째 요청의 작업이 지연되거나 Error가 발생한다면
모든 요청이 Time out 오류가 발생한다.
Multi Thread
위에서 Single Thread 방식으로 WAS가 동작할 때 문제점을 알아보았다.
이를 해결하려면 여러 개의 Thread를 생성해서 사용하면 된다. WAS는 동시 요청에 대한 처리를 위해 Multi Thread를 지원한다.
Multi Thread로 동시 요청에 대한 처리를 하는 방법
1. 요청마다 새로운 Thread를 생성하는 방법
요청이 들어 올 때마다 Thread를 생성하고 요청이 처리되면 Thread를 종료한다.
장점
- 동시 요청을 처리할 수 있다.
- 하나의 Thread에 지연등의 문제가 발생해도 나머지 Thread는 정상적으로 동작한다.
단점
- Thread 생성에 제한이 없고 생성 비용이 높다.
- 수많은 동시 요청이 발생하면 리소스(메모리, CPU 등) 부족으로 서버가 다운될 수 있다.
- Thread를 사용하면 Context Switching 비용이 발생한다.
💡 멀티 태스킹의 진실과 Context Switching
CPU(프로세서 OR 코어)는 한순간에 하나의 프로세스만 실행할 수 있다.
컴퓨터의 실행 중인 프로그램들이 모두 동시에 수행되는 것처럼 보이지만 사실 엄청나게 짧은 시간 안에 수십에서 수천 번 동안 실행할 프로세스를 교체하고 있는 것이다.
Context Switching
Task1에서 Task2로 Task2에서 Task1로 교체되는 시점마다 Task1이 Ready 상태로 돌아간다는 정보, 진행 정보, Task2는 어디부터 작업을 시작하면 되는지에 대한 정보들을 로딩할 시간이 필요하게 된다. 이 순간의 시점이 바로 Context Switching이며 로딩할 시간이 Context Switching 비용이다.
2. Thread Pool 사용 방법
Thread Pool은 이미 생성된 여러 개의 Thread가 대기하고 있는 곳이다.
Thread Pool을 사용하면 요청이 들어오면 Thread Pool에서 Thread를 받아 사용한다.
사용이 완료된 Thread는 Thread Pool에 반납한다.
만일 Thread Pool에 존재하는 Thread가 모두 사용 중일 때 요청이 들어오면 Thread Pool에 Thread가 생길 때까지 대기하거나 요청을 거절할 수 있다.
Tomcat은 최대 200개 기본 설정이 되어있다.(변경 가능)
- 성능 테스트를 통해 적정 Thread 수를 찾으면 된다.
'Web' 카테고리의 다른 글
Servlet (1) | 2024.11.26 |
---|---|
Web Server와 WAS (0) | 2024.11.26 |
Restful API (1) | 2024.11.26 |
HTTP의 이해 (1) | 2024.11.26 |