쓰레드
- 클라이언트가 요청하고 서버에서 응답하기 위해서는 서블릿을 호출해야한다. 그럼 그것을 누가 부르는가? 바로 쓰레드이다!
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드이다.
- 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행된다.
- 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다.
- 쓰레드는 한 번에 하나의 코드 라인만 수행한다.
- 동시 처리가 필요하면 쓰레드를 추가로 생성한다.
- 쓰레드는 공장 하나 라고 생각하면 편할 듯 하다.
쓰레드 사용법(요청마다 생성)
- 무언갈 요청할 때 쓰레드를 생성하고 쓰레드를 삭제하는 방식으로 애플리케이션을 설계할 수 있다.
- 각각의 쓰레드가 응답하고 사라지는 방식으로 설계한다.
- 위 방식으로 하더라도 정상 작동은 된다.
요청마다 생성 시 장단점
- 장점
- 동시 요청을 할 수 있다.
- 리소스(CPU, 메모리)가 허용할 때까지 처리가 가능하다.
- 하나의 쓰레드가 지연되어도 나머지 쓰레드는 정상 작동한다.
- 단점
- 쓰레드는 생성 비용이 매우매우 비싸다.
- 고객의 요청이 올 때마다 쓰레드를 생성하면, 응답 속도가 늦어지는 결과가 초래된다.
- 쓰레드는 컨텍스트 스위칭 비용이 발생한다.
- 쓰레드끼리 전환할 때 비용이 발생하는 것을 컨텍스트 스위칭 비용이라고 한다.
- 2개정도의 쓰레드가 아니라 수백개의 쓰레드가 컨텍스트 스위칭을 한다면.. 상당히 많은 비용이 발생된다.
- 쓰레드 생성에 제한이 없다.
- 고객 요청이 무한대로 발생할 경우에는 CPU, 메모리 임계점을 넘어서 서버가 반드시 다운된다.
해결방법은 쓰레드 풀이다!
- 미리 쓰레드를 쓰레드 풀에 만들어둔다.(500개라고 가정하자)
- 쓰레드는 사용되면 다시 쓰레드 풀에 반납한다.
- 계속해서 쓰레드를 재활용하는 방식이다.
쓰레드 풀의 장점과 특징
- 500개의 쓰레드를 모두 사용하고 있으면? 쓰레드를 대기하거나 서버에서 거절할 수 있다.
- 요청마다 쓰레드를 생성하는 단점을 보완한다.
- 특징
- 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다!
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. 톰캣은 최대 200개 기본 설정(변경 가능하다.)
- 사용 방식
- 쓰레드가 필요하면 쓰레드를 쓰레드 풀에서 꺼내서 사용한다.
- 사용 종료 시 쓰레드 풀에 반납한다.
- 최대 쓰레드가 사용중이면
- 기다리는 요청을 거절하거나 특정 숫자만큼 대기하도록 설정할 수 있다.
- 장점
- 쓰레드가 생성되어 있어서 쓰레드를 생성하고 종료하는 비용(CPU)이 절약되고 응답 시간이 빠르다.
- 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청을 안전하게 처리할 수 있다.
쓰레드 풀 실무 관련
- WAS의 주요 튜닝 포인트는 최대 쓰레드(max thread)의 수 이다.
- 이 값을 너무 낮게 설정하면
- 10개를 만들었는데 100개를 만들었다고 생각하자.
- 10개씩 밖에 처리할 수 없다.
- 계속해서 남은 요청은 대기하고 거절한다.
- 그렇다면 CPU는 5%만 사용되어지고 있다.(개발자가 세팅을 잘못한거다. 50%는 써줘야한다.)
- 서버 증축을 위해 인스턴스를 또 구매해야하는 경우가 발생한다.
- 조치를 취하지 않는다면 밀리면서 서비스 장애가 난다.
- 동시 요청이 많으면, 서버 리소스는 여유롭지만, 클라이언트는 금방 응답 지연
- 이 값을 너무 높게 설정하면
- 동시 요청이 많으면 CPU, 메모리 리소스 임계점 초과로 서버가 다운된다.
- 즉, 적절한 값을 찾아야한다.
- 장애 발생시?
- 클라우드면 서버부터 증축, 이후에 튜닝(서비스가 일단 살아야 하니까!)
- 클라우드가 아니면 열심히 튜닝하는 수 밖에 없다..
그렇다면 적절한 쓰레드 갯수는 어떻게 파악할까?
- 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다르다.
- 성능 테스트
- 최대한 실제 서비스와 유사하게 성능 테스트 시도
- 툴 : 아파치 ab, 제이미터, nGrinder
- 최적의 값은 구할 수 없다. 그러므로 성능테스트로 최대한 최적의 값에 유사한 값을 찾는다.
- 최적의 값을 찾고 튜닝을 진행하면 된다.
WAS의 멀티 쓰레드 지원
- WAS는 멀티쓰레드를 지원한다!!
- 개발자는 멀티쓰레드 관련 코드를 신경쓰지 않아도 된다.
- WAS의 개발 생산성을 높여주는 가장 주요한 부분이다.
- 개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발한다.
- 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용해야한다.
추가로 금일 정보처리 기사를 신청했다.. 무려 수험일이 7월 9일.. 20일도 안남았기 때문에 이제 또 잠시 스프링 MVC는 내려놓고 정처기 준비를 해야할 듯 하다.. 정처기 정리도 할 예정이니 스스로 시험 볼 때 도움이 되었으면 한다.