nGrinder 분산 부하테스트 구성 — 대규모 트래픽 시뮬레이션
단일 머신으로는 수만 VU 이상의 부하를 만들기 어렵습니다. nGrinder는 Controller + Agent 구조로 여러 머신을 하나의 부하 생성 클러스터로 묶습니다.
nGrinder 아키텍처
섹션 제목: “nGrinder 아키텍처”[Controller] (웹 UI + 테스트 조율) │ ├──▶ [Agent 1] 각 Agent에서 VU 실행 ├──▶ [Agent 2] └──▶ [Agent 3]
Agent 1대당: 일반적으로 500~2,000 VU 처리 가능Agent 3대: 최대 ~6,000 VU 생성Docker Compose로 빠르게 시작
섹션 제목: “Docker Compose로 빠르게 시작”version: '3'services: controller: image: ngrinder/controller:latest ports: - "8080:8080" # 웹 UI - "16001:16001" # Agent 통신 - "12000-12009:12000-12009" environment: - JAVA_OPTS=-Xms512m -Xmx1g
agent1: image: ngrinder/agent:latest environment: - CONTROLLER_ADDR=controller depends_on: - controller deploy: resources: limits: cpus: '2.0' memory: 2G
agent2: image: ngrinder/agent:latest environment: - CONTROLLER_ADDR=controller depends_on: - controllerdocker-compose up -d# 브라우저: http://localhost:8080# 기본 계정: admin / admin테스트 스크립트 작성 (Groovy)
섹션 제목: “테스트 스크립트 작성 (Groovy)”nGrinder는 Groovy(JVM) 기반 스크립트를 사용합니다.
import static net.grinder.script.GTest.*import net.grinder.script.GTestimport net.grinder.scriptengine.groovy.junit.GrinderRunnerimport net.grinder.scriptengine.groovy.junit.annotation.*
import org.junit.Testimport org.junit.runner.RunWith
import HTTPClient.HTTPResponseimport HTTPClient.NVPair
@RunWith(GrinderRunner)class TestRunner {
public static GTest test1 = new GTest(1, "상품 목록 조회") public static GTest test2 = new GTest(2, "장바구니 추가")
public static HTTPRequest request
@BeforeProcess public static void beforeProcess() { HTTPPluginControl.getConnectionDefaults().timeout = 6000 request = new HTTPRequest() grinder.logger.info("프로세스 초기화 완료") }
@BeforeThread public void beforeThread() { test1.record(this, "test1") test2.record(this, "test2") grinder.statistics.delayReports = true }
@Test public void test1() { HTTPResponse response = request.GET("https://api.example.com/products")
if (response.statusCode == 301 || response.statusCode == 302) { grinder.logger.warn("리다이렉트 발생") } assertThat(response.statusCode, is(200)) }
@Test public void test2() { NVPair[] headers = [new NVPair("Content-Type", "application/json")] String body = '{"product_id": "prod-001", "quantity": 1}'
HTTPResponse response = request.POST( "https://api.example.com/cart", body.bytes, headers ) assertThat(response.statusCode, is(201)) }}분산 테스트 실행 설정
섹션 제목: “분산 테스트 실행 설정”Web UI에서 테스트 실행 시 주요 설정값:
| 항목 | 설명 | 예시 |
|---|---|---|
| Agent 수 | 사용할 Agent 머신 수 | 3 |
| Vuser per agent | Agent당 가상 사용자 | 200 |
| 총 VU | Agent × Vuser | 600 |
| Ramp-up | VU 증가 방식 | 1분에 걸쳐 선형 증가 |
| Duration | 테스트 지속 시간 | 30분 |
| Sampling | 결과 수집 주기 | 2초 |
대규모 테스트를 위한 Agent 확장
섹션 제목: “대규모 테스트를 위한 Agent 확장”# 추가 Agent를 별도 서버에서 실행docker run -d \ --name ngrinder-agent \ -e "CONTROLLER_ADDR=controller-host:16001" \ ngrinder/agent:latest
# Agent는 무한정 추가 가능# 1만 VU = Agent 10~20대 수준결과 분석
섹션 제목: “결과 분석”nGrinder 리포트 주요 지표:
TPS (Transactions Per Second) → 목표치 대비 실제 처리량 확인
Mean Test Time → 평균 응답 시간 (단독으로 보지 말 것 — 분산 확인 필요)
Errors → VU 증가에 따른 에러율 변화 구간 확인
Peak TPS 시점의 VU → 이 지점이 현재 시스템 최대 처리 용량nGrinder vs k6 선택 기준
섹션 제목: “nGrinder vs k6 선택 기준”| 상황 | 추천 도구 |
|---|---|
| 수만 VU 이상 대규모 테스트 | nGrinder |
| CI/CD 코드 통합, 빠른 피드백 | k6 |
| 기존 JMeter 자산 활용 | JMeter |
| Java/Groovy 팀 친숙도 | nGrinder |
| 클라우드 네이티브 환경 | k6 Cloud / Grafana Cloud k6 |
다음 단계
섹션 제목: “다음 단계”이 가이드를 내 서비스에 직접 적용해 보세요.
TestForge 무료 스캔 시작 →