GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Spring

MultiThread - 몇 명이든 내가 처리한다.

Backcoder 2022. 6. 11. 20:41

멀티쓰레드. 

 

서버, 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)
- 서버 리소스, 최대 쓰레드 수, 클라우드 서버 확장  균형값 찾기