Open kgh2120 opened 9 months ago
성능 튜닝은 SW 응용 프로그램이나 웹 서비스의 성능을 최적화화기 위한 중요한 단계이다. NGrinder와 Apache JMeter는 성능 테스트 도구 중 하나로, 소프트웨어의 성능을 테스트하고 분석하는 데 사용된다. 이제부터 이에 대해 자세하게 알아보자.
Ngrinder
오픈 소스의 로드 테스팅 및 성능 테스트 도구로, Java 기반으로 만들어졌으며 대규모 분산 애플리케이션의 성능을 측정하는 데 사용된다.
Java 기반으로 만들어졌으므로 플랫폼에 종속적이지 않아 다양한 애플리케이션 및 웹 서비스를 대상으로 성능 테스트를 수행할 수 있으며 사용자 친화적인 대시보드를 통해 성능 데이터를 시각화하고 분석할 수 있다.
Ngrinder의 주요 특징은 아래와 같다.
NGrinder 성능 테스트 작업 실습
https://github.com/naver/ngrinder/wiki/Installation-Guide
https://github.com/naver/ngrinder/releases
일단 다운받자.
nGrinder
는 JDK8 또는 11에서 사용해야 한다. 나처럼 JAVA_HOME 시스템 환경 변수 설정을 안했다면 얼른 하고 오자. 바보바보 홍윤기바보 nGrinder
는 Controller
와 Agent
로 이루어져 있다.
✔️ Controller
├── 성능 측정을 위한 웹 인터페이스 제공
├── 테스트 프로세스 조정
├── 테스트 통계를 수집하고 표시
└── 스크립트 수정 기능 제공
✔️ Agent
├── 에이전트 모드에서 실행할 때 대상 시스템에 부하를 주는 프로세스 및 스레드를 실행
└── 모니터 모드에서 실행 시 대상 시스템 성능(CPU/메모리) 모니터링
초기 설정은 친절하게 설명해놓은 블로그가 많으니 넘어가겠다.
위 화면이 뜬다면 성공적으로 Controller를 띄운것이다.
본격적인 테스트에 앞서 몇가지 준비단계가 필요한다.
NGrinder 는 스크립트 언어로 Groovy를 지원한다. 친숙한 자바 기반 문법을 보면 마음이 편안해지고 스무스하게 코드를 볼 수 있을 것이다. +Create를 누르면 아래와 같은 스크립트가 자동 생성된다.
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
/**
@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
@BeforeProcess public static void beforeProcess() { HTTPRequestControl.setConnectionTimeout(300000) test = new GTest(1, "www.naver.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) CookieManager.addCookies(cookies) grinder.logger.info("before. init headers and cookies") }
@Test public void test() { HTTPResponse response = request.GET("https://www.naver.com/", 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))
}
} }
<html>
<body>
<!--StartFragment-->
애너테이션 | 설명 | 적용 메서드 형태 | 사용 예 |
---|---|---|---|
@BeforeProcess | 프로세스가 호출되기 전 처리할 동작 정의 | static method | 쓰레드가 공유할 자원을 로드한다.GTest 와 타겟에 대하여 테스트할 레코드를 설정한다. |
@AfterProcess | 프로세스가 종료되기 전 처리할 동작 정의 | static method | 리소스를 반납한다. |
@BeforeThread | 각 쓰레드가 실행되기 전 처리할 동작 정의 | member method | 타겟 시스템에 로그인한다.쿠키 핸들러와 같은 쓰레드 단위로 가질 데이터를 정의한다. |
@AfterThread | 각 쓰레드가 실행된 후 처리할 동작 정의 | member method | 타겟 시스템에서 로그아웃한다 |
@Before | 각각의 @Test 메서드가 수행되기 전 처리할 동작 정의 | member method | 테스트에 사용할 변수 세팅 |
@After | 각각의 @Test 메서드가 수행된 후 처리할 동작 정의 | member method | 잘 사용되지 않는다... |
@Test | 테스트할 동작 정의. 다중호출 됨 | member method | 테스트 |
👍 문제
성능을 튜닝하기 위해선, 현재 기능들의 성능을 알아야겠죠? 우리가 만든 기능들에 대한 성능을 알아보기 위한, 테스트 툴인 NGrinder와 JMeter에 대해서 간단하게 조사해보고, 사용법을 소개해주세요!
✈️ 선정 배경
p.420을 보면 운영 상황에서의 속도를 알기 위해선 부하 테스트 툴로 부하를 준 이후, 성능을 측정해봐야 한다고 한다. 그러니까 부하를 줘야겠지?
📺 관련 챕터 및 레퍼런스
story23. 튜닝의 절차는 그때그때 달라요.
🐳 비고
다들 2달간 고생했어~