12.26 TIL - 부하 테스트

이서준·2025년 12월 26일

TIL

목록 보기
19/24

부하 테스트

  • 많은 사용자가 동시에 들어왔을 때 서비스가 정상 동작하는지 확인하는 테스트

특징

  • 주어진 부하에서 보이는 성능적인 특성을 파악하는 것
  • 부하 테스트는 비기능 테스트
  • 시간 반응성, 자원 효율성 등을 확인하는 것이 목적
  • 사용자의 경험을 개선 시키고 시스템을 효율적으로 사용하기 위해서 진행하는 것

목적

  1. 예상치 못한 트래픽 폭주에 대응하기 위해
  2. 기능 테스트로는 절대 발견되지 않는 문제를 찾기 위해
  3. 병목 지점을 명확히 찾기 위해
  4. 실전 장애를 미리 경험하는 효과

종류

  1. Load Test(일반 부하 테스트)
    1. 예상되는 정상 트래픽 수준에서 시스템이 안정적인지 확인
  2. Stress Test(한계 테스트)
    1. 트래픽을 점점 증가시키며 시스템이 어느 지점에서 무너지는지 확인
  3. Spike Test(급상승 테스트)
    1. 짧은 시간에 폭발적인 트래픽이 들어올 때 대응 가능한 지 확인
  4. Soak Test(내구성 테스트)
    1. 오랜 시간 동안 ㅂ부하를 유지했을 때 시스템 상태를 확인

K6

  • 부하 테스트 도구

특징

  • 가볍고 빠름
  • JavaScript로 테스트 코드를 작성
  • 실무에서 사용률이 높음
  • Grafana와 연동 가능

명령어

docker run --rm -i grafana/k6 run - < script.js
  • —rm: 실행 후 컨테이너 자동 삭제
  • -i : sdin 입력을 컨테이너로 전달
  • grafana/k6 : K6 공식 이미지
  • run - < script.js : 로컬 script.js 내용을 컨테이너에서 실행

js 파일

import http from 'k6/http';

export const options = {
  vus: 5,
  duration: '10s',
};

export default function () {
  http.get("http://host.docker.internal:8080/actuator/health");
}
  • vus : 동시에 요청을 보내는 사용자 수
  • duration : 부하를 얼마나 오래 유지할 지

→ 5명의 사용자가 10초 동안 계속 요청을 보내는 환경

핵심 지표 5가지

  • http_req_duration (API 응답 시간)
  • http_req_failed (실패율)
  • http_reqs (초당 요청 처리량, RPS)
  • p90 / p95 (상위 지연 시간)
  • max latency (가장 느린 요청 시간)

실행 결과 읽기

HTTP
    http_req_duration..............: avg=1.56ms  min=0s       med=1.22ms max=34.17ms p(90)=2.52ms p(95)=3.52ms
      { expected_response:true }...: avg=1.56ms  min=437.45µs med=1.22ms max=34.17ms p(90)=2.52ms p(95)=3.52ms
    http_req_failed................: 0.03%  5 out of 14205
    http_reqs......................: 14205  405.985383/s

    EXECUTION
    iteration_duration.............: avg=12.17ms min=452.04µs med=1.26ms max=30s     p(90)=2.63ms p(95)=3.65ms
    iterations.....................: 14205  405.985383/s
    vus............................: 5      min=5          max=5
    vus_max........................: 5      min=5          max=5

    NETWORK
    data_received..................: 4.8 MB 137 kB/s
    data_sent......................: 1.4 MB 39 kB/s
  • avg=1.56ms : 전체 요청 평균 속도
  • med=1.22ms : 절반의 요청이 1.22ms 이하
  • p(90)=2.52ms : 90% 요청이 2.52ms 이하
  • p(95)=3.52ms : 95% 요청이 3.52ms 이하
  • max=34.17ms : 가장 오래 걸린 요청 1개 또는 극히 소수의 요청
  • http_req_failed................: 0.03% 5 out of 14205 : 전체 요청 중 0.03%만 실패
    • 실패율이 1% 이상이면 원인 분석 필요
  • http_reqs......................: 14205 405.985383/s : 값이 높을 수록 서버가 많은 트래픽을 감당할 수 있음

성능 병목

  1. p(95)가 100ms 이상 → 병목 의심
  2. http_req_failed 증가 → 안정성 문제
  3. RPS 감소 → 처리량 저하

1. 10명 넣었을 때 (인덱스 없을 때)

█ TOTAL RESULTS 

    HTTP
    http_req_duration..............: avg=7.04s min=6.16s med=7.09s max=7.69s p(90)=7.37s p(95)=7.48s
      { expected_response:true }...: avg=7.04s min=6.16s med=7.09s max=7.69s p(90)=7.37s p(95)=7.48s
    http_req_failed................: 0.00%  0 out of 40
    http_reqs......................: 40     1.214036/s

    EXECUTION
    iteration_duration.............: avg=8.04s min=7.17s med=8.1s  max=8.69s p(90)=8.37s p(95)=8.49s
    iterations.....................: 40     1.214036/s
    vus............................: 7      min=7       max=10
    vus_max........................: 10     min=10      max=10

    NETWORK
    data_received..................: 161 kB 4.9 kB/s
    data_sent......................: 4.0 kB 123 B/s

2. 30명 넣었을 때 (인덱스 없을 때)

30명
  █ TOTAL RESULTS 

    HTTP
    http_req_duration..............: avg=18s    min=6.81s med=20.78s max=24.94s p(90)=22.41s p(95)=22.64s
      { expected_response:true }...: avg=18s    min=6.81s med=20.78s max=24.94s p(90)=22.41s p(95)=22.64s
    http_req_failed................: 0.00%  0 out of 63
    http_reqs......................: 63     1.30875/s

    EXECUTION
    iteration_duration.............: avg=19.01s min=7.82s med=21.78s max=25.95s p(90)=23.41s p(95)=23.64s
    iterations.....................: 63     1.30875/s
    vus............................: 2      min=2       max=30
    vus_max........................: 30     min=30      max=30

    NETWORK
    data_received..................: 254 kB 5.3 kB/s
    data_sent......................: 6.4 kB 132 B/s

3. 30명 넣었을 때 (Redis 사용)

  █ TOTAL RESULTS 

    HTTP
    http_req_duration..............: avg=477.15ms min=3.53ms med=8.61ms max=10.19s p(90)=17.14ms p(95)=29.75ms
      { expected_response:true }...: avg=477.15ms min=3.53ms med=8.61ms max=10.19s p(90)=17.14ms p(95)=29.75ms
    http_req_failed................: 0.00%  0 out of 621
    http_reqs......................: 621    20.106023/s

    EXECUTION
    iteration_duration.............: avg=1.48s    min=1s     med=1.01s  max=11.21s p(90)=1.01s   p(95)=1.03s  
    iterations.....................: 621    20.106023/s
    vus............................: 30     min=30       max=30
    vus_max........................: 30     min=30       max=30

    NETWORK
    data_received..................: 2.5 MB 81 kB/s
    data_sent......................: 63 kB  2.0 kB/s
  • avg가 높은 이유는 처음 조회 시 DB 접근 해야함

4. 30명 넣었을 때 (인덱스 사용 + Redis 사용)

  █ TOTAL RESULTS 

    HTTP
    http_req_duration..............: avg=177.34ms min=3.42ms med=12.95ms max=4.46s p(90)=24.03ms p(95)=29.52ms
      { expected_response:true }...: avg=177.34ms min=3.42ms med=12.95ms max=4.46s p(90)=24.03ms p(95)=29.52ms
    http_req_failed................: 0.00%  0 out of 780
    http_reqs......................: 780    25.371143/s

    EXECUTION
    iteration_duration.............: avg=1.17s    min=1s     med=1.01s   max=5.49s p(90)=1.02s   p(95)=1.03s  
    iterations.....................: 780    25.371143/s
    vus............................: 30     min=30       max=30
    vus_max........................: 30     min=30       max=30

    NETWORK
    data_received..................: 3.1 MB 102 kB/s
    data_sent......................: 79 kB  2.6 kB/s
profile
Allons-y

0개의 댓글