관리 메뉴

피터의 개발이야기

[k6] k6를 이용한 다중 부하 테스트 설정 및 실행 방법 본문

DevOps

[k6] k6를 이용한 다중 부하 테스트 설정 및 실행 방법

기록하는 백앤드개발자 2024. 12. 17. 23:18
반응형

ㅁ 들어가며

Docker와 PM2 조합에서 성능 지표를 확인하기 위해 공부하면서 [Grafana] grafana k6로 테스트 환경 구성(grafana, influxdb, k6) 을 작성하였다. FFMpeg을 이용한 스트림 서비스의 부하테스트를 수행하면서 HLS와 같은 특수한 경우에 세부적인 부하테스트를 어떻게 할지 고민하면서 작성한 글이다. K6 Doc - Load test types을 보면서 노트형태로 작성했다.

 

ㅁ K6란?

 k6는 가볍고 효율적인 오픈소스 부하 테스트 도구로, JavaScript 기반으로 테스트 스크립트를 작성하여 여러 사용자의 동시 요청을 시뮬레이션할 수 있다. 특히, HLS와 같은 스트리밍 워크로드에 대한 부하 테스트를 효율적으로 실행할 수 있다.

 

ㅁ  k6 설치

# macOS
brew install k6 
# Windows
choco install k6
# ubuntu
sudo apt update && sudo apt install k6

 

 

ㅁ 다양한 테스트 방법

  • Smoke tests : 스크립트가 작동하는지, 시스템이 최소한의 부하에서 적절하게 작동하는지 검증
  • Average-load test : 예상되는 정상 조건에서 시스템의 성능을 평가
  • Stress tests : 부하가 예상 평균을 초과할 때 시스템이 한계에서 어떻게 성능을 발휘하는지 평가
  • Soak tests : 장기간에 걸쳐 시스템의 안정성과 성능을 평가
  • Spike tests :  활동이 갑작스럽고 짧거나 엄청나게 증가하는 경우 시스템의 동작과 생존성을 검증
  • Breakpoint tests : 부하를 점진적으로 증가시켜 시스템의 용량 한계를 파악

 

ㅁ 다중 부하 테스트 스크립트 작성

출처: https://grafana.com/docs/k6/latest/testing-guides/test-types/load-testing/#average-load-testing-in-k6

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

// 부하 테스트 설정
export const options = {
    stages: [
        { duration: '30s', target: 50 }, // 30초 동안 사용자를 50명까지 증가
        { duration: '1m', target: 50 }, // 1분 동안 사용자 50명 유지
        { duration: '30s', target: 0 }, // 30초 동안 사용자를 0명까지 감소
    ],
};

// 테스트 실행 로직
export default function () {
    const url = 'https://example.com/api'; // 테스트할 URL
    const res = http.get(url);

    // 응답 상태 코드 확인
    check(res, {
        '응답 상태 코드가 200이다': (r) => r.status === 200,
    });

    // 요청 간의 간격
    sleep(1);
}

stages 테스트 진행 단계와 목표 사용자 수를 정의한다.

  ㄴ 예를 들어, 위의 설정은 30초 동안 50명까지 사용자 수를 늘리고, 1분 동안 유지한 뒤 점차 줄어든다.

target 해당 단계에서 유지할 동시 사용자 수를 의미한다.

ㅇ 여기 참조 Average-load testing in k6

 

 

ㅁ 테스트 실행

작성한 스크립트를 실행하려면 다음 명령어를 사용한다.

k6 run script.js

 

ㅁ 테스트 결과

테스트를 실행하면 터미널에 다음과 같은 출력이 표시된다.

  • 요청 속도(Req/s)
  • 실패율(Fail %)
  • 응답 시간(HTTP latency)

이 데이터를 통해 서버의 성능을 확인할 수 있다.

 

ㅁ 부하 테스트 스크립트 확장

다중 엔드포인트 테스트나 사용자 행동을 더 세부적으로 정의하고 싶다면 아래와 같은 방법으로 스크립트를 확장할 수 있다.

여러 엔드포인트 테스트

const urls = [
    'https://example.com/api1',
    'https://example.com/api2',
    'https://example.com/api3',
];

export default function () {
    for (const url of urls) {
        const res = http.get(url);
        check(res, {
            '응답이 성공적이다': (r) => r.status === 200,
        });
    }
    sleep(1);
}

ㅇ 여러 URL에 요청을 보내야 하는 경우 배열로 관리한다.

 

사용자의 행동 정의

export default function () {
    // 로그인 요청
    const loginRes = http.post('https://example.com/login', { username: 'test', password: '1234' });
    check(loginRes, { '로그인이 성공적이다': (r) => r.status === 200 });

    // 데이터 요청
    const dataRes = http.get('https://example.com/data');
    check(dataRes, { '데이터 요청이 성공적이다': (r) => r.status === 200 });

    sleep(2); // 행동 간의 간격
}

ㅇ 사용자가 여러 작업을 수행하는 시나리오를 작성할 수도 있다.

 

ㅁ 결과 분석 및 시각화

JSON 파일로 결과 저장

k6 run --out json=output.json script.js

ㅇ 결과를 JSON으로 저장하면 추가 분석이 가능하다.

ㅇ 자세한 내용은 k6 doc - JSON

 

Elasticsearch와 Kibana

# export local url
export K6_ELASTICSEARCH_URL=http://localhost:9200

# run the test
./k6 run script.js -o output-elasticsearch

ㅇ Elasticsearch k6 extension을 이용하여 k6 결과를 Elasticsearch에 저장하고 Kibana로 시각화 할 수 있다.

ㅇ 자세한 내용은 k6 Doc - Elasticsearch

 

Grafana 및 InfluxDB 연동

k6는 Grafana와 InfluxDB를 통해 실시간 대시보드를 구성할 수 있다. 이를 통해 부하 테스트 중 실시간으로 결과를 모니터링할 수 있다.

자세한 건  [Grafana] grafana k6로 테스트 환경 구성(grafana, influxdb, k6)

 

ㅁ 마무리

k6를 활용하면 간단하면서도 유연하게 다중 부하 테스트를 설정할 수 있다. 가벼운 설정과 강력한 결과 시각화 기능을 통해 서버의 안정성과 성능을 검증하는 데 적합하다. k6의 다양한 문서를 흘터 보았는데, 이를 다양한 테스트환경에 도전할 수 있을 것이다.

 

ㅁ 함께 보면 좋은 사이트

 Grafana k6

 

 

반응형
Comments