Post

[ 성능 테스트 ] 2. k6로 내 사이트 성능 알아보기

[ 성능 테스트 ] 2. k6로 내 사이트 성능 알아보기

이번 포스트부터는 k6로 부하 테스트를 진행하는 과정을 포스팅하고자 한다.


테스트 목적

  • 동시접속 1000명 이상 상황에서 API 응답 성능 검증
  • 95백분위 응답 시간 3초 이내 유지
  • 에러율 1% 미만 보장 확인

테스트 환경 및 시나리오

  • 대상: http://localhost:8080/api/schedule/recom
  • 인증: Bearer 토큰 포함, JSON 헤더 세팅
  • 부하 단계:
    • 1분간 0 → 1000 VU(가상 사용자) 증가
    • 3분간 1100 VU 유지

테스트 스크립트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
export let options = {
  stages: [
    { duration: '1m', target: 1000 },
    { duration: '3m', target: 1100 },
  ],
  thresholds: {
    'http_req_duration{type:API}': ['p(95)<3000'],
    'http_req_failed': ['rate<0.01'],
  },
};

const DEFAULT_HEADERS = {
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`,
  },
  tags: { type: 'API' },
};

export default function () {
  let res = http.get(`${BASE_URL}/recom`, DEFAULT_HEADERS);
  check(res, { 'status 200': (r) => r.status === 200 });
}
  • 부하 증가와 유지 구간으로 시나리오 설계
  • 95백분위 응답 시간과 실패율 기준으로 성능 검증
  • 실제 서비스와 동일하게 토큰 인증 적용

테스트 결과

k6 테스트 결과 요약 표

  • 응답 시간: 평균 3.24초, 중앙값 2.94초로 대부분 요청은 빠르게 처리됐다.
  • 최대 응답 시간은 6.55초까지 측정되어 일부 요청에서 지연이 발생했다.
  • 90백분위 응답 시간(p90)은 4.98초, 95백분위(p95)는 5.59초로, 상위 5% 요청에서 성능 저하가 나타났다.
  • 성공률은 100%로 실패 요청은 없었다.
  • 부하 지표: 총 요청 10,295건, 초당 약 151건을 처리했고, 가상 사용자 수는 최소 167명에서 최대 500명까지 분포했다.

결론

이번 테스트에서 설정한 성능 목표는 다음과 같았다.

  • 95백분위 응답 시간(p95): 3초 이하
  • 실패 요청 비율: 1% 미만

테스트 결과를 보면,

  • 평균 응답 시간은 3.24초로 목표에 근접했으나 약간 초과했다.
  • 95백분위 응답 시간은 5.59초로 목표인 3초를 크게 넘어섰다. 이는 상위 5% 요청에서 성능 병목이 있음을 의미한다.
  • 실패 요청 비율은 0%로 목표를 충분히 충족했다.
  • 부하 상황에서 최대 500명 동시 사용자를 시뮬레이션했고, 초당 151건의 요청을 처리했다.

따라서, 현재 상태로는 안정적인 요청 처리와 낮은 실패율은 확보했으나, 고부하 구간에서의 응답 지연 문제를 해결하는 것이 우선 과제임을 확인했다.

향후 95백분위 응답 시간을 목표 이하로 낮출 수 있도록 API 최적화나 인프라 확충을 검토할 필요가 있다.

This post is licensed under CC BY 4.0 by the author.