[Spring] Apache AB를 활용한 서버 성능테스트와 톰캣 쓰레드(Thread) 확장으로 성능 최적화
-
웹 서버들은 어떻게 동시에 여러개의 요청을 처리할까?
일반적으로 멀티 쓰레드를 이용한 방법을 채택한다.
그런데 동시에 10만개의 요청이 들어왔을때, 쓰레드가 10만개가 생성될까?
멀티 쓰레드는 다음과 같은 단점이 있다.
쓰레드를 생성하는 비용이 크다
CPU level에서 context switching 이 더 자주 일어나게 되면서, 성능 저하가 발생한다.
limit 을 걸어놓지 않으면 쓰레드가 무한정 생성되고, 물리적 성능 한계를 넘어서면 서버가 다운될 수 있다.
그래서 Tomcat에서는 Tread Pool 이라는 것을 관리한다.
Thread Pool 의 동작 과정은 다음과 같다.
일정 개수의 Thread를 미리 열어놓는다.
새로운 요청이 들어오면, 비어있는 Thread를 할당한다.
서블릿 객체를 통해 HttpRequest와 HttpResponse를 생성한다.
HttpRequst에 담긴 내용을 바탕으로, 작성된 로직을 수행한다
로직 수행 후, HttpResponse에 담고, 요청에 대한 응답을 보낸다.
Thread를 반납하고, 해당 Thread는 다음 요청을 기다린다.
그렇다면, 할당되어 있는 Thread를 모두 사용하면 어떤 일이 생길까?
이는 개발자가 다음과 같은 전략(strategy)을 선택할 수 있다.
요청을 queue에 담아놓고 대기
요청 거절
Tread pool 초기화
1. 실제 서버 성능 테스트하기 - 환경 구축
@Controller
public class ThreadTest {
//아무 로직 없는 테스트
@GetMapping("/nothing")
public ResponseEntity<Void> nothingController() {
return ResponseEntity.status(HttpStatus.OK).build();
}
//3초짜리 테스트
@GetMapping("/threeSeconds")
public ResponseEntity<Void> threeSecondsController() throws InterruptedException {
Thread.sleep(3000);
return ResponseEntity.status(HttpStatus.OK).build();
}
}