
애플리케이션 성능 최적화를 진행하던 중 애플리케이션이 얼마나 성능이 잘 나오고 초기 버전과 개선 버전의 성능 차이는 얼마나 나는지 알아보기 위해 nGrinder라는 오픈소스 테스트 플랫폼을 설치하여 사용해보고 관련 내용을 정리해 보았습니다.
nGrinder란?
nGrinder는 스크립트 작성, 테스트, 실행, 모니터링 및 결과 보고서 생성을 동시에 실행할 수 있는 스트레스 테스트용 플랫폼입니다.
오픈 소스인 nGrinder는 불편함을 없애고 통합 환경을 제공하여 얼마나 많은 사용자를 동시에 수용 가능한지 요청함으로서 서버의 성능을 측정해볼 수 있도록 도와줍니다.
nGrinder는 두 가지 주요 구성 요소로 구성됩니다.
- controller : 성능 테스터가 테스트 스크립트를 만들고 테스트 실행을 구성할 수 잇게 해주는 웹 애플리케이션입니다. 컨트롤러 도커 이미 ngrinder/controller 를 받을 수 있습니다.
- agent : 부하를 생성하는 가상 사용자 생성기. 에이전트 도커 이미지 ngrinder/agnet 를 받을 수 있습니다.
도커로 nGrinder를 실행하는 방법
Controller 이미지 받기
호스트에는 docker 1.5.0 이상이 설치되어 있어야합니다.
$ docker pull ngrinder/controller

Controller 실행
docker network create ngrinder-network
docker run -d -v ~/ngrinder-controller:/opt/ngrinder-controller --name controller --network ngrinder-network -p 80:80 -p 16001:16001 -p 12000-12009:12000-12009 ngrinder/controller
컨트롤러는 테스트 기록 및 구성 데이터를 유지하기 위해 /opt/ngrinder-controller 아래에 데이터 폴더를 생성하고 호스트의 폴더에 매핑해야 합니다. 맥을 기준으로 해당 명령어를 실행하면 맥북의 /Users/username/ngrinder-controller 폴더와 컨테이너 내부의 /opt/ngrinder-controller 경로가 연결되어 동기화됩니다. 만약 맥북의 ~/ngrinder-controller 폴더가 존재하지 않는다면, 컨테이너 내부의 /opt/ngrinder-controller 경로에 빈 폴더가 생성됩니다.
컨트롤러와 에이전트를 물리적으로 다른 서버로 구성하지 않을 경우 네트워크 설정
--network
동일한 머신에서 실행되는 도커는 추가 네트워킹 솔루션을 사용해야지 서로 통신이 가능하고,
에이전트는 부하를 생성하기 위해 머신에서 전체 리소스를 소비할 수 있으므로 컨트롤러와 물리적으로 분리하는 것이 권장 된다고 합니다.
일단은 제 맥북에서 해보고 성능이 안나오면 분리하던가 해야겠습니다.

스프링 배너를 출력 해주며 80포트로 실행되었습니다.
ui포트는 바꿀수 있지만 에이전트와 컨트롤러를 연결할때 에이전트 파일에 하드코딩 되어있는 포트를 수정하기 어려워서 기본포트를 유지했습니다..
포트 정보
- 80 : 기본 컨트롤러 웹 UI포트
- 9010-9019 : 에이전트는 이 포트를 통해 컨트롤러 클러스터에 연결
- 12000-12029 : 컨트롤러는 포트를 통해 스트레스 테스트를 할당
Agent 이미지 받기
docker pull ngrinder/agent

Agent 실행
docker run -d -v ~/ngrinder-agent:/opt/ngrinder-agent --name agent --network ngrinder-network -e CONTROLLER_IP=controller -e CONTROLLER_PORT=80 -e AGENT_NAME=my-agent ngrinder/agent

저는 에이전트를 실행할때 환경변수를 사용해서 컨트롤러 IP 주소와 웹포트에 접근하도록 실행 시켰습니다.
-network 옵션을 사용하여 컨트롤러와 동일한 도커 네트워크를 사용하도록 설정하였습니다.
-e 옵션을 사용하여 CONTROLLER_IP=controller, CONTROLLER_PORT=80, AGENT_NAME=my-agent와 같은 환경 변수를 정의합니다.
이렇게 하지 않으면 wget: bad address 'controller:80 같은 에러를 마주칠수 있습니다.
nGrinder 성능 테스트
이제 nGrinder를 사용하여 성능 테스트를 진행해 보겠습니다.
저는 로컬 환경에 띄워놨기 때문에 localhost:80 포트로 nGrinder 웹 콘솔에 접속합니다.
참고로 nGrinder agent는 가상머신 위에서 동작하기 때문에 localhost나 127.0.0.1로 테스트할 수 없습니다.
테스트할 애플리케이션 서버를 로컬에 두고 테스트할 경우 포트 포워딩 작업이 필요할 것 같습니다.

스크립트를 작성하고 사용하는 Agent, Vuser, Duration 등을 설정하고 테스트를 진행 해보았습니다.

TPS는 초당 몇번의 테스트를 진행했는지를 뜻합니다.
Mean Test Time은 한번의 요청부터 응답까지 몇 초가 걸렸는지를 뜻합니다.
이 두가지 요소를 중점적으로 체크하여 API 개발 시 쉽게 성능 테스트를 진행해 볼 수 있을 것 같습니다.