본문 바로가기
Tools

k6를 이용한 부하테스트 방법

by devLog by Ronnie's 2023. 3. 8.

k6는 Grafana Labs에서 만든 부하 테스트 툴로 API 엔드포인트에 대한 성능 테스트 도구로 사용되며 오픈소스이다.

부하테스트 및 테스트 시나리오를 자바스크립트 코드 기반으로 작성하여 재사용성과 가독성이 좋다. (타입스크립트로도 작성 가능)

 

k6 의 설치 방법과 부하테스트 방법에 대해서 정리한다.

 

k6를 이용한 부하테스트 방법

 

k6를 이용한 부하테스트 방법

 

설치


다음 명령어를 통해 설치가 가능하다. (Mac OS 기준)

brew install k6

 

OS가 다르다면 아래 문서를 참고하여 설치해준다.

https://k6.io/docs/get-started/installation/

 

Installation

k6 has packages for Linux, Mac, and Windows. As alternatives, you can also using a Docker container or a standalone binary.

k6.io

 

k6를 이용한 부하 테스트 방법


먼저 간단히 테스트 플로우를 그려보자면 테스트 코드 작성 (JS or TS) -> terminal 접속하여 해당 코드 k6 run -> 테스트 결과 값 확인

순으로 테스트 플로우는 간단하다.

 

그 중 제일 중요한 테스트 코드 작성 방법에 대해서 알아본다.

 

 

테스트 코드 작성


먼저 아래 코드는 http 통신에서 가장 기본이 되는 테스트 코드 두가지이다.

 

get

import http from 'k6/http';

export default function () {

	http.get('https://test.k6.io');

}

post

import http from 'k6/http';

export default function () {

	const url = 'http://test.k6.io/login';

	const payload = JSON.stringify({

		email: 'aaa',

		password: 'bbb',

	});

	const params = {

		headers: {

			'Content-Type': 'application/json',

		},

	};

	http.post(url, payload, params);

}

여기서 get(), post() 이외에도 다양한 HTTP 요청에 대한 테스트가 가능하다.

자 그럼 가장 기본이 되는 get() 요청에 대한 스크립트를 작성 후 k6 run script.js(ts) 테스트를 실행해보자.

 

k6 run [script 명] 을 통해 실행을 하게 되면 다음과 같이 테스트 스크립트에 대한 결과 값을 보여준다.

이번에는 시나리오 작성을 통한 부하테스트의 예시를 알아본다.

import http from "k6/http" // http test

import { sleep } from "k6" // sleep 기능 사용 시 추가 (sleep(n) -> 지정한 n 기간 동한 VU 실행을 일시 중지)

export let options = {

	vus: 10,          // 가상의 유저 수

	duration: '1m'   // 테스트 진행 시간

};

const BASE_URL = '테스트 URL';

export default function () {

	let getUrl = BASE_URL

	http.get(getUrl);

	sleep(1);

}

다음과 같이 작성하게 되면 유저 10명이 1분 간 BASE_URL에 대한 API 테스트가 진행된다.

 

duration에서 1m은 1분을 의미하며 30s 와 같이 초로도 변경이 가능하다.

 

자 이제 해당 스크립트를 실행하게 되면 다음과 같이 1분간 실행되고 있는 모습을 확인할 수 있다.

테스트가 종료되면 동일하게 결과값을 출력해준다.

 

 

추가적으로 조금 더 다양한 시나리오의 예시를 확인하고 싶다면 아래 k6 공식 문서를 참고해보자.

https://k6.io/docs/using-k6/scenarios/advanced-examples/

 

Advanced Examples

Advanced Examples using the k6 Scenario API - Using multiple scenarios, different environment variables and tags per scenario.

k6.io

 

그리고 여기서 여러가지 정보들이 나오는데 각 항목별 내용은 다음과 같다.

 

아래 항목은 k6에서 항상 수집하는 항목에 대한 설명이다.

Matric Name Type Description
vus Gauge 현재 활성화된 사용자 유저
vus_max Gauge 가능한 최대 가상 사용자 (로드 레벨을 확장할 성능에 영향을 미치지 않도록 VU 리소스가 미리 할당됨)
iterations Counter 테스트에서 Vu JS 스크립트를 실행한 횟수
iteration_duration Trend default/main function 전체 반복을 완료하는데 소요된 시간
dropped_iterations Counter k6 v0.27.0 도입된 VU lack 또는 lack of time 으로 인해 시작할 없는 반복 회수
data_received Counter 데이터를 전달받은
data_sent Counter 데이터를 전달한
checks Rate 성공적으로 체크된 Rate

 

아래 항목은 http 와 관련된 항목에 대한 설명이다.

Matric name Type                  Description
http_reqs Counter 얼마나 많은 HTTP requests k6 에서 생성했는지 횟수
http_req_blocked Trend 요청을 시작하기 전에 차단된 시간(TCP connection slot 기다리는) 단위: float
http_req_connecting Trend 원격 호스트에 대한 TCP 연결을 설정하는데 소요된 시간. 단위: float
http_req_tls_handshaking Trend 원격 호스트와의 핸드셰이킹 TLS 세션에 소요된 시간
http_req_sending Trend 원격 호스트에 데이터를 보내는데 소요된 시간
http_req_waiting Trend 원격 호스트로부터의 응답을 대기하는 소요된 시간(a.k.a. "time to first byte", or "TTFB").
http_req_receiving Trend 원격 호스트로부터 응답 데이터를 수신하는 소요된 시간
http_req_duration Trend 요청의 시간입니다. 이는 http_req_sending + http_req_waiting + http_req_receiving 같습니다(, 초기 DNS 조회/연결 시간 없이 원격 서버가 요청을 처리하고 응답하는 소요된 시간).
http_req_failed Rate The rate of failed requests according to setResponseCallback.

 

테스트 결과물 출력


—out 옵션을 사용하면 테스트 결과에 대해서 출력을 할 수 있다.

 

AWS CloudWatch, Grafana Cloud, Prometheus, Datadog, New Relic, K6 Cloud, InfluxDB, CSV, JSON 등 여러가지 형태를 지원한다.

 

예를 들어 다음과 같이 실행을 하면 json 형태 파일로 결과값이 생성된다.

 

또한 html 로도 내보낼 수 있는 기능이 있다.

 

먼저 기존 코드에 다음 두가지 항목을 추가 해준다.

 

//상단의 추가
import { htmlReport } from "https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js";

//하단의 추가
export function handleSummary(data) {

	return {

		"summary.html": htmlReport(data),

	}

}

이렇게 스크립트에 추가 후 실행하면 다음과 같이 summary.html 파일을 확인할 수 있다.

html 파일을 열어 다음과 같이 확인이 가능하다.

 

추가 Tip


만약 성능 테스트를 진행하고픈 API 가 postman 이나 swagger를 통해 작성된 것이 있다면 k6에서 k6용 script로 변환해주는 툴도 제공하고 있어서 아래 문서를 참고하여 진행해보는 것도 도움이 될 것이다.

 

Swaager

https://k6.io/blog/load-testing-your-api-with-swagger-openapi-and-k6/

 

Load Testing Your API with Swagger/OpenAPI and k6

Generating k6 scripts from Swagger/OpenAPI specifications has never been easier. Using the newly built k6 generator, you can convert your API specification to a k6 script and use it to load test your API.

k6.io

Postman

https://k6.io/blog/load-testing-with-postman-collections/

 

Load Testing Your API with Postman

How to use postman collections in k6?

k6.io

 

기존에는 JMeter를 통해서 부하테스트를 진행하였는데 이번에 알게 된 k6를 사용해보니 좀 더 다양하게 테스트를 진행할 수 있어 좋았던 것 같다.

 

그리고 무엇보다 테스트에 대한 내용을 코드로 작성하여 관리할 수 있는 점도 한 몫한 것 같다.

 

k6 공식 문서가 정리가 너무 잘되어 있어 부족한 부분이나 추가적으로 필요한 부분들은 아래 공식 문서를 통해 확인해보면 될 것 같다.

 

관련글


VisualVM을 통한 원격 서버 JVM 모니터링

 

VisualVM을 통한 원격 서버 도커 내 JVM 성능 모니터링

메모리 관련 이슈가 발생하여 (java.lang.OutOfMemoryError: Java heap space) 원인 분석을 위해 VisualVM을 사용하였고 해당 내용을 정리한다. OutOfMemoryError: Java heap space 가 발생한다면 힙 메모리의 사이즈를 늘

sjparkk-dev1og.tistory.com

JMeter를 이용한 API 성능 테스트

 

JMeter 를 이용한 API 성능 테스트

API 성능 테스트가 필요할 때 사용할 수 있는 여러 툴 중에서 JMeter를 이용한 테스트 방법에 대해서 정리한다. JMeter에 대한 기본 개념과 설치 방법 및 테스트 방법에 대해서 알아보자. JMeter 를 이

sjparkk-dev1og.tistory.com

 

 

참고


k6 공식 문서

https://k6.io/docs/

 

k6 Documentation

The k6 Documentation helps you to use k6 to get your performance testing on the right track. Learn more about load and performance testing. Get started in minutes.

k6.io

k6 api

https://k6.io/docs/javascript-api/

 

k6 JavaScript API

This page provides the documentation of the k6 JavaScript API.

k6.io

https://jiyeonseo.github.io/2022/09/11/k6-get-started/

 

k6 부하 테스트 툴 | Daily Log

k6 부하 테스트 툴 k6 (opens new window)는 Grafana Lab에서 만든 load testing 툴로 API endpoint에 대한 성능 테스트를 쉽게 할수 있도록 도와준다. 특히, 기존에 Grafana를 쓰고 있었다면 연결하여 시각화도 잘

jiyeonseo.github.io

 

댓글