프로젝트 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에서 병목지점을 찾는 포스팅을 해보겠다!
참고
'Spring' 카테고리의 다른 글
nGrinder와 Pinpoint로 성능테스트 및 개선하기 (3) - Connection Pool 크기 조절 (0) | 2024.05.19 |
---|---|
nGrinder와 Pinpoint로 성능테스트 및 개선하기 (2) - 병목지점 파악 (0) | 2024.05.14 |
Redis Lua Script 실제로 Atomic할까? (0) | 2024.04.18 |
Redis Lua Script 와 synchronized 간의 성능 비교 테스트 (+ 수정) (0) | 2024.04.15 |
mockito 테스트 시 파라미터에 무엇을 넣어야할까? (0) | 2024.04.04 |