병목 지점이 EC2라는 건 확인했다. EC2를 성능 개선할 때는 크게 4가지 방향성이 있다고 설명했다. a와 b에 대해서는 해당 사항이 없으므로, 시스템 이중화의 장점을 가지고 있는 ‘수평적 확장’의 방식으로 성능을 개선해보자.
그 중에서 시스템 이중화의 이점을 가져가기 위해 수평적 확장을 시도해보자.
애플리케이션 로직에서 비효율적인 로직 개선하기
정적 파일 서버(S3, Cloudfront) 분리하기
로드밸런서(ELB)를 활용해 수평적 확장하기
수직적 확장하기
✅ EC2 수평적 확장하기
참고) EC2에는 오토 스케일링(Auto Scaling)이라는 기능을 활용해 트래픽에 따라 자동으로 수평적 확장을 해주는 기능이 있다. 하지만 학습을 위해 수동으로 수평적 확장을 할 예정이다.
이미지 생성하기
이미지(Image)란 ‘기존 EC2 인스턴스의 복제본’이라고 생각하면 이해하기 쉽다.
이미지로 EC2 인스턴스 생성하기
EC2 인스턴스로 접속해 Spring Boot 서버 실행시키기
$ cd /home/ubuntu
$ cd load-testing-server
$ cd build/libs
$ sudo nohup java -jar jscode-0.0.1-SNAPSHOT.jar &
Spring Boot가 잘 실행되는 지 확인하기
http://{EC2 IP 주소}/health로 접속해서 Spring Boot 서버가 잘 작동하는 지 확인해보자.
CloudWatch Agent 실행시키기
# CloudWatch Agent 실행
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
# 잘 실행되고 있는 지 확인
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
EC2 인스턴스에 IAM Role 연결
ELB의 대상 그룹에 추가하기
CloudWatch 모니터링 추가하기
[EC2의 CPUUtilization]
[EC2의 메모리 사용량]
✅ 부하 테스트 다시 진행하기
부하 테스트 시작하기
$ K6_WEB_DASHBOARD=true k6 run script.js
k6의 웹 대시보드 열기
http://{k6가 실행되고 있는 EC2 IP 주소}:5665으로 접속하기
top 명령어 활용해 실시간 모니터링하기
$ top
부하 테스트 결과 해석
최대 Throughput은 약 7 TPS 정도로 측정된다. 기존 Throughput(4 TPS)에 비해 1.75배 정도 증가했다. 즉, 1초에 처리할 수 있는 요청량이 4개에서 7개로 증가했다.
병목 지점 확인하기
추가적인 성능 개선을 하고 싶다면 아래 병목 지점을 해결한 뒤에 또 부하 테스트를 하는 과정을 반복하면 된다.