Back-End/Spring

nGrinder를 활용한 어플리케이션 성능테스트

쩡류 2023. 1. 6. 16:59
728x90

nGrinder란?

 

네이버에서 The grinder라는 오픈소스를 참고하여 자바 언어를 기반으로 개발한 성능 측정 오픈소스이다.

 

 


nGrinder에서 사용되는 용어들

 

 

Controller

 

  • 부하 테스트를 위한 GUI를 제공한다.
  • 부하 테스트를 모니터링 할 수 있다.

 

Agent

 

  • Controller가 전달한 script를 기반으로 target 서버에 부하를 발생시킨다.
  • 각 Agent마다 사용 할 Process 및 Thread를 선택할 수 있다.
    • 만약 2개의 프로세스와 4개의 스레드를 사용한다면, agent당 vUser의 수는 8이 된다.
    • nGrinder 공식 위키에 따르면, single 4GB 미만의 메모리 및 2개의 CPU core를 사용한다면 프로세스의 개수를 10개 이하로 사용하기를 권장한다고 한다.(쓰레싱이 발생할 수 있기 때문) 마찬가지로, 쓰레드 갯수도 200개를 넘기지 않기를 권장한다.(heap 메모리 공유에 다른 OOM 문제 발생 위험)

 

Target Server

 

  • 테스트를 진행 할 대상 서버이다.

 


 

nGrinder의 Architecture

 

 

먼저, Controller가 console과 현재 connection을 갖고 있는 agent를 활용하여 스크립트를 agent에게 분배한다.

 

해당 스크립트에는 vUser(서비스를 사용하고 있는 유저 수), processor, thread 등의 정보 및 수행해야 하는 코드가 groovy 언어 기반으로 작성된다.

 

테스트가 시작되면, agent들은 해당 script를 실행하여 target server로 request를 보내기 시작한다.

 

이와 동시에, controller는 target server를 모니터링하게 된다.

 

 


 

 

nGrinder 측정 수행

 

  • Controller와 agent 모두 동일한 서버(로컬PC)에서 수행
    • pc는 M1 Pro(10코어), 16GB 메모리
  • 1개의 agent 사용
  • api는 페이징 쿼리가 포함된 조회 api 

 

 

1. Vusers가 10(2개의 process, 각 5 쓰레드) 일 때

 

 

 

 

2. Vusers가 50(2개의 process, 각 25 쓰레드) 일 때

 

 

 

 

 

 

3. Vusers가 198(6개의 process, 각 33 쓰레드) 일 때

 

 

 

  • 평균 응답시간(MTT)이 1.5초가 나왔다. 따라서, Vuser의 수치를 더 낮추어 보기로 했다.

 

 

4. Vusers가 99(3개의 process, 각 33 쓰레드) 일 때

 

 

 

  • 평균 응답시간이 0.77초가 나왔다.
  • 따라서, 대략적으로 130명의 동시접속자가 있을 때, 1초 미만의 응답 처리가 가능할 것이라고 추측이 된다.

 

 


 

 

어떻게 하면 성능을 향상시킬 수 있을까

 

 

 

  • 해당 질문에 대한 답변은 너무나도 그 범위가 크고, 방법이 많기 때문에 몇 가지를 언급하면
    • 역시 가장 단순한 방법은, 서버의 scale up이라고 할 수 있다.
      • 사실 비교자체가 그렇긴 하지만.. 예시로 target 서버를 내 로컬 pc로 하고 성능을 측정했을 때 Vuser가 400일 때도 TPS가 900을 기록하였다.
    • scale out도 생각 해 볼 수 있다. 
      • 현재 사내 클라우드 서비스를 통해 dev존에서 테스트를 진행하고 있는데, 파드를 1개만 띄워서 사용을 하고 있다. 만약 레플리카셋을 통해 3개의 파드를 띄운다면 더 성능이 나아질 것이다.
        • 물론 이 경우 nginx를 활용한 로드밸런싱을 어떻게 설계할 지도 고려를 해야 한다.
    • 코드 리팩토링도 중요하다.
      • 기본적으로, 웹 서비스는 CUD보다 R과 관련된 요청이 압도적으로 많다고 한다. 따라서 테이블에 적절하게 인덱싱을 하거나, 코드 내적으로 fetch join과 같은 방법을 통해 성능을 최적화하는 것도 성능 향상에 도움이 된다고 생각된다. 
    • 쿼리 튜닝을 잘 하자
      • 예를 들어 db 접근 기술로 mybatis를 사용한다면, bulk insert(update)작업 진행 시 batch 모드를 활용해도 좋고, 적절하게 index를 걸거나 실행계획을 분석하여 인덱스가 잘 동작하는지, 안티패턴은 없는지 등을 체크하는 것 등이 중요하다고 생각한다.

 

 

 

Ref.

 

https://github.com/naver/ngrinder/wiki/User-Guide

 

GitHub - naver/ngrinder: enterprise level performance testing solution

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

github.com

 

https://jy-p.tistory.com/141

 

nGrinder 설치 (부하 테스트)

nGrinder란? nGrinder는 네이버에서 성능 측정 목적으로 jython(JVM위에서 파이썬이 동작)으로 개발 된 오픈소스 프로젝트이며, 2011년에 공개 하였습니다. 바닥부터 개발을 한 것이 아니라 The Grinder라는

jy-p.tistory.com