밸런스 게임 도메인
저희 PICK-O 서비스에선 크게 두가지 주제로 사용자가 글을 작성하거나 조회할 수 있는데요, '톡픽'과 '밸런스 게임'이 그 두가지 입니다.
밸런스 게임의 경우, 한 세트당 10개의 게시글을 작성해야 하며 제목, 상황 설명, 사진 첨부 등을 할 수 있습니다.
밸런스 게임을 조회하는 방법은 현재 4가지가 있습니다.
- 인기순으로 밸런스 게임을 조회
- 태그값을 기준으로 인기순 조회
- 현재 밸런스 게임의 태그값은 취향, 커플, 월드컵이 있습니다.
- 최신순으로 밸런스 게임 조회
- 밸런스 게임 단건 상세조회
따라서, 4가지 API에 대해서 유저가 많은 상황을 가정하여 성능테스트를 진행했습니다.
성능 테스트 툴 선택 기준
저희 팀은 성능 테스트를 k6로 사용하기로 했는데, 결정하기에 앞서 Ngrinder, K6, JMeter을 각자 사용해보고 장단점을 비교해 어떤 것이 더 적합한지 결정했습니다.
체크리스트 기준은 다음과 같습니다.
- 프리티어에서 구동이 가능한가?
- 그라파나와 연동이 쉬운가?
- 직관적인 GUI를 제공하는가?
- 테스트 환경 구성이 쉬운가?
- 테스트 실행이 복잡하지 않은가?
저희는 서버를 프리티어를 통해 구동하고 있고, 그라파나를 통해 로그 모니터링을 진행중입니다.
따라서, 해당 기준을 모두 고려했을 때 k6는 그라파나로부터 나왔기 때문에 연동이 쉽고 직관적인 GUI를 제공할 수 있다고 판단했습니다.
https://grafana.com/docs/k6/latest/
Grafana k6 | Grafana k6 documentation
Grafana Cloud k6 Leverage the k6 OSS capabilities in Grafana Cloud, with built-in dashboards, insights into your application performance, and the ability to bring together teams in one place to resolve issues faster.
grafana.com
또한, 테스트를 실행하는 스크립트 또한 자바스크립트로 간단히 작성할 수 있었기 때문에 최종적으로 k6를 선택했습니다.
성능 테스트 환경설정
저희는 성능 테스트 환경을 다음과 같이 설정했습니다.
- vue (가상 사용자 수): 50
- duration (테스트 지속 시간): 60초
50명이 밸런스 게임 API들을 60초간 조회한다고 가정하고 성능 테스트를 진행했습니다.
더미 데이터 삽입
그리고 성능 테스트를 진행하기에 앞서, 대량의 데이터가 있어야 성능 테스트 결과가 유의미하다고 판단해 10만건의 밸런스 게임 세트 더미 데이터를 삽입했습니다. 대량 데이터 삽입은 MySQL 재귀 쿼리를 통해 진행했습니다.
아까 밸런스 게임 세트에는 총 10개의 밸런스 게임이 존재한다고 말씀 드렸는데, 밸런스 게임에는 또 2개의 게임 선택지가 있습니다.
따라서, 결론적으로 10만개의 밸런스 게임 세트를 생성한다고 했을 때 100만개의 밸런스 게임과 200만개의 밸런스 게임 선택지가 만들어지게 됩니다.
재귀 쿼리를 사용하여 삽입했더니 시간이 꽤 오래 걸렸지만, 성공적으로 더미 데이터들을 저장할 수 있었습니다.
이제 더미 데이터들을 성공적으로 삽입했으니, 성능 테스트를 진행해야겠죠?
앞서 말씀드린 4가지 API에 대해서 성능 테스트를 진행했습니다.
k6와 그라파나 연동
성능테스트를 진행하기에 앞서, k6 성능 테스트의 결과를 그라파나에 띄워주기 위해서 influxDB 를 AWS에 설치했습니다.
그리고, 그라파나의 Data sources에서 influxDB를 연결해 주었습니다.
AWS에 influxDB를 설치할 때 어떤 버전을 사용하고 있는지 체크하는 것이 중요합니다.
InfluxDB 1.x와 같은 경우엔 사용자가 직접 DB를 생성해줘야 합니다.
하지만, InfluxDB 2.x 버전에서는 8086 포트에서 관리 인터페이스를 제공해준다고 합니다.
저같은 경우엔 1.x 버전을 설치했기 떄문에
influx
커맨드를 통해서 콘솔로 진입 후,
CREATE DATABASE k6db
명령어를 통해서 DB를 생성해줘야 했습니다. 그렇지 않은 경우에, 그라파나에서 계속 500에러를 띄워줬습니다.
성능 테스트 결과
- 인기순으로 밸런스 게임을 조회
- 태그값을 기준으로 인기순 조회
- 최신순으로 밸런스 게임 조회
- 밸런스 게임 단건 상세조회
그라파나에서 간편하게 테스트 결과를 그래프와 수치를 통해서 확인함으로써 그라파나와 연동이 쉽고 직관적인 GUI를 제공하는 k6 툴의 편리함을 확인할 수 있었습니다.
성능 테스트를 진행하기 전에, p(95)에 대해서 300ms 이하로 개선하자는 목표를 잡고 진행했습니다.
P(95)가 300ms일 때, 95%의 사용자는 300ms 이하의 응답시간을 경험하고, 5%의 사용자는 300ms를 초과하는 응답시간을 경험했다는 것을 의미합니다.
제가 진행한 성능 테스트 결과를 토대로, p(95)값은
인기순 조회: 5.35s
태그 값을 기준으로 인기순 조회: 9.94s
최신순으로 밸런스 게임 조회: 9.78s
단건 밸런스 게임 조회: 251.95ms
가 나왔습니다.
단건 밸런스 게임 조회 API를 제외하고 3가지 API 응답시간이 목표로 한 300ms보다 아득히 넘은 수치를 기록했습니다.
9초가 되는 시간이 걸렸다는 것은 DB Full Scan을 했다는 것을 의미하는데요, 이 중에서 인기순 조회와 나머지 API의 응답시간이 거의 2배가 가까이 차이가 났습니다.
그 이유는, 인기순 조회는 단순히 GAME_SET 테이블에서 조회를 하는 반면,
태그 값을 기준으로 인기순 조회나 최신순으로 밸런스 게임 조회 API는 MAIN_TAG 테이블과 GAME_SET 테이블을 조인한 뒤에 결과를 반환하기 때문에 부가적인 시간이 소요됐습니다.
응답시간이 5초, 9초가 넘어가는 것은 웹사이트 운영을 하는데 있어서 매우 치명적이고,
저 역시 한명의 웹사이트 사용자로서 응답시간이 길어지는 경우에 참지 못하고 웹사이트를 새로고침 하거나 껐던 경험이 많았습니다.
구글에 따르면, 53퍼센트의 사용자가 3초가 넘는 응답시간을 참지 못하고 떠난다고 합니다. 저희 사이트에서 응답시간이 5초, 10초가 걸린다면 이를 기다릴 사용자는 아무도 없을 것이기 때문에 성능 개선은 선택이 아닌 필수가 되어야 했습니다.
다음 게시글에서는 어떻게 API 성능 향상을 고민하고, 해결했는지 다뤄보도록 하겠습니다.
참고 게시글:
https://community.heartcount.io/ko/query-optimization-tips/
SQL 쿼리 성능 최적화를 위한 튜닝 팁 6가지 (Query Optimization)
보다 효율적인 데이터 검색 및 추출을 위해 필요한 SQL 쿼리 튜닝 방법을 알려 드려요. 실무에서 더 빠르고 효과적으로 데이터를 처리할 수 있도록 하는 꿀팁 6가지에 대해 알아 보세요.
community.heartcount.io
(로그, 메트릭) 모니터링 대시보드가 뭐죠?(2) EC2에 프로메테우스 설치하기
모니터링 정복기 ~ing
velog.io
https://ivanahuckova.medium.com/setting-up-influxdb-v2-flux-with-influxql-in-grafana-926599a19eeb
Setting up InfluxDB v2 (Flux) with InfluxQL in Grafana
In November 2020 InfluxDB released the stable version of open source InfluxDB v2. InfluxDB v2 uses a new v2 API and new Flux data…
ivanahuckova.medium.com
'프로젝트 > PICK-O' 카테고리의 다른 글
OSIV 설정과 지연 로딩 문제 해결 과정 (0) | 2025.02.19 |
---|---|
갑자기 프로젝트가 터져버린 이유? (0) | 2025.02.17 |
JWT토큰과 RefreshToken (0) | 2024.04.19 |
프로젝트에 JWT를 도입하게 된 과정 (0) | 2024.04.19 |