1. 부하 테스트의 기본 개념
우리가 실제 서비스를 배포 하기 전, 문득 이런 생각이 들 수 있다.
"우리 서버에 요청이 몰려서 서버가 터지면 어떡하지?"
"트래픽이 몰려 갑자기 서버가 죽으면 어떡하지?"
이런 문제를 사전에 방지하기 위해 배포 전 우리는 부하 테스트를 진행해봐야 한다.
우선 부하 테스트의 의미를 먼저 알아보자.
부하 테스트는 서비스를 배포하기 전, 서버가 어느 정도의 요청을 견딜 수 있는지 확인하는 과정을 의미한다.
부하 테스트 진행할 때 사용하는 용어에 대해서도 알아볼까?
- Throughput: 1초당 처리할 수 있는 작업량
- TPS(Transaction Per Seconds): 1초당 처리한 요청의 수
만약 내가 처리한 서버가 1초당 최대 100개의 API 요청을 처리할 수 있다고 가정한다면,
해당 서버는 Throughput은 100TPS라고 표현할 수 있다.
2. 인프라 구성 정보
- EC2 - t3a.small
- Spring Boot
- Redis
- RDS - t4g.micro
인프라는 AWS에 위와 같이 아키텍처를 구성해놓은 상태다.
3. 부하 테스트 환경 세팅 (k6)
k6가 뭔데?
높은 정확도와 고부하를 발생시킬 수 있는 간단하고 빠른 부하 테스트 툴이다.
k6 이외의 부하 테스트 툴
k6 이외에 사용되어지는 부하 테스트 툴은 무엇이 있는지 정리 정도만 해두자.
- ngrinder
- jmeter
- ab
- locust
4. 부하 테스트 k6 설치
Window 사용 유저들을 위한 설치 방법은 강사님이 제공해준 링크를 공유할테니 참고하시면 좋을 것 같다.
Window 사용 유저 k6 설치 참고 1 - 직접 다운
https://www.youtube.com/watch?v=eVmcDt5C8io
Window 사용 유저 k6 설치 참고 2 - Package Manager 활용
https://yscho03.tistory.com/101#google_vignette
Mac 사용 유저 k6 설치 참고
k6 설치
# k6 설치 명령어
brew install k6
k6 설치 확인
# k6가 정상 설치 되었는지 확인하는 명령어
k6
5. k6를 사용해보자!
k6를 활용해 API에 과부하를 주기 위해선 스크립트를 작성해야 한다.
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
http.get('http://13.125.227.183:8080/boards');
}
6. Redis 적용 전,후 Throughout(처리량) 비교
정확한 테스트를 위한 Spring Boot 백그라운드 실행
# Spring Boot 서버 백그라운드 실행 명령어
nohup java -jar -Dspring.profiles.active=prod redis-in-spring-0.0.1-SNAPSHOT.jar &
# 백그라운드 실행 여부 확인 명령어
lsof -i:8080
로컬 환경에서 k6로 부하 테스트
# k6 스크립트 실행 명령어
k6 run --vus 30 --duration 10s script.js
명령어의 의미를 정리하자.
- --vus 30: 가상 유저(Virtual Users)를 30명으로 설정
- --duration 10s: 지속 시간을 10초로 설정
데이터베이스 성능 수치
Throughput을 확인해보자.
해당 내용만 확인하면 된다.
Http Request를 나타내는 내용으로 10초에 60개의 요청을 처리했다는 의미로, 1초에 3.287141개의 요청을 처리했다는 평균을 나타내주는 것이다.
따라서 Redis 적용 전, 현재 서비스의 게시글 조회 API의 Throughput은 3.2TPS이다.
기존 백그라운드 Spring Boot 서버 중지
# 백그라운드 실행 여부 확인 명령어
lsof -i:8080
# 백그라운드 실행 서버 종료 명령어
kill 5766
Redis 성능 수치
Throughput을 확인해보자.
Http Request의 내용은 10초에 1733개의 요청을 처리했고, 1초에 162.67121개의 요청 처리의 평균이 나왔다.
따라서 Redis 적용 후, 현재 서비스의 게시글 조회 API의 Throughput은 162.6TPS이다.
결과
1초에 3.2개의 요청을 처리하던 게시글 조회 API가 Redis를 적용한 후 1초에 162.6개를 처리할 수 있게 되었다.
계산해보니 50배의 성능 개선이 이루어진 것이다????? 대박이지 않은가!
Reference.
'Redis' 카테고리의 다른 글
[Redis] Docker Compose로 Redis + Spring Boot 띄우기 (AWS) (0) | 2024.10.26 |
---|---|
[Redis] Docker Compose로 Redis + Spring Boot 띄우기 (로컬) (0) | 2024.10.26 |
[Redis] AWS EC2에서 Redis를 활용해보자! (2) (0) | 2024.10.25 |
[Redis] AWS EC2에서 Redis를 활용해보자! (1) (0) | 2024.10.25 |
[Redis] 로컬에서 Spring Boot + Redis 사용해보자! (2) (0) | 2024.10.25 |