Spring/Test-Driven Develop

[Spring] 백엔드 부하 테스트 해보기 - nGrinder(with aws, jmeter)

민돌v 2022. 3. 14. 18:18

부하테스트 툴을 알아보면 nGrinder 와 jmeter 이 2가지가 주를 이루어 나온다.

jMeter


JMeter 는 아파치에서 만든 java 기반의 오픈소스로 오래된 테스트 툴중 하나입니다.

꽤 오래되었고, 그만큼 안정적이라고 합니다. 많은 기능이 존재하고 확장성이 용이하지만 GUI가 이뻐보이진 않았습니다.

  • 장점
    • 아파치에서 만든 오래된 툴 유명하고 자료가 많다
    • 다양한 프로토콜 지원
    • GUI, 이메일, DB, SSL 지원하는 기능과 플러그인이 많다
  • 단점
    • 모든 기능이 다 필요한가?
    • 결과는 리스너로 만들어 보는데 모니터링이 불편함
    • 스레드 기반이라 성능제약이 있다고 함

 

nGrinder


nGrinder 는 네이버에서 만든 오픈 소스입니다.

GUI도 보기 편해보였고, 비교적 사용하기 편하다고 합니다.. 고로! nGrinder를 사용보기로 했습니다,

  • 장점
    • 설치만 하면 사용하기 쉬움
    • 예약, 모니터링, ramp up, 스크립트 기능 지원
    • docker에서 사용 가능
  • 단점
    • agent와 controller를 각자 실행해야됨
    • controller가 tomcat 필요함 tomcat이 싫다면 docker를 사용하는 것도 방법
    • Thread 기반으로 구현되어 있어 성능과 동시성에 대해 제한이 있다고 함 (grinder)

 


nGrinder 시작 가이드


1. nGrinder war 파일 다운

https://github.com/naver/ngrinder/releases

 

Releases · naver/ngrinder

enterprise level performance testing solution. Contribute to naver/ngrinder development by creating an account on GitHub.

github.com

 


2. war 파일 실행하기

  • cmd 혹은 git bash 에서, war 파일이 있는 위치에서 파일 실행
  • war 파일 직접 다운로드 & wget 명령어로 다운 2가지 방법이 있습니다.
  • port 번호는 사용자가 직접 설정해줄 수 있습니다.
  • 사용자가 설정한 포트로 들어가면, nGrinder admin에 접속할 수 있습니다.
    • (Admin Web을 서비스할 포트를 8300 지정, 얼마든지 변경 가능)
//war 파일 명렁어 다운
$ wget https://github.com/naver/ngrinder/releases/download/ngrinder-3.5.3-20201127/ngrinder-controller-3.5.3.war

//java 다운 확인
$ java -version

//war 파일 실행
$ java -jar ngrinder-controller-3.5.3.war --port=8300

ngrinder war 정상 실행 

 

nGrinder local 접속

 


3. nGrinder Admin Web 접속 & 보안 강화

  • 최초 접속 정보는 ID: admin, Password: admin입니다.
  • nGrinder Admin Web > admin > User Management 클릭합니다.
  • admin 이외 불필요한 계정은 모두 삭제합니다. (보안을 위해)
  • admin 클릭 후 "Change Password" 클릭하고 안전한 비밀번호로 변경합니다

 


4. 부하 스크립트 작성

  • nGrinder Admin Web > Script > "+Create" > Create a script 클릭합니다.
  • Script종류: Groovy, Script이름: MyScript01
  • URL to be tested: GET, Type URL: https://www.google.com/
  • URL은 구글페이지로 테스트해보겠습니다. (예시 - 얼마든지 변경 가능)

admin domain -> 스크립트
nGrinder 스크립트 만들기

스크립트가 생성되면 수정 후(할게있으면) 저장/닫기 하면 됩니다.

나이스!하게 잘 만들어졌다

 


5. 에이전트 다운로드 및 실행

  • nGrinder Admin Web > admin > Download Agent 클릭하여 에이전트 파일을 다운로드합니다.
 
// 또는 아래와 같이 서버:포트/agent/download/ngrinder-agent-{버전}-{서버}.tar 파일 입력하여 다운로드 
$ wget http://localhost:8300/agent/download/ngrinder-agent-3.5.3-localhost.tar

// 압축을 풉니다. 
$ tar -xvf ngrinder-agent-3.5.3-localhost.tar

// 압축이 풀린 에이전트 폴더로 이동합니다 
$ cd ngrinder-agent​

// 압축이 풀린 에이전트 폴더로 이동합니다
$ cd ngrinder-agent
 

ngrinder-agent 폴더에 __agent.conf 파일과 run_agent.sh (또는 run_agent_bg.sh) 중요합니다.

 
// __agent.conf 파일에 컨트롤러의 호스트명과 포트가 포함되어 있음을 알 수 있습니다. 
$ cat __agent.conf | grep agent.controller agent.controller_host=localhost agent.controller_port=16001

$ ./run_agent.sh 
// 또는 백그라운드 모드로 실행할 때 $ ./run_agent_bg.sh

 

 

Error: Could not find or load main class org.ngrinder.NGrinderAgentStarter
Caused by: java.lang.ClassNotFoundException: org.ngrinder.NGrinderAgentStarter

왜왜왜왜왜왜왜왜왜?

근데 에러가 나서, 왜그러나 봤더니 nGrinder는 Controller와 agent를 따로따로 실행해줘야하는데

Controller 실행시 tomcat이 필요하다, 나는 tomcat을 다운받아놓지 않아서 나는 에러인거 같다는 생각이들어, docker로도 할 수 있다고 하길래, docker를 controller로 다운받아서 해결을 시도해보았다.

 

+

2~3일 가량의 시간을 썻지만,, 해결하지 못했다. 

다른 방향으로 우회에서 AWS EC2를 이용해 cotroller와 agent를 올려서 실행했다

AWS ngrinder 올리기 참고

 

nGrinder 환경을 AWS상에서 구축하기

이 문서의 목적은 AWS상에서 nGrinder를 빠르고 쉽게 설치하는 것을 안내하기 위한 문서입니다. 제 시행착오를 반영하여서 최대한 자세하게 정리 작성하려고 노력했습니다.

velog.io

 

ERROR agent controller: Error while connecting to agent controller server at

다음과 같은 에러가 나온다면, Controller  ec2 인바운드 규칙에 16001 포트가 열려있는지 확인해보자 !!

 

정상적으로 agent가 controller에 접속이된다면 agent management에 다음과 같은 agent 접속을 확인할수 있다 ㅠㅠ

ㅠㅠㅠ agent 올리셔 성공하면 이런 화면

 

 


 

6. 부하 테스트 작성 및 실행

1) nGrinder 홈화면에서 테스트하고자 하는 도메인스크립트 타입을 선택합니다!

 

2) 에이전트별 가상 사용자(vuser) 동시에 접속하는 가상 사용자의 숫자입니다.

  • vuser = agent x process x thread

 

  • Agent: Agent수, Controller에 연결승인된 수만큼까지만 지정할 수 있다.
  • Vuser per agent: Agent당 가상 유저수, Process와 Thread로 구성한다.
  • Script: 테스트할 스크립트
  • Target Host: 테스트 대상 호스트
  • Duration: 테스트할 시간
  • Run Count: 테스트 실행 횟수(각 Thread당으로 전체 실행 횟수는 Vuser per agent를 곱한 값이다)
  • Enable Ramp-Up: 트래픽을 서서히 증가하게하는 설정

 

 

 

vuser = 99로 실행

성공..!

 

nGrinder 성능지표(TPS 그래프)

1) Throughput 은 시간당 처리량을 의미하고 TPS(Transaction per seconds), RPS(Request per seconds) 와 같은 세부항목이 있다. 이러한 수치들은 해당 서비스가 1초당 어느정도의 작업을 처리할 수 있는지 나타내기 때문에 높은 수치일수록 성능이 좋다고 말할 수 있다.

 

2) Latency 는 지연시간을 의미하고 이는 시스템이 클라이언트로부터 Request 를 받아서 Response 를 보내주기까지 걸리는 시간을 의미한다. 말 그대로 특정 작업을 얼마나 빨리 처리할 수 있는지 나타내는 성능 지표이다Latency 는 당연히 낮은게 더 빨리 응답한 것이기 때문에 낮은 수치일수록 성능이 좋다고 말할 수 있다.

 

 

 

후,, 어찌저찌 성공은 했다만,

진정한 테스트를 해보진 않았다. ec2의 서버 크기가 작으면 테스트 사용자수가 늘어났을 때 감당이 되지않아 agent 서버가 죽는다고도 한다.

 

일단 내가 개발하고 도메인을 올린 부분을 테스트해보고 성능개선까지 이어가보자..!


참고

서버 퍼포먼스 테스트 툴 비교 : https://tech.madup.com/performance_test_tool/

nGrinder 사용법 : https://blog.naver.com/wideeyed/222173944239

docker로 ngrinder 접속 : https://danidani-de.tistory.com/40