Home K6 부하테스트
Post
Cancel

K6 부하테스트

부하 테스트란?

부하 테스트는 시스템, 애플리케이션, 또는 네트워크가 실제 운영 환경에서 예상되는 부하 하에서 어떻게 작동하는지 평가하는 과정. 이러한 테스트를 통해 성능 문제를 식별하고, 시스템의 용량 한계를 이해할 수 있음.

부하 테스트 종류:

스모크 테스트(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
    

    image

결과 지표

  1. scenarios: 테스트 시나리오에 대한 설명
    • 1 scenario: 테스트에 하나의 시나리오가 사용됨.
    • 10 max VUs: 최대 10명의 동시 가상 사용자(Virtual Users)를 사용.
    • 1m0s max duration: 최대 지속 시간은 1분.
    • default: 기본 시나리오 이름.
  2. status is 200: 모든 HTTP 요청이 성공적으로 완료됐음을 나타냄(HTTP 상태 코드 200).
  3. checks: 테스트 중 실행된 검증의 성공률.
    • 100.00% ✓ 300 ✗ 0: 300번의 검사가 모두 성공함.
  4. data_received/data_sent: 테스트 중 받은 데이터와 보낸 데이터의 총량.
    • 49 kB 1.6 kB/s: 받은 데이터 총량과 평균 속도.
    • 269 kB 8.8 kB/s: 보낸 데이터 총량과 평균 속도.
  5. http_req_blocked: 네트워크 요청이 차단된 시간.
    • avg=109.27µs: 평균 차단 시간.
  6. http_req_connecting: 네트워크 연결 설정에 걸린 시간.
    • avg=21.88µs: 평균 연결 시간.
  7. http_req_duration: 전체 HTTP 요청 처리 시간.
    • avg=11.25ms: 평균 요청 처리 시간.
  8. http_req_failed: 실패한 HTTP 요청의 비율.
    • 0.00%: 모든 요청이 성공함.
  9. http_req_receiving: 서버로부터 응답을 받는 데 걸린 시간.
    • avg=48.29µs: 평균 수신 시간.
  10. http_req_sending: 요청을 보내는 데 걸린 시간.
    • avg=49.18µs: 평균 송신 시간.
  11. http_req_waiting: 서버가 요청을 처리하는 데 걸린 시간.
    • avg=11.15ms: 평균 대기 시간.
  12. http_reqs: 초당 처리된 HTTP 요청 수.
    • 9.869862/s: 초당 요청 수.
  13. iteration_duration: 각 반복(요청과 응답 사이클)에 걸린 평균 시간.
    • avg=1.01s: 평균 반복 시간.
  14. iterations: 초당 처리된 반복 수.
    • 9.869862/s: 초당 반복 수.
  15. vusvus_max: 테스트 중 사용된 동시 가상 사용자 수.
    • 10 min=10 max=10: 최소, 최대, 현재 가상 사용자 수.

참고:https://github.com/schooldevops/k6-tutorials/blob/main/UsingK6/99_K6_Seminar.md

JPA 실습1

Redisson을 이용한 선착순 쿠폰 발급 시스템