1. K6

grafana - K6

 

  • K6 는 확장 가능한 오픈 소스 부하 테스트 도구이다.
  • K6 를 통해 애플리케이션과 인프라 안정성, 성능을 테스트할 수 있으며, 이를 통해 탄력적인 애플리케이션 구축을 지원한다.

(1) Use Case

K6 사용자는 개발자, QA 엔지니어, SRE 등이 대상이다.

  1. 부하 및 성능 테스트 : spike, stress, soak test 와 같은 고부하 성능 테스트를 지원한다.
  2. 브라우저 성능 테스트 : K6 브라우저 API 를 통해 브라우저 기반 성능 테스트 실행 및 메트릭을 수집해 성능 문제를 파악할 수 있다.
  3. 성능 및 종합 모니터링 : 최소한의 부하로 자주 테스트 실행이 가능하고 K6 스크립트 실행을 지원하는 Grafana Cloud 종합 모니터링을 사용할 수 있다.
  4. 성능 테스트 자동화 : CI/CD 및 자동화 도구와 원활하게 통합되어 성능 테스트 자동화가 가능하도록 지원한다.
  5. 카오스 및 복원력 테스트 : 카오스 실험의 일부로 트래픽을 시뮬레이션하거나, 테스트에서 트리거, 다양한 유형의 결함을 주입할 수 있다.
  6. 인프라 테스트 : k6 새로운 프로토콜에 대한 지원 추가하거나 특정 클라이언트를 사용해 인프라 내 개별 시스템을 직접 테스트할 수 있다.

 

2. Installation

  • K6 는 linux, mac, window 를 지원한다.
  • Docker 컨테이너로 실행할 수 있다.

(1) Fedora/CentOS

sudo dnf install <https://dl.k6.io/rpm/repo.rpm>
sudo dnf install k6

(2) Mac OS

brew install k6

 

(3) Docker

docker pull grafana/k6

 

3. K6 실행하기

(1) script.js 파일 생성 및 기본 코드 작성

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

export default function () {
  http.get('<https://test.k6.io>');
  sleep(1);
}

 

(2) k6 커맨드 실행

$ k6 run script.js
docker run --rm -i grafana/k6 run - <script.js

 

(3) 실행 결과 (표준 출력)

  1. data_received : 전달 받은 데이터 양
  2. data_sent : 전달된 데이터 양
  3. http_req_blocked : 요청을 시작하기 전 블록된 시간
  4. http_req_connecting : 원격 호스트와 TCP connection 을 수립하기 위한 시간
  5. http_req_duration : 요청을 위한 총 시간(http_req_sending + http_req_waiting + http_req_receiving)
  6. http_req_failed : 설정된 응답 콜백에 따른 실패한 요청의 비율
  7. http_req_receiving : 원격 호스트에서 응답 데이터를 수신하는데 걸린 시간이다.
  8. http_req_tls_handshaking : 원격 호스트와 TLS 세션 핸드셰이킹에 소요된 시간
  9. http_req_waiting : 원격 호스트의 응답을 기다리는 데 걸린 시간 (TTFB)
  10. http_reqs : k6가 생성한 총 HTTP 요청 수
  11. iteration_duration : setup 및 teardown 에 소요된 시간을 포함하여 하나의 전체 반복을 완료하는 데 걸리는 시간
  12. iterations : VU가 JS 스크립트(기본 함수)를 실행한 총 횟수
  13. vus : 현재 활성된 VUser 수
  14. vus_max : 가능한 최대 VUser 수

 

(4) 실행 결과 출력하기

  • —out 옵션을 통해 원하는 대상 지정이 가능하다.
k6 run \\
--out json=test.json \\
script01.json
{
  "metric": "vus",
  "type": "Point",
  "data": {
    "time": "2024-12-04T16:28:24.627428+09:00",
    "value": 1,
    "tags": {}
  }
}
{
  "type": "Metric",
  "data": {
    "name": "vus_max",
    "type": "gauge",
    "contains": "default",
    "thresholds": [],
    "submetrics": null
  },
  "metric": "vus_max"
}
{
  "metric": "vus_max",
  "type": "Point",
  "data": {
    "time": "2024-12-04T16:28:24.627428+09:00",
    "value": 1,
    "tags": {}
  }
}
...

 

Reference