콘텐츠로 이동

nGrinder 분산 부하테스트 구성 — 대규모 트래픽 시뮬레이션

단일 머신으로는 수만 VU 이상의 부하를 만들기 어렵습니다. nGrinder는 Controller + Agent 구조로 여러 머신을 하나의 부하 생성 클러스터로 묶습니다.

[Controller] (웹 UI + 테스트 조율)
├──▶ [Agent 1] 각 Agent에서 VU 실행
├──▶ [Agent 2]
└──▶ [Agent 3]
Agent 1대당: 일반적으로 500~2,000 VU 처리 가능
Agent 3대: 최대 ~6,000 VU 생성
docker-compose.yml
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:
- controller
Terminal window
docker-compose up -d
# 브라우저: http://localhost:8080
# 기본 계정: admin / admin

nGrinder는 Groovy(JVM) 기반 스크립트를 사용합니다.

test_script.groovy
import static net.grinder.script.GTest.*
import net.grinder.script.GTest
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.*
import org.junit.Test
import org.junit.runner.RunWith
import HTTPClient.HTTPResponse
import 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 agentAgent당 가상 사용자200
총 VUAgent × Vuser600
Ramp-upVU 증가 방식1분에 걸쳐 선형 증가
Duration테스트 지속 시간30분
Sampling결과 수집 주기2초

대규모 테스트를 위한 Agent 확장

섹션 제목: “대규모 테스트를 위한 Agent 확장”
Terminal window
# 추가 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
→ 이 지점이 현재 시스템 최대 처리 용량
상황추천 도구
수만 VU 이상 대규모 테스트nGrinder
CI/CD 코드 통합, 빠른 피드백k6
기존 JMeter 자산 활용JMeter
Java/Groovy 팀 친숙도nGrinder
클라우드 네이티브 환경k6 Cloud / Grafana Cloud k6
visitor count

이 가이드를 내 서비스에 직접 적용해 보세요.

TestForge 무료 스캔 시작 →