nGrinder 설치와 사용법

Jeonghwa·2024년 3월 25일
4
post-thumbnail

nGrinder란?

https://naver.github.io/ngrinder/

nGrinder는 네이버에서 개발한 Enterpise 레벨 Java기반 성능 테스트 도구입니다.

Agent가 반드시 필요하며, Controller는 이를 조종하는 역할을 합니다. 분산 테스트/Web UI/Multi Tenancy 지원하고 Groovy/Jyshon으로 테스트 스크립트를 작성할 수 있습니다.

장점으로는 트랜잭션을 자유롭게 정의할 수 있으며(여러 요청을 하나의 Test로 묶을 수 있음) 스크립트 버전을 관리할 수 있고 실행한 테스트의 결과 또한 자동으로 저장 및 관리할 수 있습니다.

아키텍처는 아래와 같습니다.

  • Controller : 부하테스트를 위한 스크립트 관리 / Agent 제어
  • Agent : 스크립트 실행
  • Monitor : 타켓 서버의 성능 측정 (거의 사용되지 않음)

이제 설치를 해봅시다.

설치

  1. 아래 명령어를 통해 Controller를 설치해줍니다.
# NGrinder 다운로드
wget https://github.com/naver/ngrinder/releases/download/ngrinder-3.5.9-20230227/ngrinder-controller-3.5.9.war

# JAVA11로만 실행 가능
java -Djava.io.tmpdir=/Users/heojeonghwa/ngrinder/lib -jar ngrinder-controller-3.5.9.war --port 7070

/Users/heojeonghwa/ngrinder = ngrinder-controller.war 파일이 존재하는 디렉토리

  1. localhost:7070에 접속하여 초기 ID/Password(admin/admin)를 입력합니다.

  2. Agent를 다운받아 압축을 출어주고 cmd 창으로 접근하여 agent를 실행해 줍니다.

# Agent쉘스크립트 파일 실행
./run_agent.sh 

# Agent 백그라운드 실행
./run_agent_bg.sh


4. Controller 화면으로 돌아가서 Agent Management를 확인합니다.

Agent가 잘 실행되고 있는지 확인할 수 있습니다.

스크립트 작성

  1. Script 탭을 클릭하면 groovy로 테스트 스크립트를 작성할 수 있습니다.

만약 에러가 나면서 Script탭이 열리지 않는다면 Controller 및 Agent를 내린 후 .nGrinder 폴더 삭제 후 다시 기동이 필요합니다.

sudo rm -r .ngrinder

참고 : https://github.com/naver/ngrinder/discussions/968

  1. 새로운 script를 만들어봅시다. 저는 제가 진행하고 있는 사이드프로젝트 api를 테스트하겠습니다.

  1. 아래와 같이 스크립트가 만들어지며, 경우에 따라 요청 메세지에 들어가는 헤더, 파라미터 등을 수정할 수 있습니다.
import static net.grinder.script.Grinder.grinder
import static org.junit.Assert.*
import static org.hamcrest.Matchers.*
import net.grinder.script.GTest
import net.grinder.script.Grinder
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
// import static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith

import org.ngrinder.http.HTTPRequest
import org.ngrinder.http.HTTPRequestControl
import org.ngrinder.http.HTTPResponse
import org.ngrinder.http.cookie.Cookie
import org.ngrinder.http.cookie.CookieManager

/**
* A simple example using the HTTP plugin that shows the retrieval of a single page via HTTP.
*
* This script is automatically generated by ngrinder.
*
* @author admin
*/
@RunWith(GrinderRunner)
class TestRunner {

	public static GTest test
	public static HTTPRequest request
	public static Map<String, String> headers = [:]
	public static Map<String, Object> params = [:]
	public static List<Cookie> cookies = []

	@BeforeProcess
	public static void beforeProcess() {
		HTTPRequestControl.setConnectionTimeout(300000)
		test = new GTest(1, "101.101.217.190")
		request = new HTTPRequest()
		grinder.logger.info("before process.")
	}

	@BeforeThread
	public void beforeThread() {
		test.record(this, "test")
		grinder.statistics.delayReports = true
		grinder.logger.info("before thread.")
	}

	@Before
	public void before() {
		request.setHeaders(headers)
		CookieManager.addCookies(cookies)
		grinder.logger.info("before. init headers and cookies")
	}

	@Test
	public void test() {
		HTTPResponse response = request.GET("http://101.101.217.190:8080/api/v1/spaces", params)

		if (response.statusCode == 301 || response.statusCode == 302) {
			grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", response.statusCode)
		} else {
			assertThat(response.statusCode, is(200))
		}
	}
}

  • @BeforeThread test.record(this, "test") 안에 "test"는 (@Test가 붙은)테스트 메서드 이름을 가리킵니다.
  • 저는 params가 필요하여 "key":"value" 형식으로 작성해주었습니다.
  1. validate를 눌러주면 스크립트가 제대로 동작하는지 확인할 수 있습니다.
             Tests        Errors       Mean Test    Test Time    TPS          Mean         Response     Response     Mean time to Mean time to Mean time to 
                                       Time (ms)    Standard                  response     bytes per    errors       resolve host establish    first byte   
                                                    Deviation                 length       second                                 connection                
                                                    (ms)                                                                                                    

Test 1       1            0            1691.00      0.00         0.59         315.00       185.19       0            0.00         17.00        1650.00       "101.101.217.190"

Totals       1            0            1691.00      0.00         0.59         315.00       185.19       0            0.00         17.00        1650.00      

부하테스트 실행

  1. Performance Test 탭으로 넘어가서 새로운 Test를 만들어 줍니다.

각 항목에 대해서 설명하자면 아래와 같습니다.

  • Agent : 성능 측정에 사용할 Agent
    • 일반적인 로컬에서 테스트를 실행할 경우 1이 고정값
  • Vuser per agent : 프로세스 * 스레드수 = agent당 가상 사용자수
  • Process / Thread : 하나의 Agent에서 생성할 프로세스와 스레드 개수
  • Script : 성능 측정 시 각 Agent 에서 실행할 스크립트
  • Duration : 성능 측정 수행 시간
  • Run Count : 스레드 당 테스트 코드를 수행하는 횟수
    • Run Count와 Duration 둘 중 하나만 선택해서 기간 동안 실행하거나, Run Count 만큼 실행
  • Enable Ramp-up : 성능 측정 과정에서 Process 또는 Thread를 점진적으로 늘리도록 활성화 가능
  • Initial Count : 처음 시작하는 Process 또는 Thread 개수
  • Initial Sleep Time : 테스트 시작 시간
  • Incremental Step : Process 또는 thread 를 증가시키는 개수
  • Interval : Process 또는 Thread를 증가시키는 시간 간격
  1. Save and Start 버튼을 눌러서 실행하면 아래와 같은 결과를 볼 수 있습니다.

평균적인 TPS(초당 처리할 수 있는 트랜잭션 수)Mean Test Time(평균 테스트 시간)을 볼 수 있습니다.

또한 Logs를 클릭하면 로그파일을 조회하거나 다운로드도 가능합니다.

더 자세한 레포트가 보고싶다면 Detailed Report를 통해 조회 가능합니다.


참고: https://liltdevs.tistory.com/169?category=1084276

profile
backend-developer🔥

0개의 댓글

관련 채용 정보