K6 부하테스트 툴 사용법 / EC2 서버에 K6 설치 방법
부하테스트 서버 생성 이유
테스트하려는 시스템과 부하테스트 툴은 반드시 독립적으로 분리해서 구성해야 합니다.
부하테스트 툴이 컴퓨팅 리소스 (CPU, 메모리) 를 사용해서 트래픽을 만들어내기 때문입니다.
Windows 또는 Mac OS 개인 컴퓨터는 부하를 발생시킬 때 제한이 걸릴 때가 종종 있으므로,
부하테스트는 EC2 인스턴스를 생성해 Linux 환경에서 진행하는 것을 권장합니다.
EC2 서버에 K6 설치 방법
K6 설치할 AWS EC2 서버 생성 방법
AWS > EC2 검색 > 인스턴스 시작 버튼 > 이름 : k6-server 입력 > Quick Start : Ubuntu 운영체제 선택 > 인스턴스 유형 : t3a.small (많은 부하를 만들어낼 수 있도록 충분한 사양 인스턴스 유형 선택) 확인 > 키 페어(로그인) : 키 페어 생성 > 다운로드된 키 파일 보관 > 네트워크 설정 : 편집 버튼 클릭 후 인바운드 보안 그룹 규칙 추가 (유형 : 사용자 지정 TCP, 포트 범위 : 5665, 소스 유형 : 위치 무관, 설명 : K6 결과 웹 페이지 실행 포트 허용) > 인스턴스 시작 > 인스턴스 상태가 대기 중에서 실행 중으로 변경되면 서버 연결 가능
테스트 대상 서버와 분리하여, 부하테스트 툴 K6로 부하를 생성할 EC2 인스턴스를 생성합니다.
외부 PC에서 K6 대시보드에 접근하기 위해 K6 웹 대시보드 기본 포트 5665를 방화벽 허용하였습니다.
AWS EC2 서버에 K6 설치 명령어
sudo gpg -k && \
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69 && \
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list && \
sudo apt-get update && \
sudo apt-get install k6
k6 정상 설치 확인
k6
K6 관련 명령어들이 출력되면 정상적으로 설치된 것입니다.
K6 부하테스트 방법
구성한 시스템이 1초당 몇 개의 요청을 견딜 수 있는지 알아보려면,
부하테스트 툴이 점진적으로 트래픽을 늘려가도록 세팅하는 것이 좋습니다.
K6 부하테스트 스크립트 파일 생성
vi script.js
부하테스트 서버에 스크립트 파일을 아래와 같이 생성합니다.
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
// 부하를 생성하는 단계 설정
stages: [
// 지속시간 10분 동안
// 동시에 실행되는 VUs (가상 유저수) 를 점진적으로 증가시켜,
// 마지막 6000 VU에 도달할 때까지 부하를 점점 늘리도록 설정
{ duration: '10m', target: 6000 }
],
};
export default function () {
// 각 VU가 서버 API 주소로 GET 요청
http.get('http://서버외부IP/boards');
// 1초 휴식
sleep(1);
}
운영 환경과 유사한 트래픽을 만드는 부하테스트 스크립트 작성 예시
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
// 부하를 생성하는 단계 설정
stages: [
// 지속시간 10분 동안
// 동시에 실행되는 VUs (가상 유저수) 를 점진적으로 증가시켜,
// 마지막 50 VU에 도달할 때까지 부하를 점점 늘리도록 설정
{ duration: '10m', target: 50 }
],
};
export default function () {
// 0~1 사이 랜덤 값 생성
let random = Math.random();
// 각 VU가 5% 확률로 로드밸런서에 게시글 작성 POST 요청 (약 100번 요청 중 5번)
if (random < 0.05) {
const data = { title: '제목', content: '내용' };
http.post('http://ALB로드밸런서DNS이름/boards', JSON.stringify(data), {
headers: { 'Content-Type': 'application/json' },
});
// 각 VU가 95% 확률로 로드밸런서에 게시글 조회 GET 요청 (약 100번 요청 중 95번)
} else {
http.get('http://ALB로드밸런서DNS이름/boards');
}
// 1초 휴식
sleep(1);
}
POST 5%, GET 95% 정도의 운영 트래픽 패턴을 흉내 내는 부하테스트 예시입니다.
실제 운영 환경에서 발생하는 트래픽과 최대한 비슷하게 부하를 구성해야,
운영 환경과의 차이를 줄이고 부하테스트 결과의 신뢰도를 높일 수 있습니다.
K6 부하테스트 스크립트 실행 명령어
K6_WEB_DASHBOARD=true k6 run script.js
K6를 script.js 파일에 작성한 방식대로 실행시키는 명령어입니다.
K6_WEB_DASHBOARD=true 환경변수를 설정하면,
부하테스트 진행 과정 및 결과 지표를 웹 대시보드에서 실시간으로 확인할 수 있습니다.
환경에 따라 외부 PC에서 대시보드 접근 시 K6_WEB_DASHBOARD_HOST=0.0.0.0 설정이 필요할 수 있습니다.
K6 부하테스트 중단
Ctrl + C
부하테스트를 진행하면서 쓰루풋이 증가하지 않는 정체 구간이 나타날 때까지 기다렸다가,
부하테스트 중단 후 K6 웹 대시보드에서 결과 값을 해석하면 좋습니다.
AWS CloudWatch 대시보드에서 각 서버 지표를 한 눈에 확인하면 병목 지점을 파악하는 데 도움이 됩니다.
K6 웹 대시보드 결과 분석 방법
http://부하테스트서버PublicIP:5665
실시간 VU 수, HTTP 요청 수 (쓰루풋 = http_reqs), 평균 응답시간 (레이턴시 = HTTP Request Duration),
요청 실패율 (HTTP Request Failed) 등 다양한 부하테스트 지표를 확인할 수 있습니다.
실시간으로 볼 수 있는 부하테스트 결과는 기본적으로 10초마다 업데이트됩니다.
시스템 최대 처리량 파악 방법
가상 유저 수는 계속 증가하고 있으나, 쓰루풋이 더 증가하지 않는 정체 구간이 확인되고 ★
레이턴시 증가 및 요청 실패율 상승이 함께 나타나면, 시스템의 최대 쓰루풋에 가까워졌다고 볼 수 있습니다.
시스템 병목 지점에 도달했기 때문에 초당 처리할 수 있는 요청 수가 더 이상 늘어나지 않는 것입니다.
정체 구간에서 http_reqs가 2.7k/s면 초당 약 2,700개의 HTTP 요청이 처리되고 있으며,
현재 시스템의 최대 쓰루풋은 2700 RPS 수준이라고 표현할 수 있습니다.
레이턴시 해석 방법
가상 유저수가 점진적으로 올라가면서 서버가 처리할 수 있는 한계량에 가까워지면,
대기 시간 및 요청 처리 시간이 증가하면서 레이턴시가 높아지는 현상이 나타날 수 있습니다.
요청당 응답 시간이 목표치보다 비정상적으로 높으면 문제가 있는지 확인해야 합니다.
정상적인 응답 시간을 넘어가면 사용자가 이탈할 수 있기 때문에 응답 속도를 개선하는 것이 중요합니다.
요청 실패 확인 방법
HTTP Request Failed가 0/s이면 K6 기준으로 실패 판정된 HTTP 요청이 없다는 뜻입니다.