멀티쓰레드.
서버, Traffic 을 관리하는데 핵심이 되는 기능이다.
일단 이 기능 또한, WAS 형님이 제공해 주는 기능임을 되새기며. ( Sevlet Container )
Thread.
CPU 듀얼코어 4Thread 할 때의 그 놈이다.
두뇌인 Core 가 Thread 를 하나 실행하고, 다음 걸 실행하는 식이다.
이 Thread 가 바로 API 코드를 실행시키는 역할을 하는 놈이다.
Java 에서 main 메소드를 실행시키면 => main 전담 Thread 가 붙어서 실행시켜 준다.
main 이 실행되는 과정처럼,
한줄한줄씩, 한번에 하나씩만, 순차적으로 실행시켜 준다. (Thread가 그렇게 일하도록 설계되어 있다.)
서버에서, 즉 WAS 에서 이 Thread 는
client 요청이 들어오면 Sevlet 을 호출해서 요청을 처리하는 핵심 역할을 한다.
-
그렇다면 여러명의 client 들에게 동시에 다중요청이 들어오면 어떻게 할까?
예를 들어 4 thread 인 CPU 컴퓨터로 고객들을 상대한다고 해보자.
4개의 요청이 거의 동시에 들어왔고, 요청이 들어올때마다 각자 전담 Thread 를 생성해서 전담마크를 시켰다.
훌륭한 4thread 컴퓨터가 동시에 동시 요청을 처리해냈다.
하지만 만약 4000개의 traffic 이 갑자기 동시다발적으로 늘어난다면?
요청이 들어올때마다 쓰레드를 생성하다보니, 쓰레드가 4000개가 넘어가고 있다면?
- 이렇게 "요청" 마다 쓰레드를 생성하기엔 쓰레드는 너무 고오급 인력이다.
당연하게도 CPU 를 많이 사용하는 등, 생성비용이 매우 비싸다.
게다가, CPU 에서 Core가 쓰레드를 실행시키는데, 이 쓰레드, 저 쓰레드 돌아다니면서(Switch) 일을 하다보면
"Context Switching" 이라는 비용도 발생해 더욱 리소스에 무리를 준다.
-
이런 문제들을 해결하기 위해 만들어 낸 것이 바로
Thread Pool 이다.
1. 미리 200개 정도의 thread를 생성해서 Thread Pool 인력시장에 집어넣고 대기시키면서 보관/관리한다.
2. 일이 생길때마다 불러서 요청을 해결시킨다. ( Sevlet 호출 )
3. 일이 끝나면 다시 Thread pool 에 반납한다.
4. 만약, 200개의 max thread 가 다 작업중인데도, 계속해서 client 의 요청이 들어온다면,
(1) 거절 ("지금은 서비스 이용 안됩니다")
(2) 대기 ("잠시만 기다려주세요. "(10명만 받겠습니다.) )
5. MaxThread - Thread Pool 에 생성가능한 최대 thread 수를 관리한다 ( Pool 이 관리 )
WAS 에서
이 "최대 쓰레드 수 (Max Thread)" 를 잘 관리, 세팅 하는게 가장 중요한 성능튜닝 포인트 이다.
실제 서비스와 최대한 유사하게 만들어 ( 아파치 ab, ngrinder ) 성능 Test 를 통해 최적의, balance 잡힌 Max Thread 수를 세팅하는것이 서버 트래픽을 관리하는데 핵심적인 기능이다.
이렇게 WAS 는 (Sevlet Container) " Thread Pool " 을 이용해서 "멀티쓰레드" 기능을 지원해 준다.
그래서 적절한 Max Thread 로 효율적으로 요청에 대응할 수 있게 해준다.
서버 리소스
최대 쓰레드 수
클라우드 서버 확장
이 셋 사이에 균형을 잘 맞추고 효율적인 쓰레드 수를 맞춰가는게 트래픽 관리에 있어 매우 중요한 역량으로 생각된다.
일어날 상황에 대해 그려보고 그에 맞춰 성능 test 를 통해, 장애발생시,
1. 서버를 늘릴 것인지
2. 이 경우에는 Max Thread를 얼마로 세팅하고
3. 저 경우에는 얼마로 설정할 것인지
플랜 A,B,C 짜두고 시나리오식으로 잘 대처해내는 능력.
(요약)
Thread
- API 코드를 실행시키는 역할
- 한줄한줄씩, 한번에 하나씩만, 순차적으로 실행
- 요청이 들어오면 Sevlet 호출 => 요청 처리
- 생성비용 비쌈
- Context Switching 비용 발생 가능
Thread Pool
- Pool 에 생성가능한 최대 thread 수를 관리 => MaxThread 최대 쓰레드 개수
- MaxThread 세팅이 가장 중요한 튜닝 포인트 (WAS)
- 서버 리소스, 최대 쓰레드 수, 클라우드 서버 확장 균형값 찾기
'Back to the Spring' 카테고리의 다른 글
변수 { id } 를 품은 URL (0) | 2022.06.15 |
---|---|
세션 VS JWT(토큰) .Feat 쿠키 (1) | 2022.06.12 |
Servlet 서블릿 등장 , http? 내가 다 연결해줄게! (0) | 2022.06.11 |
Lombok 롬복이 누구니? (0) | 2022.06.10 |
한글 깨짐 Tomcat? Java11? mustache! (0) | 2022.06.07 |