[스마일게이트 서버캠프] 20200202 nGrinder를 이용한 테스트

Dayeon myeong·2021년 1월 30일
2

합격하소서

목록 보기
7/7

설치

설치 방법은 아래 링크에 자세히 나와있습니다.
window에서 nGrinder 설치 및 실행

  1. java -XX:MaxPermSize=200m -jar ngrinder-controller-3.4.1.war -p 7777
  2. http://127.0.0.1:7777 (초기 아이디, 비번 admin/admin)
  3. Agent 다운 후 run_agent.bat 실행(윈도우 기준)
  4. 스크립트 생성 후 테스팅

성능 테스트 정의

서비스 및 서비스 시스템의 성능을 확인하기 위해 실사용 환경과 비슷한 환경에서 테스트를 진행하는 것입니다.

성능 테스트 종류

  • Stress 테스트 : 로드 상황에서 크래시 등의 문제점 확인, 부하를 순차적으로 증가시키면서 비정상 상태가 발생하는 임계점을 찾아 이를 바탕으로 성능 이슈에 대한 튜닝과 테스트를 반복합니다.

  • Load 테스트 : 로드 상황에서 성능 특성 파악, 임계값 이상의 요청이나 비정상적 요청을 보내 비정상적인 상황의 처리 상태를 확인하고 시스템의 최고 성능 한계를 측정하기 위한 테스트를 의미합니다.

  • Spike 테스트

  • Stability 테스트 / Soak 테스트

성능 테스트 용어

  • 트랜잭션 : 일정한 단위, 주로 업무/기능별로 트랜잭션을 정의합니다. 웹 어플리케이션에서는 주로 화면 조작을 통한 요청과 그에 대한 응답 화면을 하나의 트랜잭션으로 정의하여 사용합니다.

  • TPS(Transaction Per Second / 초당 처리량) : 1초에 처리할 수 있는 트랜잭션의 수를 나타내며, 성능 테스트의 가장 중요한 지표로 사용됩니다. 예를 들면, 성능 테스트 결과 30TPS가 나오면 1초에 30개의 트랜잭션을 처리할 수 있다는 의미입니다.

  • 응답시간 : 사용자가 요청을 보낸 시점부터 처리 결과가 사용자 PC의 화면에 보여질 때까지의 시간을 의미합니다. 사용자가 서버에 요청을 한 시간에서 부터, 응답을 받을 때 까지의 모든 시간을 포함하며, 이 응답시간은 내부적으로 다음과 같이 조금 더 세분하게 분리됩니다.

  • Network Time (또는 Latency time). 서버에 요청을 했을때, Request를 보내고 받을 때 소요되는 네트워크 시간을 의미합니다.

  • Transaction Time : 서버에서 실제 트렉젝션이 처리되는 시간을 의미합니다.

  • Think Time : 사용자가 요청에 대해서 응답을 받은 후에, 웹페이지를 보거나 화면을 보는 등의 작업을 하는 시간의 의미합니다.

예를 들어 보면 한국의 사용자가 미국이 페이스북을 사용한다고 했을때, 사용자가 웹 브라우져에서 클릭을 하면, 요청이 서버로 도달할때 까지 걸리는 시간 Network time (Request), 서버가 요청을 받아서 처리를 하고, 응답을 하는 시간 (Transaction Time), 그리고 그 응답이 사용자의 브라우져 까지 도착하는 시간이 Network time (Response) 이다. 이 전체 시간을 합친 것이 Response Time이 됩니다.

응답을 받은 후에는 사용자가 페이스북 내용을 보는데 소요 되는 시간이 Think Time이 됩니다.

Think Time 까지 포함하여 다음 요청이 발생하기 까지의 전체 시간을 Request Interval라고 합니다..

성능 테스트 목적

성능 테스트는 일반적으로 시스템 개발 종료시점에 수행하며, 응답시간과 처리량, 병목구간 등을 실제 서비스 전에 확인하여 서비스나 서비스 시스템의 문제점을 개선하는데 주로 목적을 가집니다.

nGrinder란?

개발된 기기나 프로그램이 서비스에 들어가기 앞서 실제와 유사한 부하를 걸어 정상 동작 여부와 견딜 수 있는 부하, 문제점등을 확인하기 위한 시험.

대부분의 경우 실제 부하의 지속적인 발생이 어려워 실제와 유사한 모의 부하 발생기를 사용하여 시행되며, 경우에 따라서는 실제 부하 이상의 스트레스를 가하는 과부하 시험도 시행됩니다.[TTA용어 사전]

nGrinder 아키텍쳐

아키텍쳐 이미지

  • Controller : 성능 테스트를 위해 웹 인터페이스를 제공하며, 테스트 프로세스를 조정할 수 있습니다. 또한, 테스트 결과를 수집하여 통계로 나타내는 역할도 합니다.

  • Agent : Controller의 명령을 받아 실행합니다. 테스트 스크립트를 수행하는 Worker 개념으로 Target이 되는 머신에 프로세스와 스레드를 실행시켜 부하를 발생시키는 역할을 합니다.

  • Target : 테스트 대상이 될 서버입니다.

부하 발생 설정

설정 이미지

1 Agent : 일을 하는 물리 장비 , Controller와 연결되어 있는 에이전트의 수만큼 사용가능합니다.

2 Vuser 개수 : Enter를 누르는 가상유저, 사용자가 해당 주소로 부하를 걸 스크립트를 보여줍니다.

3 RHEAD : 선택된 스크립트의 내용을 보여주는 페이지로 이동합니다.

4 테스트 대상서버 : 테스트 진행할 서버의 리스트를 보여주며, 추가 버튼 클릭 시 테스트 받을 서버를 늘릴 수 있습니다.

5 테스트 기간 : 해당 테스트를 얼마만큼 실행할 지 설정하는 항목입니다.

6 실행 횟수 : 사용자가 설정한 쓰레드당 몇번의 테스트를 실행할 것인지를 지정합니다.

7 Ramp_Up : 점차 부하를 가할 수 있는 기능입니다. 부하를 가할 때, 가상 사용자 수를 늘리는 것이 아닌 process나 thread를 늘립니다.

8 초기 개수 : 처음 시작 시 가상사용자의 수를 설정합니다.

9 초기 대기시간 : 테스트를 언제부터 실행시킬 지 설정합니다.

10 증가 단위 : 해당 process/thread를 몇 개씩 증가시킬지를 설정합니다.

11 Ramp_Up 주기 : 설정한 것들의 상승 시간을 설정합니다.

시나리오 스크립트

모니터링 대상 장비

테스트 시간 : (Duration - Process의 시간 OR Count)

그 외 변수 설정, Path 등록 등

Vuser

Vuser

process threadAgent = vuser 이며, 되도록이면 Thread를 많이 지정하는 게 좋다.

자소설닷컴 테스트

합격하소서 프로젝트는 자소설닷컴 클론 프로젝트로써 실제로 자소설닷컴의 성능이 얼마정도인지 확인하기 위해 nGrinder를 이용하여 테스트해보겠습니다

부하 설정

  • Agent : 1

  • Vuser : 99

  • Run Count(스레드당 실행단위) : 2000

  • Total Run Count : 2000* 99 = 198000

jasoseol_ngrinder

스크립트 설정

스크립트는 기본 nGrinder에서 제공하는 groovy 스크립트로 테스트를 진행하였습니다.

import static net.grinder.script.Grinder.grinder
import static org.junit.Assert.*
import static org.hamcrest.Matchers.*
import net.grinder.plugin.http.HTTPRequest
import net.grinder.plugin.http.HTTPPluginControl
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 java.util.Date
import java.util.List
import java.util.ArrayList

import HTTPClient.Cookie
import HTTPClient.CookieModule
import HTTPClient.HTTPResponse
import HTTPClient.NVPair

/**
 * 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 NVPair[] headers = []
	public static NVPair[] params = []
	public static Cookie[] cookies = []

	@BeforeProcess
	public static void beforeProcess() {
		HTTPPluginControl.getConnectionDefaults().timeout = 6000
		test = new GTest(1, "jasoseol.com")
		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)
		cookies.each { CookieModule.addCookie(it, HTTPPluginControl.getThreadHTTPClientContext()) }
		grinder.logger.info("before thread. init headers and cookies");
	}

	@Test
	public void test(){
		HTTPResponse result = request.GET("https://jasoseol.com/recruit", params)

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

결과

jasoseol_result

평균 TPS : 71.1

최고 TPS : 107

평균 TEST 시간 : 1369

성공 개수 197779 / 198000

ERROR 개수 : 221 / 198000

profile
부족함을 당당히 마주하는 용기

0개의 댓글