부하테스트 ‐ (8) 게시글 댓글 목록 페이지 조회 부하테스트 - ttasjwi/board-system GitHub Wiki

부하테스트 계획

  • 게시글 댓글 목록 조회 (페이지) 기능에 대해 부하테스트를 수행해본다.
  • 병목지점을 확인하고 조회 성능을 개선한다.

계획

  • 기존 테스트 데이터 셋팅을 보면
    • 2400만번 게시글에는 댓글이 거의 1200만개( < 사실 비현실적이긴 하다. 어떻게 한 게시글에 댓글이 1200만개 달리나...?)
    • 나머지 게시글에는 0-2개 정도 댓글이 달려 있다.
  • 조회 테스트는 다음과 같이 할 예정이다.
    • 대부분의 사용자는 2400만번 게시글의 댓글을 조회하도록 한다. (1-20 페이지 사이를 조회)
    • 나머지 사용자들은 1-2399만 게시글의 1페이지 댓글을 조회하도록 한다.

부하테스트 파일 작성, 실행

vim script.js
import http from 'k6/http';
import {sleep} from 'k6';

export const options = {
  // 부하를 생성하는 단계(stages)를 설정
  stages: [
    // 10분에 걸쳐 vus(virtual users, 가상 유저수)가 50에 도달하도록 설정
    {duration: '10m', target: 50}
  ],
};

function pickArticleId() {
  const random = Math.random()

  if (random < 0.5) {
    return 24000000;
  }
  // 1 ~ 23999999
  return  Math.floor(Math.random() * 23999998) + 1;
}

function pickRandomPageOfArticle24000000() {
  const rand = Math.random();

  if (rand < 0.95) {
    return 1; // 95%
  } else if (rand < 0.98) {
    return 2; // 다음 3%
  } else {
    // 마지막 2% → 3~20 랜덤
    return Math.floor(Math.random() * 18) + 3; // 3 ~ 20
  }
}
export default function () {
  // API 주소로 GET 요청
  const articleId = pickArticleId()
  const page = (articleId === 24000000) ? pickRandomPageOfArticle24000000() : 1
  http.get(`http://13.125.89.114/api/v1/article-comments?articleId=${articleId}&page=${page}&pageSize=50`);
  sleep(1);
}
K6_WEB_DASHBOARD=true k6 run script.js

실행 결과

image

  • VUs 를 점진적으로 증가시켜봤지만, 초반부터 TPS 가 매우 들쑥날쑥하다.
  • TPS 는 전체적으로 1-1.5 정도를 유지했다.
  • 일부 요청은 타임아웃이 발생했다.
  • latency 는 1분까지 치솟은 적이 있다.

image

  • EC2 CPU 사용률은 크게 안 늘었지만(앞의 46% 까지 치솟은 부분은 배포 당시의 부하로 추정), RDS CPU 사용률이 크게 치솟았다.
  • RDS가 병목지점인 것으로 의심해볼 수 있다.

실제 API 호출해보기

image

  • 게시글Id = 2400만 인 게시글의 댓글 1페이지 (pageSize =50) 을 조회해보니 TimeOut 이 발생했다.
  • 한 API 처리가 1분이 넘도록 안 되고 있는 것을 보아 심각도가 크다.