배포 프로젝트를 약 750 명의 커뮤니티에 공개할 예정이어서 그 전에 부하 테스트를 해 보기로 했다. 모든 사람이 동시에 접속하지는 않겠지만 1vCPU 1GB MEM의 귀여운 서버라 서버 다운의 가능성이 있기 때문에 어느 정도 감당할 수 있는지 알아보기로 했다.
처음에는 간단하게 Postman을 사용했는데, 무료 버전이라 그런지 최대 100 명까지의 VU(가상유저)만 설정이 가능했다. 10분 간 테스트를 해 보았는데 응답 속도가 2.0s 정도로 느려지기는 했지만 서버가 다운되지는 않았다.
더 큰 부하를 테스트하기 위해 nGrinder를 사용하기로 했다.
Jmeter도 있지만 웹 콘솔이 편리해 보이고 국내 사용자가 많은 nGrinder를 선택했다.
🔗 nGrinder는 NAVER에서 관리하는 오픈소스 스트레스 테스트 도구이다.
nGrinder는 Controller와 Agent라는 두 개의 주요 컴포넌트를 사용하는데, Controller는 테스트 스크립트를 만들고 실행하는 역할을 하고, Agent는 Controller의 명령을 받아 Target에 트래픽을 생성하는 역할을 한다.
Controller와 Agent는 전용 서버를 마련하는 것이 정확한 테스트에 좋다고 하고, 내 컴퓨터나 네트워크가 감당할 수도 없을 거 같아서 Vultr에서 Contoller 서버와 Agent 서버 인스턴스를 두 개 구매했다. 서버에 부담이 될 만큼 많은 가상유저를 돌려야 하기에 서버보다 좋은 스펙으로 마련했다.
nGrinder 실행 방법은 Docker 실행/WAR 자체 실행/Tomcat 실행 3가지 방법이 있다. 나는 자체 실행이 가장 간편해 보여서 WAR을 다운받았다.
wget https://github.com/naver/ngrinder/releases/download/ngrinder-3.5.9-20230227/ngrinder-controller-3.5.9.war
🔗 nGrinder의 다운로드 페이지에서 설치 링크를 복사하고 wget
으로 파일을 다운로드 한다. 나는 최신 버전인 3.5.9 버전을 선택했다.
JVM 위에서 돌아가기 때문에 yum install java-11-openjdk
명령으로 OpenJDK를 설치해준다. JDK 버전은 1.8
또는 11
만 가능하다고 한다.
나는 처음에 17
버전을 깔았다가 스크립트 작성에서 java.lang.IllegalArgumentException: Unsupported class file major version 61
오류를 마주했다.
실행 전에 환경변수 설정과 Maven, Gradle 설치가 필요하다.
Rocky Linux에서 Maven은 yum install maven
으로 간단하게 설치 가능하다.
Gradle은 yum install gradle
을 해 보면 정보가 없다고 나온다. 🔗 Gradle 홈페이지에 들어가서 수동으로 설치해주어야 한다. Linux 다운로드를 선택하고 wget
을 통해 binary-only
파일을 다운받아 공식 매뉴얼을 따라 설치해준다.
이제 nGrinder가 사용할 환경변수를 설정해주어야 한다. ~/.bash_profile
에 환경변수를 설정해 주었다.
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-3.el8.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:$JAVA_HOME/bin
export NGRINDER_HOME=/usr/local/ngrinder
export GRADLE_HOME=/opt/gradle/gradle-8.9
export PATH=${GRADLE_HOME}/bin:${PATH}
JAVE_HOME
경로는 다음 명령을 통해 추출할 수 있다.$ which java
/usr/bin/java
$ readlink -f /usr/bin/java
/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-3.el8.x86_64/bin/java
NGRINDER_HOME
은 nGrinder 실행 관련 파일이 생성되는 디렉토리다.GRADLE_HOME
: Gradle 경로이다. 나는 /opt/gradle
에 설치했다.source ~/.bash_profile
을 통해 변경 내역을 저장하자. echo $JAVA_HOME
을 통해 잘 설정이 되었는지 확인할 수 있다.
$ firewall-cmd --permanent --zone=public --add-port=16001/tcp
$ firewall-cmd --permanent --zone=public --add-port=12000/tcp
$ firewall-cmd --permanent --zone=public --add-port=8080/tcp
$ firewall-cmd --reload
$ firewall-cmd --list-ports
12000
포트는 테스트에 따라 더 많은 포트를 사용할 수도 있다. 나는 12000
~12009
10개 포트를 열어주었다.
$ java -Djava.io.tmpdir=${NGRINDER_HOME}/lib -jar ngrinder-controller-3.5.9.war
프로그램의 부팅이 잘 되면 로컬 브라우저의 URL에 http://[Controller 서버 IP]:8080
을 입력해 콘솔에 접속하자. 기본적으로 8080
포트를 사용하는데 포트를 지정해주고 싶다면 실행 명령어에 -p
옵션을 사용해 다른 포트를 지정해줄 수 있다.
웹 콘솔이다. ID와 비밀번호 모두 admin
이다. 로그인한 뒤 비밀번호를 변경해주자.
로그인 후 우측 상단 메뉴에서 DownloadAgent
에서 로컬로 Agent 파일을 다운받을 수 있다. wget
을 사용하고 싶다면 Agent Management
메뉴에 들어가면 설치 URL을 복사할 수 있다.
나는 /usr/local/ngrinder
를 만들고 파일을 다운로드 받았다. .tar
파일이 다운로드 되는데 tar xvf ngrinder-agent-3.5.9-p1-localhost.tar
를 통해 압축을 풀 수 있다. 설치가 완료되면 압축 파일은 삭제해주어도 된다.
먼저 파일을 실행하기 위해 Agent에도 JDK가 필요하다. Controller와 마찬가지로 OpenJDK11을 설치해주고 JAVA_HOME
도 설정해주자.
그 다음 설정 파일을 만들어주자. Agent는 기본적으로 localhost
를 Controller로 사용하는데 나는 Controller 서버가 따로 있으므로 설정이 필요하다.
ngrinder-agent
디렉토리 내에 vi __agent.conf
를 통해 설정 파일을 만들어주고 다음과 같이 입력한다. controller_port
는 기본값이 16001
이기는 하지만 그냥 명시적으로 적어주었다.
agent.controller_host=[Controller 서버 IP]
agent.controller_port=16001
$ ./run_agent.sh
명령으로 파일을 실행할 수 있다.
파일을 실행한 뒤 웹 콘솔의 Agent Management
를 보면 위와 같이 연결된 Agent를 확인할 수 있다. 최신 nGrinder 버전에서는 기본적으로 Approved
상태이지만 혹시 Disapproved
상태는 아닌지 체크하자.
잘 동작하는지 간단히 테스트 해보자.
상단 메뉴에서 Script
를 클릭하고 Create a script
에서 간단한 스크립트를 만들어준다. 나는 GET
메소드로 게시글 목록을 불러와봤다.
만들어진 스크립트에서 Validate
를 눌러 검증해 볼 수 있다. 문제가 없으면 저장한다.
상단 내비게이션에서 Performance Test
를 클릭하고 Create Test
를 누른다. 위의 스크린샷처럼 테스트를 상세하게 설정할 수 있는 페이지가 뜬다.
하나의 Agent를 설치했으므로 최대 Agent는 1개이다. (멀티 설정도 가능한 듯 하다.) 생성할 가상유저의 수, 아까 생성한 스크립트, 실행 기간 등을 설정하고 실행해보자.
초록불이 뜨고 모니터링 그래프가 잘 동작한다면 연동이 잘 된 것이다.