부하 테스트란?
부하 테스트는 시스템, 애플리케이션, 또는 네트워크가 실제 운영 환경에서 예상되는 부하 하에서 어떻게 작동하는지 평가하는 과정. 이러한 테스트를 통해 성능 문제를 식별하고, 시스템의 용량 한계를 이해할 수 있음.
부하 테스트 종류:
스모크 테스트(Smoke Test)
- 최소 부하 상태에서 시스템에 오류가 발생하는지 확인하는 테스트
- 가장 기본적인 부하 테스트로, 시스템이 기본 기능을 수행할 수 있는지 확인.
- VUser:1~2로 구성
로드 테스트(Load Test)
- 시스템이 정상적인 하중 조건에서 어떻게 수행하는지 평가. 이는 시스템의 처리 능력과 응답 시간을 측정하는 데 사용됨.
- 적절한 부하를 발행시켜 통계적으로 의미있는 수치를 측정하는 테스트
- 발생시키는 부하는 실제 시스템에 적용될 예상 트래픽이어야 한다.
- 서비스의 평소 트래픽과 최대 트래픽 상황의 성능 테스트
- 평균 VUser
- 최대 VUser
- 부하 테스트의 목표는 향후 예상되는 애플리케이션 로드를 관리할 수 있도록 데이터 베이스, 하드웨어, 네트워크 등과 같은 애플리케이션의 모든 구성 요소에 대한 상한을 결정
스트레스 테스트(Stress Test)
- 시스템이 과부하 상태에서 어떻게 작동하는지를 검사하는 테스트
- 스템이 과부하 상태에서 어떻게 작동하는지 확인. 이 테스트는 시스템의 한계점을 찾는 데 도움이 됨.
- 무조건 문제가 발생할 수 밖에 없는 테스트
- 점진적으로 부하를 증가시켜 한계점 확인
- 한계점은 변곡점이라고 생각할 수도 있고, 실제 에러가 발생한 지점이라고 볼 수도 있음
K6를 이용한 부하테스트
K6란?
- k6는 주로 HTTP/HTTPS 요청을 통한 성능 및 부하 테스트에 중점을 두는 도구
설치
- Mac
1
brew install k6
- Node.js 기반
1
npm install -g k6
실행
실행을 위해 우선
k6_script.js파일을 만들어준다.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 32 33 34
import http from 'k6/http'; import { check, sleep } from 'k6'; export let options = { vus: 10, // 가상 사용자 수 duration: '1m', // 테스트 지속 시간 }; export default function () { let url = 'http://localhost:8080/api/ex1'; let payload = JSON.stringify({ page: 1, per: 30, bksRandomYsno: "N", evntId: 95905, evntPageMenuNum: 1646 }); let params = { headers: { 'Authorization': '{access Token 키값}', 'Content-Type': 'application/json' } }; let res = http.post(url, payload, params); //k6 http를 통해 api호출 check(res, { //결과 res를 통해 실패 유무 측정 'status is 200': (r) => r.status === 200, }); sleep(1);//요청(Request) 주기 1은 1초 0.5는 0.5초 }
이제 만들어진 k6를 실행하기만 하면 됨
1
k6 run k6_script.js
결과 지표
- scenarios: 테스트 시나리오에 대한 설명
1 scenario: 테스트에 하나의 시나리오가 사용됨.10 max VUs: 최대 10명의 동시 가상 사용자(Virtual Users)를 사용.1m0s max duration: 최대 지속 시간은 1분.default: 기본 시나리오 이름.
- status is 200: 모든 HTTP 요청이 성공적으로 완료됐음을 나타냄(HTTP 상태 코드 200).
- checks: 테스트 중 실행된 검증의 성공률.
100.00% ✓ 300 ✗ 0: 300번의 검사가 모두 성공함.
- data_received/data_sent: 테스트 중 받은 데이터와 보낸 데이터의 총량.
49 kB 1.6 kB/s: 받은 데이터 총량과 평균 속도.269 kB 8.8 kB/s: 보낸 데이터 총량과 평균 속도.
- http_req_blocked: 네트워크 요청이 차단된 시간.
avg=109.27µs: 평균 차단 시간.
- http_req_connecting: 네트워크 연결 설정에 걸린 시간.
avg=21.88µs: 평균 연결 시간.
- http_req_duration: 전체 HTTP 요청 처리 시간.
avg=11.25ms: 평균 요청 처리 시간.
- http_req_failed: 실패한 HTTP 요청의 비율.
0.00%: 모든 요청이 성공함.
- http_req_receiving: 서버로부터 응답을 받는 데 걸린 시간.
avg=48.29µs: 평균 수신 시간.
- http_req_sending: 요청을 보내는 데 걸린 시간.
avg=49.18µs: 평균 송신 시간.
- http_req_waiting: 서버가 요청을 처리하는 데 걸린 시간.
avg=11.15ms: 평균 대기 시간.
- http_reqs: 초당 처리된 HTTP 요청 수.
9.869862/s: 초당 요청 수.
- iteration_duration: 각 반복(요청과 응답 사이클)에 걸린 평균 시간.
avg=1.01s: 평균 반복 시간.
- iterations: 초당 처리된 반복 수.
9.869862/s: 초당 반복 수.
- vus 및 vus_max: 테스트 중 사용된 동시 가상 사용자 수.
10 min=10 max=10: 최소, 최대, 현재 가상 사용자 수.
참고:https://github.com/schooldevops/k6-tutorials/blob/main/UsingK6/99_K6_Seminar.md