일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- aws
- kotlin querydsl
- CKA
- minikube
- 기록으로 실력을 쌓자
- CKA 기출문제
- Pinpoint
- 오블완
- 정보처리기사실기 기출문제
- Elasticsearch
- 티스토리챌린지
- MySQL
- Linux
- 코틀린 코루틴의 정석
- AI
- kotlin
- 공부
- Spring
- 정보처리기사 실기
- PETERICA
- CloudWatch
- Kubernetes
- kotlin spring
- kotlin coroutine
- APM
- mysql 튜닝
- Java
- IntelliJ
- AWS EKS
- 정보처리기사 실기 기출문제
- Today
- Total
피터의 개발이야기
[k6] k6를 이용한 다중 부하 테스트 설정 및 실행 방법 본문
ㅁ 들어가며
Docker와 PM2 조합에서 성능 지표를 확인하기 위해 공부하면서 [Grafana] grafana k6로 테스트 환경 구성(grafana, influxdb, k6) 을 작성하였다. FFMpeg을 이용한 스트림 서비스의 부하테스트를 수행하면서 HLS와 같은 특수한 경우에 세부적인 부하테스트를 어떻게 할지 고민하면서 작성한 글이다. K6 Doc - Load test types을 보면서 노트형태로 작성했다.
ㅁ K6란?
k6는 가볍고 효율적인 오픈소스 부하 테스트 도구로, JavaScript 기반으로 테스트 스크립트를 작성하여 여러 사용자의 동시 요청을 시뮬레이션할 수 있다. 특히, HLS와 같은 스트리밍 워크로드에 대한 부하 테스트를 효율적으로 실행할 수 있다.
ㅁ k6 설치
# macOS
brew install k6
# Windows
choco install k6
# ubuntu
sudo apt update && sudo apt install k6
ㅁ 다양한 테스트 방법
- Smoke tests : 스크립트가 작동하는지, 시스템이 최소한의 부하에서 적절하게 작동하는지 검증
- Average-load test : 예상되는 정상 조건에서 시스템의 성능을 평가
- Stress tests : 부하가 예상 평균을 초과할 때 시스템이 한계에서 어떻게 성능을 발휘하는지 평가
- Soak tests : 장기간에 걸쳐 시스템의 안정성과 성능을 평가
- Spike tests : 활동이 갑작스럽고 짧거나 엄청나게 증가하는 경우 시스템의 동작과 생존성을 검증
- Breakpoint tests : 부하를 점진적으로 증가시켜 시스템의 용량 한계를 파악
ㅁ 다중 부하 테스트 스크립트 작성
import http from 'k6/http';
import { check, sleep } from 'k6';
// 부하 테스트 설정
export const options = {
stages: [
{ duration: '30s', target: 50 }, // 30초 동안 사용자를 50명까지 증가
{ duration: '1m', target: 50 }, // 1분 동안 사용자 50명 유지
{ duration: '30s', target: 0 }, // 30초 동안 사용자를 0명까지 감소
],
};
// 테스트 실행 로직
export default function () {
const url = 'https://example.com/api'; // 테스트할 URL
const res = http.get(url);
// 응답 상태 코드 확인
check(res, {
'응답 상태 코드가 200이다': (r) => r.status === 200,
});
// 요청 간의 간격
sleep(1);
}
ㅇ stages는 테스트 진행 단계와 목표 사용자 수를 정의한다.
ㄴ 예를 들어, 위의 설정은 30초 동안 50명까지 사용자 수를 늘리고, 1분 동안 유지한 뒤 점차 줄어든다.
ㅇ target는 해당 단계에서 유지할 동시 사용자 수를 의미한다.
ㅇ 여기 참조 Average-load testing in k6
ㅁ 테스트 실행
작성한 스크립트를 실행하려면 다음 명령어를 사용한다.
k6 run script.js
ㅁ 테스트 결과
테스트를 실행하면 터미널에 다음과 같은 출력이 표시된다.
- 요청 속도(Req/s)
- 실패율(Fail %)
- 응답 시간(HTTP latency)
이 데이터를 통해 서버의 성능을 확인할 수 있다.
ㅁ 부하 테스트 스크립트 확장
다중 엔드포인트 테스트나 사용자 행동을 더 세부적으로 정의하고 싶다면 아래와 같은 방법으로 스크립트를 확장할 수 있다.
여러 엔드포인트 테스트
const urls = [
'https://example.com/api1',
'https://example.com/api2',
'https://example.com/api3',
];
export default function () {
for (const url of urls) {
const res = http.get(url);
check(res, {
'응답이 성공적이다': (r) => r.status === 200,
});
}
sleep(1);
}
ㅇ 여러 URL에 요청을 보내야 하는 경우 배열로 관리한다.
사용자의 행동 정의
export default function () {
// 로그인 요청
const loginRes = http.post('https://example.com/login', { username: 'test', password: '1234' });
check(loginRes, { '로그인이 성공적이다': (r) => r.status === 200 });
// 데이터 요청
const dataRes = http.get('https://example.com/data');
check(dataRes, { '데이터 요청이 성공적이다': (r) => r.status === 200 });
sleep(2); // 행동 간의 간격
}
ㅇ 사용자가 여러 작업을 수행하는 시나리오를 작성할 수도 있다.
ㅁ 결과 분석 및 시각화
JSON 파일로 결과 저장
k6 run --out json=output.json script.js
ㅇ 결과를 JSON으로 저장하면 추가 분석이 가능하다.
ㅇ 자세한 내용은 k6 doc - JSON
Elasticsearch와 Kibana
# export local url
export K6_ELASTICSEARCH_URL=http://localhost:9200
# run the test
./k6 run script.js -o output-elasticsearch
ㅇ Elasticsearch k6 extension을 이용하여 k6 결과를 Elasticsearch에 저장하고 Kibana로 시각화 할 수 있다.
ㅇ 자세한 내용은 k6 Doc - Elasticsearch
Grafana 및 InfluxDB 연동
k6는 Grafana와 InfluxDB를 통해 실시간 대시보드를 구성할 수 있다. 이를 통해 부하 테스트 중 실시간으로 결과를 모니터링할 수 있다.
자세한 건 [Grafana] grafana k6로 테스트 환경 구성(grafana, influxdb, k6)
ㅁ 마무리
k6를 활용하면 간단하면서도 유연하게 다중 부하 테스트를 설정할 수 있다. 가벼운 설정과 강력한 결과 시각화 기능을 통해 서버의 안정성과 성능을 검증하는 데 적합하다. k6의 다양한 문서를 흘터 보았는데, 이를 다양한 테스트환경에 도전할 수 있을 것이다.
ㅁ 함께 보면 좋은 사이트
'DevOps' 카테고리의 다른 글
[DevOps] Bamboo: DevOps와 CI/CD를 위한 강력한 도구 (0) | 2024.12.17 |
---|---|
TinyStatus란, 간단하고 가벼운 상태 페이지 만들기 (0) | 2024.11.17 |
네트워크 레이아웃에서 SSL이란? (0) | 2024.06.20 |
[HeyForm] HeyForm 구축하여 local에서 사용해보기, 메일서버가 필요 실패 (0) | 2024.04.04 |
[HeyForm] docker로 HeyForm 설치하기 (0) | 2024.04.04 |