base

k6을 활용한 성능 테스트

1. k6이란?

k6은 오픈소스 성능 테스트 도구로, Grafana에서 개발 및 관리하며, CNCF(Cloud Native Computing Foundation)에서 운영하는 신뢰성 높은 부하 테스트 프레임워크입니다. 기존의 JMeter와 같은 성능 테스트 도구와 비교하여, 가볍고 생산적인 성능 테스트를 목표로 설계되었으며, 자바스크립트(JavaScript)를 기반으로 한 테스트 스크립트를 작성할 수 있습니다. k6을 활용하면 API, 웹 애플리케이션, 마이크로서비스 등의 성능을 테스트하고, 성능 저하나 확장성 이슈를 조기에 발견할 수 있습니다.


2. k6의 주요 특징

2-1. 높은 확장성과 경량화된 구조

k6은 Go 언어로 작성된 가벼운 실행 환경을 제공하며, 브라우저 기반 테스트 도구보다 훨씬 낮은 리소스 사용량을 보입니다. 덕분에 대규모 부하 테스트에도 적합하며, CI/CD 파이프라인에 쉽게 통합할 수 있습니다.

2-2. JavaScript 기반 테스트 스크립트

테스트 스크립트를 JavaScript로 작성할 수 있어, 개발자 친화적인 환경을 제공합니다. 또한, 다양한 로드 테스트 시나리오(부하 증가, 스트레스 테스트 등)를 손쉽게 정의할 수 있습니다.

2-3. 다양한 부하 테스트 지원

  • 정적 부하 테스트: 일정한 요청 수를 유지하며 성능 측정
  • 점진적 부하 테스트: 시간이 지남에 따라 부하를 증가시키면서 성능을 테스트
  • 스트레스 테스트: 한계치까지 부하를 증가시키면서 시스템의 내구성을 평가

2-4. 통합 모니터링 기능

k6은 성능 데이터를 Prometheus, Grafana, InfluxDB 등과 연동할 수 있어 실시간 성능 모니터링 및 분석이 가능합니다.


3. k6 설치 및 기본 실행

3-1. k6 설치 (MacOS/Linux)

k6
# MacOS
brew install k6 
 
# Ubuntu
sudo apt install k6  

3-2. k6 기본 실행 방법

k6
k6 run script.js

k6을 실행하면 기본적으로 설정된 부하 조건에 맞춰 성능 테스트가 수행됩니다.


4. k6 기본 테스트 예제

4-1. 단순 HTTP 요청 테스트

아래는 기본적인 HTTP 요청 테스트를 수행하는 k6 스크립트입니다.

k6
import http from 'k6/http';
import { sleep } from 'k6';
 
export default function () {
  const url = 'http://localhost:3000/api/test';
  http.get(url);
  sleep(1);
}
 
/**
 * 실행 방법:
 * $ k6 run script.js
 */

이 스크립트는 http.get(url)을 실행하여 HTTP 요청을 수행하고, 1초 동안 대기(sleep)한 후 다시 반복합니다.


4-2. VU(가상 사용자)와 부하 테스트 실행

다음 예제에서는 30초 동안 10명의 가상 사용자(VU, Virtual User)를 생성하여 API 부하 테스트를 수행합니다.

k6
import http from 'k6/http';
import { sleep } from 'k6';
 
export let options = {
  vus: 10,          // 동시 실행 가상 사용자 수
  duration: '30s',  // 테스트 지속 시간
};
 
export default function () {
  const url = 'http://localhost:3000/api/load-test';
  http.post(url, {}, {});
  sleep(1);
}
 
/**
 * 실행 방법:
 * $ k6 run script.js
 */

위 스크립트를 실행하면 10명의 가상 사용자가 30초 동안 API 요청을 지속적으로 보냅니다.


4-3. 점진적 부하 테스트 (Ramp-up)

점진적으로 부하를 증가시키면서, 서비스의 확장성을 평가할 수 있습니다.

k6
import http from 'k6/http';
import { sleep } from 'k6';
 
export let options = {
  vus: 10,          // 동시 실행 가상 사용자 수
  duration: '30s',  // 테스트 지속 시간
};
 
export default function () {
  const url = 'http://localhost:3000/api/load-test';
  http.post(url, {}, {});
  sleep(1);
}
 
/**
 * 실행 방법:
 * $ k6 run script.js
 */

위 스크립트는 초기 10명의 사용자에서 시작하여 50명까지 증가했다가 다시 줄어드는 시뮬레이션을 수행합니다.


5. 성능 측정 및 모니터링

5-1. 기본 성능 지표 확인

테스트를 실행하면 다음과 같은 성능 지표가 출력됩니다.

k6
checks....................: 100.00% ✓ 10 ✗ 0  
http_req_duration........: avg=120ms  min=95ms  max=200ms  
http_req_failed..........: 0.00% ✓ 0 ✗ 10  
vus......................: 10  
  • http_req_duration: 평균 응답 시간 (ms)
  • http_req_failed: 실패한 요청 비율
  • vus: 현재 실행 중인 가상 사용자 수

5-2. Grafana 및 Prometheus 연동

성능 테스트 데이터를 실시간 모니터링하기 위해 Grafana, Prometheus, InfluxDB 등의 외부 모니터링 툴과 연동할 수도 있습니다.

k6
k6 run --out influxdb=http://localhost:8086/mydb script.js

이 명령어를 실행하면 성능 데이터를 InfluxDB에 저장하고, Grafana 대시보드를 통해 시각적으로 분석할 수 있습니다.


6. k6의 실무 활용 사례

k6은 단순한 성능 테스트를 넘어, 실제 운영 환경에서 다음과 같이 활용됩니다.

CI/CD 파이프라인에 성능 테스트 자동화

→ k6 스크립트를 CI/CD 파이프라인에 추가하여, 배포 전 성능 회귀 테스트를 자동으로 수행할 수 있습니다.

API 서버 부하 테스트 및 확장성 검증

→ API의 동시 요청 처리량을 확인하고, 필요 시 오토스케일링 전략을 최적화할 수 있습니다.

마이크로서비스 성능 분석

→ 개별 마이크로서비스의 응답 시간과 트랜잭션 병목을 사전에 식별하여 성능 최적화를 진행할 수 있습니다.


7. 결론

k6은 가볍고 효율적인 성능 테스트 도구로, API, 마이크로서비스, 웹 애플리케이션의 성능을 검증하는 데 최적화되어 있습니다. JavaScript 기반의 테스트 스크립트, 강력한 확장성, 그리고 다양한 모니터링 툴과의 연동이 가능하다는 점에서 기존 성능 테스트 도구 대비 강력한 경쟁력을 갖추고 있습니다.


참고 링크