[Grafana k6] 옵션(option)과 시나리오(scenario)를 통한 테스트 실행 조건 구성

 

k6란?

k6는 그라파나 랩스(Grafana Labs)에서 개발 및 운영 중인 오픈 소스 도구로, 개발자 친화적으로 부하 테스트를 수행할 수 있도록 돕는 도구이다.

k6는 내부적으로 Go언어의 gorutine(go의 경량화된 가상 스레드)을 기반으로 동작하는데, 이러한 점 덕분에 싱글 스레드 내에서 비동기로 가상 유저의 동시 요청을 수행하여 다른 멀티 스레드 기반 도구들에 비해 시스템 리소스를 효율적으로 사용할 수 있다는 특징이 있다.

또한, 자바스크립트 문법으로 작성되는 스크립트를 기반으로 동작하여, 개발자는 k6 문법과 사용법에 대한 러닝커브만 감당하면 별도 언어를 학습할 필요가 없다는 장점도 있다.

이번 글에서는 이 k6의 실행 조건을 구성하는 설정값인 option에 어떤 정보들이 들어갈 수 있는지 알아보고, option의 한계점과 이를 보완하기 위한 설정값인 Scenario에는 어떤 종류가 있는지 살펴본다.

 

 

k6 Options

k6 스크립트 구조와 테스트 생명주기

k6의 option에 대해 이해하기 위해, 먼저 k6 스크립트가 어떻게 구성되는지, 이를 기반으로 실행되는 테스트의 생명주기는 어떠한지를 살펴보자.

k6 스크립트의 구조는 아래와 같다.

// 1. Init (required)
import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  ...
};

// 2. Setup (optional)
export function setup() {
  ...
}

// 3. VU code (required)
export default function (data) {
  ...
}

// 4. Teardown code (optional)
export function teardown(data) {
  ...
}

이 구조를 기반으로, k6 테스트는 아래와 같은 생명주기를 갖는다.

  1. Init - 스크립트를 로드하며 모듈 import, 변수 및 함수 선언을 수행 (VU 당 1회)
  2. Setup - 필요한 데이터 셋업 등 VU 간 공유 자원을 설정
  3. Run Test(VU code) - 실제 테스트를 수행하는 코드. 모든 VU가 주어진 횟수만큼 반복 실행
  4. Teardown - 자원 정리 및 결과 처리 등을 수행하는 코드

Init 단계에서 선언되는 이 options 객체는 k6 테스트의 실행 조건을 설정하는 객체이다.

export const options = {
  ...
};

이 options 객체는 테스트 실행주기 전반(setup, vu code, teardown) 전반에 영향을 미치며, 내부에 설정된 값이 무엇이냐에 따라 몇 명의 VU가 VU code를 몇 번 실행하며 테스트의 성공/실패를 어떻게 판단할지 등이 결정된다.

Option 값의 종류

주요 옵션값으로는 아래와 같은 것들이 있다.

export const options = {
  vus: 100, // 100명의 가상 유저
  duration: '1m', // 최대 1분 동안 테스트 실행
  iterations: 10, // 10회 반복
  thresholds: {
    http_req_failed: ['rate<0.01'], // 실패율이 1% 미만이고
    http_req_duration: ['p(95)<200'], // 95%의 요청이 200ms 미만을 보장해야 테스트를 성공으로 간주
  },
};
  • vus: 가상 유저(virtual user) 수
  • duration: 테스트 실행 시간
  • iterations: 반복 횟수
  • thresholds: 테스트 성공 기준 (별도 syntax를 가지며, 이는 공식 문서의 Thresholds 섹션 참고)
개인적으로 duration이라는 변수명은 maxDuration(해당 시간 후에는 강제로 테스트가 종료됨)인지 minDuration(해당 시간만큼은 반드시 테스트가 실행됨)인지를 나타내기에는 모호한 표현이라고 생각한다.
어쨌든 의미는 maxDuration에 해당하며, 테스트의 종료 시간을 제어하는 설정값이라고 이해하면 된다.
이 max의 제약 또한 전체 생명주기에 대한 제약인지, VU code에 대한 제약인지도 모호할 수 있는데, duration 설정값은 전체 k6 테스트 생명주기가 아닌 VU code에 한정된다. 즉, duration을 1초로 설정했을 때 1초가 지나면 VU code의 실행 횟수가 남아있다고 하더라도 더이상 실행되지 않으며, 대신 실행 중인 VU code의 정상 종료 및 teardown 과정은 기다려준다.

 

이외의 더 다양한 옵션값들은 k6 공식 문서의 options reference 섹션을 참고하면 된다.

 

Options reference | Grafana k6 documentation

Options reference Options define test-run behavior. Most options can be passed in multiple places. If an option is defined in multiple places, k6 chooses the value from the highest order of precedence. Quick reference of options Each option has its own det

grafana.com

 

 

k6 Scenarios

Option의 한계점과 Scenario

단순 option 값들을 이용할 경우, 아래와 같은 문제점이 발생한다.

  • 일정한 패턴으로만 요청할 수 있다.
  • 유저 수, 요청 횟수 정도의 제한된 요소만 기준으로 삼을 수 있다. (“초당 N회 요청” 같은 기준을 잡기 어려운데, 대부분의 부하 테스트에서는 이런 지표를 더 중요시 여긴다.)

k6에서는 이러한 문제점을 해소하고 더 세부적으로 테스트 실행 조건을 컨트롤하기 위해 Scenarios 라는 옵션값을 제공한다.

k6의 Scenarios를 사용하면, 여러 시나리오를 구성하여 하나의 스크립트 내에서 여러 유형의 트래픽 패턴을 구성할 수 있다. 이를 통해 더 실제에 가까운 부하를 발생시키고 측정할 수 있다는 이점이 있다.

각 시나리오에는 반드시 executor가 할당되어야 하는데, k6에서는 다양한 트래픽 유형에 맞는 executor를 제공한다.

Scenarios executor의 종류

주요 executor로는 아래와 같은 것들이 있다. 각 executor가 어떤 요소를 기준으로 테스트를 수행하고자 하는지에 집중하여 살펴보자.

export const options = {
  scenarios: {
    my_first_scenario: {
      executor: 'shared-iterations',
    },
  }
}
  • shared-iterations: 정해진 반복 횟수를 여러 가상 유저가 공유 (기준: 전체 실행 횟수)
  • per-vu-iterations: 각 가상 유저가 일정 횟수만큼 반복 실행 (기준: 유저별 실행 횟수)
  • constant-vus: 일정한 가상 유저를 유지하며 테스트 수행 (기준: 일정한 유저 수)
  • ramping-vus: 점진적으로 가상 유저 수를 증가/감소하며 테스트 수행 (기준: 점진적 유저 수)
  • constant-arrival-rate: 초당 일정 요청 수(RPS)를 보장하며 테스트 수행 (기준: 일정한 초당 요청 수)
  • ramping-arrival-rate: 초당 점진적 요청 수(RPS)를 보장하며 테스트 수행 (기준: 점진적 초당 요청 수)
  • externally-controlled: 외부에서 k6 REST API, k6 cli 등을 통해 부하를 제어 (기준: 외부 제어)

또한, 이 executor마다 기준으로 하는 요소가 다른 만큼 필요로 하는 옵션값도 다르다. 이 글에서는 각 시나리오별 세부 옵션값은 다루지 않으며, 세부 옵션값이 궁금하다면 공식문서의 각 executor별 세부 설명을 참고하라.

 

Executors | Grafana k6 documentation

User-centered observability: load testing, real user monitoring, and synthetics Learn how to use load testing, synthetic monitoring, and real user monitoring (RUM) to understand end users' experience of your apps. Watch on demand.

grafana.com

 

 

요약

  • k6의 option은 k6 테스트 생명주기 전체에 영향을 미치는 테스트 실행 조건 정의 객체이다.
  • option으로는 일정한 패턴, 제한된 기준만을 제어할 수 있어 제약이 따른다.
  • 더 다양한 기준, 다양한 패턴으로 테스트를 구성하고 싶다면 scenario를 이용하면 된다.