nGrinder 성능 테스트 간편한 Docker compose 설치 7단계

nGnGrinder는 네이버에서 개발한 오픈 소스 성능 테스트 도구로 웹성능 테스트를 위한 간편한 Docker compose 설치 방법과 테스트 방법을 알아 봅시다.

준비 사항

docker, docker-compose 설치, 약간의 groovy

도커 설치 방법은 아래 사이트에서 설치 방법만 참고하세요!

Docker Jenkins 설치 아주 간단한 방법 2023 [docker-compose 사용]

성능 측정?


웹 애플리케이션의 성능 측정은 여러 중요한 이유로 인해 필수적입니다. 다음은 웹 애플리케이션의 성능을 측정해야 하는 주요 이유들입니다:

  1. 사용자 경험 최적화: 웹 애플리케이션의 반응 속도는 사용자 경험에 큰 영향을 미칩니다. 느린 로딩 시간은 사용자의 불만을 증가시키고, 사용자가 다른 대안을 찾아나서게 만듭니다. 빠르고 반응성 좋은 애플리케이션은 사용자 만족도를 높입니다.
  2. 비즈니스 목표 달성: 성능 문제는 웹사이트의 전환율, 장바구니 이탈률, 사용자 잔류 시간 등과 같은 주요 비즈니스 지표에 부정적인 영향을 미칠 수 있습니다. 특히 전자상거래와 같은 온라인 비즈니스에서는 빠른 응답 시간이 수익에 직접적인 영향을 줍니다.
  3. 스케일링 및 최적화 계획: 성능 측정을 통해 웹 애플리케이션의 현재 상태를 파악하고, 어떤 부분이 최적화가 필요한지, 어떤 리소스가 추가적으로 필요한지 판단할 수 있습니다.
  4. 비용 효율: 성능 최적화를 통해 기존의 인프라에서 더 많은 트래픽을 처리할 수 있게 되며, 이는 추가적인 인프라 투자 없이 트래픽 증가에 대응할 수 있게 합니다.
  5. 서비스의 안정성 보장: 성능 문제가 미처 발견되지 않으면, 트래픽이 증가할 때 시스템 장애나 다운타임을 초래할 수 있습니다. 이는 사용자의 신뢰를 잃게 하며, 장기적으로 브랜드 이미지에도 손상을 줄 수 있습니다.
  6. 검색 엔진 최적화: 페이지 로딩 속도는 검색 엔진 순위에 영향을 미치는 요소 중 하나입니다. 성능 최적화를 통해 웹 페이지의 검색 결과 순위를 향상시킬 수 있습니다.
  7. 경쟁 우위 확보: 사용자들은 빠르게 응답하는 애플리케이션을 선호합니다. 성능이 우수한 웹 애플리케이션은 경쟁 애플리케이션에 비해 사용자를 더 잘 끌어들일 수 있습니다.

웹 애플리케이션의 성능은 그 애플리케이션의 성공 여부에 결정적인 요소가 될 수 있습니다. 따라서 지속적인 성능 모니터링 및 최적화는 웹 애플리케이션의 품질과 안정성을 높이는 데 중요합니다.

설치 및 테스트 방법


1. 설치 및 설정

a. docker-compose 작성

version: '3.7'

services:
  controller:
    container_name: ngrinder-controller
    image: ngrinder/controller:latest
    environment:
      - TZ=Asia/Seoul
    ports:
      - "8880:80"
      - "16001:16001"
      - "12000-12009:12000-12009"
    volumes:
      - /tmp/ngrinder-controller:/opt/ngrinder-controller
    sysctls:
      - net.core.somaxconn=65000
  agent-1:
    container_name: agent-1
    image: ngrinder/agent:latest
    links:
      - controller
    environment:
      - TZ=Asia/Seoul
    sysctls:
      - net.core.somaxconn=65000
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nproc:
        soft: 1024000
        hard: 1024000
      nofile:
        soft: 1024000
        hard: 1024000
  agent-2:
    container_name: agent-2
    image: ngrinder/agent:latest
    links:
      - controller
    environment:
      - TZ=Asia/Seoul
    sysctls:
      - net.core.somaxconn=65000
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nproc:
        soft: 1024000
        hard: 1024000
      nofile:
        soft: 1024000
        hard: 1024000

b. nGrinder docker compose 실행

  • 작성된 파일 위치에서 도커를 실행 합니다.
docker-compose up -d

2. 웹 인터페이스 접속

  • 브라우저에서 http://localhost:8080으로 접속하면 웹 인터페이스에 접속할 수 있습니다.
  • 기본 관리자 계정(admin/admin)으로 로그인합니다.
ngrinder docker compose
홈 접속 화면

3. 테스트 스크립트 작성


  • 대시보드에서 Create 버튼을 클릭하여 새로운 테스트를 생성합니다.
create
  • 테스트 이름, 설명, 태그를 설정합니다.
create
  • 스크립트 탭에서 원하는 성능 테스트 스크립트(Groovy 기반)를 작성합니다.
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

import java.net.URLEncoder

/**
* 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, "[테스트도메인]")
		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() {
		String signon = "2021-09-13 22:04:42"
		String signoff = "2021-09-13 22:06:03"

		String encodedsignon = URLEncoder.encode(signon, "UTF-8")
		String encodedsignoff = URLEncoder.encode(signoff, "UTF-8")

		HTTPResponse response = request.GET("https://[테스트 도메인]/log?sign_on="+encodedsignon+"&sign_off="+encodedsignoff, 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))
		}
	}
}

4. 테스트 설정


  • 테스트 설정 탭에서 다음과 같은 옵션을 설정할 수 있습니다:
    • Threads: 동시에 실행할 사용자 수
    • Duration: 테스트를 실행할 시간
    • Ramp-up: 사용자를 점진적으로 증가시키는 시간
테스트 설정창

5. 테스트 실행


  • 설정이 완료되면 Run 버튼을 클릭하여 테스트를 시작합니다.
  • 실행 중인 테스트의 상태와 진행도를 실시간으로 확인할 수 있습니다.

6. 결과 분석


  • 테스트가 완료되면 결과 탭에서 상세한 테스트 결과와 차트를 확인할 수 있습니다.
  • TPS(Transactions Per Second), 응답 시간, 오류율 등 다양한 지표를 통해 애플리케이션의 성능을 분석할 수 있습니다.
결과 페이지
결과 페이지

7. 추가 팁 nGrinder agent docker


  • Agent를 별도로 구성하여 분산 테스트를 지원합니다. 대규모 테스트를 위해서는 여러 Agent를 활용하는 것이 좋습니다. 이 블로그에서는 상단의 yaml 파일에 agent 세팅도 되어 있습니다.
  • 테스트 스크립트 작성에 어려움이 있다면, 커뮤니티나 공식 문서를 참고하세요. 참고 사이트는 아래 사이트 이동하기 클릭!
사이트방문

이 블로그를 통해 애플리케이션의 성능을 간편하게 테스트하고 분석할 수 있습니다. 이 도구를 활용하여 애플리케이션의 성능 문제를 미리 파악하고 최적화할 수 있기를 바랍니다.