[Spring] WAS 멀티 쓰레드에 대한 나름의 이해

2023. 11. 10. 17:40Spring

백엔드 개발자에게 매우매우 중요한 개념이다.

쓰레드는 실행 흐름이다.

동시에 요청이 들어올때 하나의 쓰레드만 있다면 먼저 들어온 요청을 끝내고 다음 요청을 한다.

하지만 먼저 들어온 요청에서 지연이 발생하면 자연스럽게 그 다음 요청도 지연된다.

이는 사용자 경험을 떨어뜨린다.

이를 해결하기 위해 멀티 쓰레드를 사용한다.

하지만 요청이 들어올때 마다 쓰레드를 생성한다면 비용이 크다.

콘텍스트 스위칭 비용, 쓰레드 생성, 제거 비용이 발생하고 이는 CPU의 효율을 떨어뜨리고 응답 속도가 늦어진다.

또한 쓰레드 생성에 제한이 없으면 요청이 너무 많이 들어오면 서버가 죽는다.

이러한 문제 때문에 쓰레드풀이라는 것을 만들어 사용한다.

쓰레드풀이란 쓰레드를 정해진 개수만큼 미리 만든 것이다.

쓰레드풀에서는 쓰레드를 새로 생성하거나 삭제할 필요가 없이 사용하고 반납하면 된다.

만약 모든 쓰레드가 사용중이라면 대기를 하게 하거나 거절할 수 있다.

생성, 종료 비용이 절약되고, 응답 시간이 빠르다. 서버가 죽지 않고 안전하게 처리된다.

 

여기서 튜닝 문제가 생긴다.

쓰레드 최대치를 얼마로 잡는지가 중요하다.

너무 작게 잡으면 하나의 CPU를 제대로 활용하지 못한다. 이를 인지하지 못하고 서버의 개수만 늘리면 낭비를 하고 있는 것이다.

너무 높게 잡으면 서버가 죽는다.

따라서 적정값을 찾는게 중요하다.

장애가 발생한다면 클라우드면 일단 서버부터 늘리고, 튜닝한다. 아니면 열심히 튜닝한다.

적정값을 찾기 위해서는 출시 전 성능 테스트를 해보는 게 중요하다. ex) 아파치 ab, 제이미터, nGrinder 등

 

핵심은 WAS는 멀티 쓰레드를 지원한다.

개발자가 신경 쓰지 않아도 된다.

마치 싱글 쓰레드 프로그램을 개발하듯이 소스 코드를 개발하면 된다.

하지만 멀티 쓰레드 환경이니만큼 싱글톤 객체는 공유자원에 대해서 주의해서 사용한다.

 

Reference


https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1&unitId=71162

 

학습 페이지

 

www.inflearn.com