nGrinder 적용기 - 1

일상 회고록·2024년 2월 26일
0
post-thumbnail
post-custom-banner

안녕하세요!

전의 성능테스트 종류에 대해 알아본 포스트 이후 실제로 제가 만든 프로젝트의 성능테스트를 진행해보려고 합니다.

여러 성능 테스트 도구들 중 접근성이 좋고, 사람들의 많은 피드백이 있는 nGrinder 를 적용해보려고 합니다.

내용이 조금 길어질 것 같아서 이번 포스트에서는 설치 및 설정, 간단한 테스트까지의 내용을 작성할 계획입니다!

(본편이 궁금하신 분들은 2탄으로 바로 넘어가셔도 좋을 것 같습니다!)

새로운 도구를 사용하게 되면 모든 개발자들이 그렇듯 설치 과정과 설정과정에서 요상한 에러들을 마주치게 되는데요.

저도 예외는 아니었습니다,,(오열)

이러한 회고를 작성하는 이유 중 하나는 다른 개발자분들에게 조금이나마 도움이 될까 하여 처음부터 기록해봅니다.

그럼 시작하겠습니다!

1. nGrinder 설치

먼저 첫단계인 설치부터 가보겠습니다.

ngrinder의 경우 네이버에서 만든 오픈소스이기 때문에 아래의 주소에서 쉽게 다운 받으실 수 있습니다.

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

(글 작성 기준 가장 최신 버전인 3.5.8으로 진행했습니다!)

다운로드가 완료되면 해당 .war 파일이 들어있는 폴더에서 실행시켜주면 됩니다.

# version에 다운 받은 버전을 적어주시면 됩니다.
java -jar ngrinder-controller-{version}.war --port=8300

그렇다면 아마 아래와 같은 에러 하나를 받게될 가능성이 매우매우 높은데요
Please set `java.io.tmpdir` property like following. tmpdir should be different from the OS default tmpdir.
`java -Djava.io.tmpdir=${NGRINDER_HOME}/lib -jar ngrinder-controller.war`

해당 에러는 nGrinder 실행 시 필요한 임시 파일의 저장 경로를 명시하지 않아서 발생하는 에러입니다.

따라서 임시 파일이 생성될 위치만 적어준다면 해결됩니다!

저는 아래와 같이 설정한 뒤 실행해주었습니다.

java -Djava.io.tmpdir=/Users/kh/ngrinder/lib -jar ngrinder-controller-3.5.6.war --port=8300

이후 아래와 같은 문구가 나오면서 주루루루룩 내려가게 되는데요


여기서 아마 운이 좋다면 바로 실행이 되실 수 있고, 아니라면 아래와 같은 IP 관련 에러를 마주치게 됩니다. (욕설)
'Please check the `/etc/hosts` file or manually specify the local IP address in `${NGRINDER_HOME}/system.conf`.

당황하지 마세요 위 에러의 해결 방법은 명확합니다

먼저 ifconfig | grep “inet” 을 통해 본인의 local IP 주소를 알아냅니다 (127.0.0.1 이 아닌 다른 IP가 하나 더 있을 거에요)

해당 IP를 잘 기억해둔 후 아래와 같이 해당 폴더로 이동합니다

cd /users/{사용자 이름}/.ngrinder

이동한 후 안에 들어있는 파일들을 살펴보면 `system.conf` 라는 파일이 하나 있습니다
vim system.conf

해당 칸에 앞서 기억해두었던 IP 주소를 입력한 후 저장하면 완료입니다.


이후 다시 nGrinder를 실행해보면 주르르르륵 내려간 후 정상적으로 실행이 됩니다.

실행된 후 https://localhost:8300 을 주소창에 입력하면 아래와 같은 메인 화면이 나옵니다!

(아이디, 비밀번호 모두 admin)

여기까지 잘 따라오셨다면 70%정도 완성입니다. 후 쉽지않네요

2. Agent 설치

다음은 nGrinder 에 필수적인 Agent 설치입니다.

아래와 같이 nGrinder 메인 화면 오른쪽 상단을 눌러보면 ‘에이전트 다운로드’가 있습니다.

이걸 눌러주면 자동으로 Agent 설치가 완료됩니다.


이후 설치된 파일의 압축을 풀어주어야합니다.
# 압축 풀기
tar -xvf ngrinder-agent-{version}-localhost.tar

그대로 Agent를 실행하게 되면 아래와 같은 에러를 마주할 수 있습니다.
ERROR agent controller: Error while connecting to agent controller server at /127.0.0.1:16001

해당 에러는 agent가 controller에 접근할 때 기본적으로 localhost로 시도하기 때문에 저희가 설정한 local IP와 맞지 않아서 생기는 문제입니다.

따라서 agent 또한 local IP로 설정해주면 해결됩니다.

압축이 풀린 ngrinder-agent 폴더에 가면 __agent.conf 라는 파일이 하나 있습니다.

vim __agent.conf

해당 칸에 local IP 주소를 입력해준 후 저장합니다.


이후 아래와 같이 Agent를 실행해보면
./run_agent.sh

위와같이 ‘에이전트 관리’ 탭에서 잘 연결된 것을 확인할 수 있습니다! 짝짝짝

이제 설치와 설정 모두 완료되었습니다!

이제는 성능 테스트를 위한 스크립트만 작성하면 마무리입니다.

3. 스크립트 작성

nGrinder는 성능 테스트 중에서 부하테스트 용으로 주로 쓰이게 되는데요.

어떤 기능을 테스트할 지 알려주기 위해서 스크립트라는 걸 작성합니다.

메인 화면 위에 보면 스트립트 버튼이 있고, 그걸 누른 뒤 새로운 스크립트를 생성해보면 기본으로 작성되어 있는 템플릿이 제공됩니다.

언뜻 보면 자바 같지만, 스크립트는 Groovy 로 작성됩니다 (자바와 굉장히 유사합니다)


저는 전체 10개의 게시물 중 사용자가 특정 게시물을 조회하는 스크립트를 작성해보았습니다.
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, "post test")
		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() {
		def idList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
		Random random = new Random()
		int id = idList[random.nextInt(idList.size())]
		params = ["projectId" : String.valueOf(id)]
		
		//게시물 조회 API
		HTTPResponse response = request.GET("http://localhost:8080/project/one", 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))
		}
	}
}

Groovy를 모르셔도 구글링을 통해 쉽게 작성하실 수 있습니다.

스크립트를 완성하면 오른쪽 상단에 ‘검증’ 버튼이 있습니다.

작성한 스크립트가 오류없이 잘 작성되었는지 확인해주는 기능입니다.

여기서 또 운이 없으시다면 에러하나를 마주하게 되는데요,,

Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 61

해당 에러는 자바17 버전이 호환되지 않아 발생하는 에러입니다.

해결방법은 두가지가 있습니다.

  • 자바 11로 버전 바꾸기
  • nGrinder-3.5.6으로 재설치 후 실행

저는 첫번째 방법으로 해결되지 않아서 두번째 방법으로 해결했습니다

이제 진짜 테스트할 일만 남았습니다!

4. 성능 테스트 실행

메인화면 상단에 ‘성능 테스트’ 버튼을 클릭하고, 테스트 생성을 누르면 아래와 같은 화면이 나옵니다.

빨간색 네모에 있는 변수들만 설정해주면 되는데요

먼저 에이전트의 경우 현재 연결한 에이전트가 1개이므로 최대 1로 설정이 가능합니다.

가상 사용자의 경우 동시 몇 명의 사용자를 통해 기능을 테스트할 건지 설정해주는 변수입니다. (프로세스와 스레드는 자동 설정됩니다)

이후 아까 작성한 스크립트를 연결해주고, 테스트 기간도 설정해줍니다 (기간은 길수록 유의미한 결과를 얻을 수 있다고 합니다)

저장 후 시작해보면!

위와같은 결과를 얻을 수 있습니다.

‘상세 보고서’를 클릭하면 더 자세한 정보들을 제공해줍니다.


자 이렇게 해서 nGrinder를 설치 후 원하는 기능의 부하테스트를 간단하게 진행해보았습니다.

다음 포스트에서는 테스트 시나리오를 작성한 뒤 좀 더 구체적으로 테스트를 진행해보도록 하겠습니다!

긴 글 읽어주셔서 감사합니다!



References

nGrinder 성능 테스트 도중 만난 에러들

nGrinder + Springboot 부하 테스트 튜토리얼

[TECH] 서버 API 성능개선기(1)

nGridner 소개와 설치 방법, 간단 테스트

profile
하고 싶은 것들이 많은 개발자입니다
post-custom-banner

0개의 댓글