진짜 개발자
본문 바로가기

Infra/서버 운영

서버운영 - Spring Boot 부하 테스트(Jmeter, 동시접속확인)

728x90

시나리오

Server : Spring Boot , JPA 

DB : AWS RDS(t2.micro : 1CPU, 1Memory) 


- 4000명의 사용자(스레드)가 동시에 3계층 웹어플리케이션에 요청을 한다

  점차 스레드 수와 최대 세션수를 늘려가며 동시 4000명의 사용자에 대한 응답처리를 할 수 있는 환경을 구축하는 것을 목표로 한다.



참고

close, time_wait - https://brunch.co.kr/@springboot/98


1차

Spring Boot 설정

spring dbcp 설정 : https://www.baeldung.com/spring-boot-tomcat-connection-pool


Port : 8082

Max Connection : 10000 (최대 연결 수로 세션이 해제되는 시간을 가지는 세션도 있으므로 넉넉히 설정)

Max Thread : 200


Jmeter

Thread(동시 접속자) : 10개

Ramp-up : 0

Loop : Infinite


동시접속 확인

- cmd 실행시 관리자 권한 실행 요함


1. 배치파일 생성

- 아래의 구문을 담은 tets.bat파일을 생성

netstat -ano | find /c "8082"  (8082 port에 연결된 세션 수를 출력)

timeout 2  (2초를 sleep)


2. 배치파일 실행

- bat파일이 위치한 곳에서 아래 구문 실행

FOR /L %x IN (1,1,100) DO test.bat


3. 연결중인 세션 확인 (TCPViewr)



에러

1. Address already in use :connect (해결: https://www.baselogic.com/2011/11/23/solved-java-net-bindexception-address-use-connect-issue-windows/)

- Jmeter를 이용해 Thread를 200개로 지정하여 SpringBoot Server에 무한한 요청을 해보았다

   처음의 응답은 정상적이었으나 2분 정도가 지난 시점 부터 아래 그림과 같이 에러가 나타났다


예측  

1) RDS 지연

- RDS 요청에 대한 지연이 발생하여 SpringBoot에 Connection이 모두 끝나지 않은 상태에서 계속해서 요청이 되어

  Already in use가 나타난다고 예측


2) Spring Boot의 Embeded Tomcat 설정문제

- 내장 톰캣서버의 설정 문제로 인해 일정 수 이상의 연결이 수립이 안될것이라고 생각


원인파악

1) RDS Connection Limit

- rds의 instance 유형별 Max Connection 수의 제한이 있다고 하여 그것이 문제라고 예측  

  필자가 사용하는 t2.micro 유형의 최대 Connection 수는 66이였고 RDS 모니터링에 나타나는

  연결 수가 10개 안팎에서 증가 하지않으므로 이것이 문제는 아니라고 판단

  


=> 1. 10개 안팎으로 SpringBoot Server에서 Connection pool이 제한되어있다

     


2) RDS 지연

- RDS Instance의 리전이 Mumbai에 있어 네트워크 지연이 발생하여 Jmeter의 10개의 요청에 대한

  응답이 늦게 도착하여 더 많은 수의 연결을 하지 않는다고 예측하여 Seoul Region에 새로운 

   RDS Instance를 생성.


  지연 시간이 확연하게 줄어들긴 했지만 역시나 요청 개수는 10개 안팎이며 같은 에러가 발생          


  


3) Spring Boot의 Embeded Tomcat 설정문제

    Python을 이용한 요청

- SpringBoot의 Embeded Tomcat 설정 문제로 가정하고

   python을 이용하여 요청한 결과 RDS 유형에 따른 Connection Limit까지 연결 수가 증가했다


    Spring Boot를 이용한 요청

- Spring Boot의 Tomcat 설정문제인지 확인하기 위해 Python과 같은 환경을 만들어 테스트한 결과

   Spring Boot의 요청 또한 Connection Limit까지 연결 수가 증가했다.


UserPort


2. RDS 모니터링시 요청 수가 10개 에서 늘어나지 않음

요청하는 스레드(동시접속자는) 200명이지만 RDS에 연결된 개수가 10개 이하였다.


예측

1) RDS Connection Limit

- AWS의 RDS에서 자체적으로 제한하고 있는 Connection Limit으로 인해 연결 수가 증가하지 않는다고 예측


결과