Post

대용량 트래픽 경험해보기(6/14) - nGrinder 환경 구축

nGrinder

부하 테스트 도구 종류는 여러가지가 있다. 그 중 nGrinder를 사용해보려 한다.

nGrinder는 네이버에서 개발한 오픈소스 부하 테스트 도구로 스크립트 생성과 테스트 진행 과정을 모니터링 할 수 있으며, 테스트가 종료되면 UI를 통해 최종 결과 보고서를 확인할 수 있다.

단순히 부하만을 발생시키는 것이 아니라 스크립트를 작성하여 다양한 시나리오를 테스트할 수 있다는 장점이 있다.

nGrinder의 핵심요소로 ControllerAgent가 있다.

Controller

  • 테스트 스크립트를 작성하고 시나리오와 환경 설정을 받아 관리하며, Agent에 명령하여 테스트를 진행시키는 역할이다.
  • 테스트가 진행되는 동안 Agent로부터 수집된 데이터를 수신하고 이를 실시간으로 분석하여 테스트 진행동안 결과를 제공하며 결과 보고서를 통해 최종 수집 결과를 UI에서 확인할 수 있도록 한다.

Agent

  • 실제 부하를 발생시키는 역할을 하며, Controller에서 전달한 명령에 따라 설정된 환경에 맞게 스크립트를 실행한다.
  • 여러 Agent를 설정하여 많은 가상의 사용자를 생성하여 동시에 시뮬레이션 할 수 있어 대규모 부하 테스트에 적합하다.
  • 테스트 중에 Controller에 주기적으로 결과를 송신하며, 모든 테스트 결과는 Controller에 의해 수집된다.

nGrinder 환경 구축

환경 구축 전

예전에 nGrinder를 사용했을 때 Controller와 Agent를 Local에서 설정하여 사용해본적이 있다. 이번 부하 테스트의 경우에는 Controller와 Agent를 별도 서버로 운영하며 부하 테스트를 진행하기로 했다.

그 이유는 Controller와 Agent가 하나의 서버에서 운영될 경우에 리소스 경쟁으로 인해서 성능 저하가 발생할 수 있으며 이로 인해 정상적인 결과를 얻을 수 없는 경우가 있기 때문이다. 또한, Controller와 Agent 중 하나에 문제가 발생하면 다른 컴포넌트가 운영되고 있는 경우 영향이 발생할 수 있다.

초기 서버 환경으로 Controller와 Agent 두 컴포넌트의 서버 스팩은 아래와 같다.

OSAmazon Linux 2
인스턴스 유형t2.micro
vCPU1(1 Core)
Memory1GB
NetworkLow to Moderate

nGrinder Controller With Docker

Docker & Docker Compose 설치

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
services:
  controller:
    image: ngrinder/controller
    container_name: controller
    ports:
      - "80:80"
      - "16001:16001" # 호스트의 16001번 포트를 컨테이너의 16001번 포트에 매핑
      - "12000-12001:12000-12001" # 12000 - 12000 + n (동시 테스트 n 개)
    volumes:
      - ./ngrinder-controller:/opt/ngrinder-controller
1
2
# nGrinder Controller Container 실행
$ docker-compose up -d

http://{호스트 DNS or IP}으로 접속하면 아래와 같은 화면을 확인할 수 있다. 로그인 과정이 필요하며 초기 계정 및 비밀번호는 admin/admin이다.

nGrinder Controller UI

nGrinder Agent

nGrinder의 경우 JRE(Java 실행 환경)이 필수이므로 Java를 먼저 설치한다.

nGrinder에서 아직은 JDK 11에서 동작하는 것으로 보인다. 로컬에서 17버전으로 사용하려하니 지원하지 않는 버전이여서 그런지 JDK 버전을 11로 낮추었던 기억이 있다.

1
2
3
4
5
# JDK 11 설치
$ sudo yum install java-11-amazon-corretto

# 버전확인
$ java -version

nGrinder Agent 환경 구성 시 nGrinder Controller의 Agent Management에서 ngrinder-agent 아카이브 파일을 확인한다.

nGrinder Agent Management File

1
2
3
4
5
6
7
8
9
10
11
# ngrinder agent 다운로드
$ wget http://{nGrinder Controller 호스트 DNS or IP}/agent/download/ngrinder-agent-3.5.9-p1.tar

# 아카이브 압축 해제
$ tar -xvf ngrinder-agent-3.5.9-p1.tar

# 설치 완료 후 압축 해제한 폴더를 들어가면 스크립트 파일과 lib 디렉토리 확인
$ ls ngrinder-agent

# Agent 실행해보기
$ ./ngrinder-agent/run_agent.sh

agent 실행 스크립트를 실행하면 아래 이미지와 같이 nGrinder Agent Home의 경로를 확인할 수 있다.

nGrinder Agent Conf Path

위 경로의 디렉토리를 열어보면 agent.conf 파일을 볼 수 있다. 편집기를 통해 파일을 열어 아래 내용을 수정한다.

1
2
3
agent.controller_host={nGrinder Controller 호스트 DNS or IP}
agent.controller_port=16001 #nGrinder Controller 호스트 매핑 포트 16001
...

저장 후 다시 Agent를 실행하면 nGrinder에서 아래와 같이 Agent 정보가 출력되는 것을 확인할 수 있다. State가 초록불이면 Agent는 정상상태이다.

nGrinder Controller Agent Result

nGrinder 구성 살펴보기

nGrinder Controller Configuration

  • Performance Test : VUser, Process, Thread, Script, Random-Up 구성을 설정하여 테스트를 진행할 수 있다.
  • Script : 테스트 할 스크립트를 작성한다.
  • Agent : 에이전트의 수를 설정할 수 있으며 등록된 에이전트 수 만큼 설정 가능하다.
  • Vuser per agent : 에이전트 별 실행할 가상의 사용자를 설정할 수 있다. Vuser은 Process와 Thread 수를 곱한 값이다. 에이전트별 최대 3000의 Vuser 설정이 가능하며 가상의 사용자가 3000이 넘도록 설정해야할 경우 Agent를 추가해야한다.
  • Script : 작성한 스크립트를 선택할 수 있다.
  • Duration / Run Count : 부하 테스트 실행을 시간 혹은 횟수로 설정할 수 있다.
  • Enable Random-Up : Process 혹은 Thread를 특정 주기로 증가시켜 유연한 부하 테스트가 가능하다.
    • Initial Count : 초기 Process 혹은 Thread 수 지정
    • Incremental Step : Process 혹은 Thread를 얼만큼 증가시킬지 지정
    • Initial Sleep Time : Process 혹은 Thread가 증가할 때마다 초기 Sleep 시간 설정
    • Interval : Process 혹은 Thread를 어느정도의 주기로 증가시킬지 결정

테스트 예시

nGrinder Controller Test Example 1

필요한 테스트 구성을 입력 후 테스트를 하게되면 TPS, Peak TPS, Mean Test Time, 실행/성공/실패 테스트에 대한 결과를 확인할 수 있다. Detailed Report 버튼을 누르게 되면 아래와 같이 부하 테스트 수집 결과를 그래프를 통해 테스트 시간별 집계된 수치를 간단하게 확인할 수 있다.

nGrinder Controller Test Example 2

nGrinder Controller Test Example 3

This post is licensed under CC BY 4.0 by the author.