Spring

nGrinder와 Pinpoint로 성능테스트 및 개선하기 (1) - 환경 구축

그해 2024. 5. 10. 20:43

 

프로젝트 API를 완성했고, 내가 만든 API가 잘 작동하는지 확인해보고자 한다. nGrinder를 통해서 성능테스트를 수행하고, Pinpoint가 제공하는 병목점을 찾아 개선점을 찾기로 했다. 정확한 성능테스트 및 모니터링을 위해 NCP에서 성능테스트용 서버(centOs 7)를 하나 만들었다. 

1. nGrinder

네이버에서 제공하는 서버 부하 테스트 오픈 소스 프로젝트이다. 가상 시나리오를 만들어 트래픽이 몰렸을 때 성능을 측정할 수 있도록 도와준다.

  • controller : Web UI를 제공하고 테스트를 구성할 수 있도록 하며 모니터링 하거나 보고서를 시각화
  • Agent : 부하를 발생시키는 역할로 process와 Thread를 이용해 가상 사용자를 생성
  • Target Server : 테스트하고자 하는 서버 (= 내 서버)

1.1 nGrinder 설치

//controller 설치
docker pull ngrinder/controller
docker run -d -v ~/ngrinder-controller:/opt/ngrinder-controller --name controller -p 80:80 -p 16001:16001 -p 12000-12009:12000-12009 ngrinder/controller

//agent 설치
docker pull ngrinder/agent
docker run -d --name agent --link controller:controller ngrinder/agent

//접속후 admin, admin으로 로그인
http://{공인IP}/login
  • -p 80:80: 호스트의 80번 포트를 컨테이너의 80번 포트포워딩

NCP 서버를 사용하고 있기 때문에 ACG에서 HTTP 포트번호 80을 열어주었다.

다음과 같은 화면이 뜨면 완료! 위의 Performance Test에서 어플리케이션을 테스트하고, 그 결과에 대해 조회할 수 있고, 그리고 Script에서 Performance Test를 하기전 어떻게 테스트할지 스크립트를 작성할 수 있다.

 

테스트 스크립트를 작성하고, 테스트를 생성하는 방법은 다음 포스팅에서 진행하겠다.

2. Pinpoint

Pinpoint는 대규모 분산 시스템 성능을 분석하고 문제를 진단하는 플랫폼이다.

  • Pinpoint Agent : 어플리케이션의 정보를 수집해 Pinpoint Collector에 전달한다. → 내 어플리케이션 서버에 설치
  • Pintpoint Collector : Pinpoint Agent에서 받은 데이터를 HBase에 저장한다. Pinpoint는 API 통신 내역을 코드 수준으로 세세하게 추적하기 때문에 트래픽이 많으면 데이터의 양이 폭발적으로 증가한다. 이런 정보를 HBase에 담아서 활용한다. → 모니터링 서버에 설치
  • Pintpoint web : HBase에서 데이터를 조회해서 Web UI형태로 시각화된 모니터링 서비스를 제공한다. → 모니터링 서버에 설치

2.1 Pinpoint 설치

주의

처음에 내 프로젝트가 JDK 17이라 버전을 맞추고 싶어서 호기롭게 약 2달 전에 release된 HBase 2.5.8를 설치하고 Pinpoint도 3.0.x로 맞추려고했다. 하지만 하루종일 세팅을 바꾸고 했는데 도저히 안되서 확인해봤더니 Hbase에서 JDK 17을 지원안해준다..!

 

]

https://hbase.apache.org/book.html#java

 

Apache HBase ™ Reference Guide

This section describes the setup of a single-node standalone HBase. A standalone instance has all HBase daemons — the Master, RegionServers, and ZooKeeper — running in a single JVM persisting to the local filesystem. It is our most basic deploy

hbase.apache.org

그래서 다른 블로그를 참고해 HBase 1.2.7, JDK 8 로 버전 변경해서 다시 설치했다.

버전확인

호환되는 버전은 여기서 확인가능하다.

https://github.com/pinpoint-apm/pinpoint

 

GitHub - pinpoint-apm/pinpoint: APM, (Application Performance Management) tool for large-scale distributed systems.

APM, (Application Performance Management) tool for large-scale distributed systems. - GitHub - pinpoint-apm/pinpoint: APM, (Application Performance Management) tool for large-scale distributed sys...

github.com

 

Java 8 설치

#java8 다운로드
sudo yum install java-1.8.0-openjdk -y
sudo yum install java-1.8.0-openjdk-devel -y

#절대경로 출력
readlink -f /usr/bin/java

#설정파일
vi /etc/profile

#맨 아래에 추가
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

#적용
source /etc/profile

#버전 확인
java -version

#확인
echo $JAVA_HOME

HBase 설치

1. HBase 설치

wget <https://archive.apache.org/dist/hbase/1.2.7/hbase-1.2.7-bin.tar.gz>
tar xzvf hbase-1.2.7-bin.tar.gz

2. HBase 의 설정에서 JAVA_HOME 설정

#HBase 설정 파일 열기
vi {설치경로}/hbase-1.2.7/conf/hbase-env.sh

#이 부분 주석처리하기
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m ..."
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m ..."

# 이부분 수정
# The java implementation to use.  Java 1.8+ required.
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64

 

3. Hbase 실행

hbase-1.2.7/bin/start-hbase.sh

 

4. Hbase 스키마 생성

#Pinpoint에서 제공해주는 hbase-create.hbase를 다운
wget https://raw.githubusercontent.com/pinpoint-apm/pinpoint/master/hbase/scripts/hbase-create.hbase

#hbase-1.2.7/bin 에 있는hbase를 통해서 shell 실행
hbase-1.2.7/bin/hbase shell ./hbase-create.hbase

실행하고 log가 잘 찍히면 성공이다.

 

프로젝트가 JDK 17이기때문에 Pinpoint Agent는 3.0.x를 사용하려고 했으나 HBase 1.x와 호환이 안되기때문에 Pinponint를 2.5.1로 결정하고 JDK 11를 추가로 설치하기로 했다.

Java11 설치

yum install java-11-openjdk-devel.x86_64

#Java 버전을 11로 변경
alternatives --config java
java -version

Pinpoint Collector/Web 설치

wget <https://github.com/pinpoint-apm/pinpoint/releases/download/v2.5.1/pinpoint-collector-boot-2.5.1.jar>
wget <https://github.com/pinpoint-apm/pinpoint/releases/download/v2.5.1/pinpoint-web-boot-2.5.1.jar>

#실행 권한 부여
chmod +x pinpoint-collector-boot-2.5.1.jar
chmod +x pinpoint-collector-boot-2.5.1.jar

#실행
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.5.1.jar >/dev/null 2>&1 &
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.5.1.jar >/dev/null 2>&1 &

이제 NCP의 ACG에서 8080을 열어주고 http://${서버 ip}:8080 다음주소로 접속하면 된다. 👍

참고로 agent에서 controller 데이터를 보낼때 9991,9992,9993 포트를 사용하므로 열어줘야한다.

wget https://raw.githubusercontent.com/pinpoint-apm/pinpoint/master/hbase/scripts/hbase-create.hbase
tar xvzf pinpoint-agent-2.5.1.tar.gz

#설정파일 열기
vi {경로}/pinpoint-agent-2.5.1/profiles/release/pinpoint.config

###########################################################
# gRPC Configuration                                      #
###########################################################
profiler.transport.grpc.collector.ip={ip} #여기를 모니터링 서버 ip로 변경

나는 dokcer로 어플리케이션을 실행을 하고있었으므로 docker image를 변경했다. 

#변경 전
FROM openjdk:17
ARG JAR_FILE=build/libs/kbo-ticketing-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} kbo-ticketing.jar
ENTRYPOINT ["java","-jar","/kbo-ticketing.jar"]

#변경 후
FROM openjdk:17
ARG JAR_FILE=build/libs/kbo-ticketing-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} kbo-ticketing.jar
ENTRYPOINT ["java", \\
 "-javaagent:/pinpoint/pinpoint-bootstrap-2.5.1.jar", \\
 "-Dpinpoint.agentId=kbo-agent", \\
 "-Dpinpoint.applicationName=kbo-ticketing", \\
 "-jar", "/kbo-ticketing.jar"]
  • agentId : Pinpoint Web Dashboard에서 각 Application을 구분하기 위한 Unique ID
  • applicationName : Pinpoint Web Dashboard에서 각 Application Group을 구분하기 위한 ID

이제 다음과 같이 실행하면 된다. 

docker run -d -v /root/pinpoint-agent-2.5.1:/pinpoint -p 8081:8080 --name kbo waithjno/kbo-ticketing
  • -v /root/pinpoint-agent-2.5.1:/pinpoint: /root/pinpoint-agent-2.5.1 디렉토리를 컨테이너 내부의 pinpoint 디렉토리로 마운트
  • -p 8081:8080 : 호스트의 8081을 컨테이너의 8080과 연결
  • --name kbo : 실행할 컨테이너의 이름을 지정
  • waithjno/kbo-ticketing : 사용할 도커 이미지

이제 API를 요청하고 다시 들어가보면 어플리케이션 목록을 확인할 수 있다! 세팅 끝!

 

 

 

다음은 위에서 만든 ngrinder 테스트 시나리오로 성능테스트를 하고, pinpoint에서 병목지점을 찾는 포스팅을 해보겠다!

 

 

참고

https://velog.io/@as9587/Pinpoint-설치하기

https://mingeonho1.tistory.com/entry/APM-핀포인트-도입