K6를 사용하여 부하테스트하기

eunoia73·2025년 3월 6일
2

TIL

목록 보기
17/32
post-thumbnail

1. k6 선택 이유

k6 - JavaScript 코드를 기반으로 테스트를 실행
코드 리뷰 용이, 변경사항 쉽게 추적 가능
테스트 유지보수 편리

JMeter - XML 기반 GUI를 통해 테스트 진행

2. 테스트의 목적

SSE 알림 전송 기능에서 스레드풀, 비동기처리의 유무가 점진적으로 증가하는 트래픽에서 어떻게 동작하는지 확인하고 성능을 분석하기 위함

3. 테스트 시나리오

가상 사용자를 1000명까지 점점 증가시키고 각 단계에서 일정시간 부하를 유지하며 시스템의 성능을 측정한다.

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
    stages: [
        { duration: '1m', target: 100 },   // 1분 동안 100명까지 증가
        { duration: '3m', target: 100 },   // 3분 동안 유지
        { duration: '1m', target: 500 },   // 1분 동안 500명까지 증가
        { duration: '3m', target: 500 },   // 3분 동안 유지
        { duration: '1m', target: 1000 },  // 1분 동안 1000명까지 증가
        { duration: '3m', target: 1000 },  // 3분 동안 유지
    ],
};

export default function () {
    let url = 'http://localhost:8080/api/notification/send';

    let payload = JSON.stringify({
        userId: Math.floor(Math.random() * 5) + 1, // 1~5번 사용자에게 랜덤 전송
        message: `테스트 알림 - ${Math.random().toString(36).substring(7)}`
    });

    let params = {
        headers: {
            'Content-Type': 'application/json',
        },
        timeout: '30s', // 요청이 30초 이상 걸리면 자동 타임아웃
    };

    let res = http.post(url, payload, params);

    // 응답 코드 체크
    let isSuccess = check(res, {
        'is status 200': (r) => r.status === 200,
        'is status 500': (r) => r.status === 500,
        'is status 429': (r) => r.status === 429,
    });

    // 추가 로그 출력
    if (res.status === 500) {
        console.error('서버 오류 발생:', res.body);
    } else if (res.status === 429) {
        console.warn('요청 제한 (Rate Limit) 초과:', res.body);
    }

    sleep(1);
}

K6_WEB_DASHBOARD=true k6 run 파일이름.js
이 명령어를 이용하면 대시보드 확인 가능하다.

4. 테스트 결과

💡 대시보드 용어 정리
Request Rate - 1초당 처리하는 요청 수 (throughput 처리량)
Request Duration - 요청에 대한 응답시간(latency)
Reqeust Failed - 요청 실패 수
p(95) - 전체 요청 중 상위 5%를 제외한 나머지 95%의 요청이 처리된 시간을 나타냄. 시스템의 성능 안정성을 평가하는 중요한 지표

1) 순차처리 시

2) 비동기 스레드 처리 시

5. 성능 비교 분석

지표순차 처리비동기 스레드 처리개선 효과
평균 응답 시간 (avg)9ms1ms9배 감소
최대 응답 시간 (max)529ms115ms4.6배 감소
95퍼센타일 (p95)35ms3ms11.6배 감소
99퍼센타일 (p99)119ms14ms8.5배 감소
  1. 평균 응답 시간 (9ms → 1ms) 9배 감소
    비동기 처리 방식이 동시 처리를 가능하게 하여, 여러 작업을 동시에 처리할 수 있는 효율성을 제공했다고 볼 수 있다.
  2. 최대 응답 시간 (529ms → 115ms) 4.6배 감소
    서버의 대기 시간을 분산시켜 긴 처리 시간을 단축시켰다고 볼 수 있다.
  3. p95 (35ms -> 3ms) 11.6배 감소
    스템의 전체적인 성능 안정성이 향상되었음을 나타낸다.

🗂️ 참고

grafana 공식 문서

https://kingofbackend.tistory.com/289

0개의 댓글