728x90
반응형
배경
k6 부하 테스트 결과를 분석하다가 avg, p90, p95, max 등 여러 지표 중 어떤 걸 기준으로 봐야 하는지 정리하게 됐다.
avg가 믿을 수 없는 이유
요청 9개 → 10ms
요청 1개 → 10000ms (DB 락 걸린 불운한 유저)
avg = (9×10 + 10000) / 10 = 1009ms
→ "평균 1초"라고 하면 실제보다 훨씬 나빠 보임
→ 반대로 극단값 몇 개가 avg를 반대 방향으로 왜곡하기도 함
avg는 이상치(outlier)에 취약하다. 대부분의 유저가 빠른 응답을 받아도 일부 느린 요청이 avg를 끌어올린다.
퍼센타일(Percentile)이란?
전체 요청을 응답시간 순으로 줄 세웠을 때, 빠른 쪽에서 N번째 퍼센트에 해당하는 값이다.
p50 = 전체의 50%가 이 시간 이하로 응답 (중앙값)
p90 = 전체의 90%가 이 시간 이하로 응답
p95 = 전체의 95%가 이 시간 이하로 응답
p99 = 전체의 99%가 이 시간 이하로 응답
즉 p95 = 8068ms 라면, 전체 요청 중 5%는 8초 이상 걸렸다는 의미다.
p95가 국룰인 이유
지표 문제점
| avg | 이상치에 취약, 왜곡 가능 |
| p50 | 절반의 유저 경험만 반영 → 너무 낙관적 |
| p95 | 대부분의 유저(95%) 경험을 대표, 이상치에 덜 흔들림 |
| p99 | 너무 엄격, 일반 서비스엔 과도할 수 있음 |
p95는 "대부분의 유저 경험"을 대표하면서 극단적인 이상치에 덜 흔들리는 균형점이다.
Google SRE 책, AWS, Netflix 모두 p95를 기본 SLA(Service Level Agreement) 지표로 사용한다.
업계 기준
지표 사용 상황
| p50 | 중간값 참고용 |
| p95 | 일반 서비스 SLA 기준 (국룰) |
| p99 | 금융, 결제 등 민감한 서비스 |
| p99.9 | 대형 플랫폼 (구글, 아마존 수준) |
일반적인 웹 API SLA 목표: p95 < 500ms
실제 테스트 결과 분석 예시
쿠폰 발급 부하 테스트 (VU: 100명, 쿠폰 수량: 100개)
지표 값 평가
| avg | 3098ms | ❌ 3초 평균은 너무 느림 |
| p90 | 6567ms | ❌ 상위 10%는 6.5초 이상 |
| p95 | 8068ms | ❌ 목표(500ms) 대비 16배 초과 |
| max | 14669ms | ❌ 최대 14.7초 |
| 에러율 | 0.00% | ✅ 정합성은 완벽 |
| DB 발급 건수 | 100건 | ✅ 동시성 제어 정상 |
정합성은 완벽하지만 응답속도가 문제. 100 VU가 동시에 몰리면서 DB 락 경합이 발생한 것으로 추정. Redis DECR을 critical path 앞단에 두는 구조로 개선하면 p95를 크게 낮출 수 있다.
정리
- avg는 이상치에 취약해서 단독으로 믿으면 안 된다
- p95가 SLA 지표의 국룰 — 대부분의 유저 경험을 대표
- 금융/결제는 p99, 일반 서비스는 p95 기준
- 일반 웹 API 목표: p95 < 500ms
반응형
'Study' 카테고리의 다른 글
| TIL - G1GC vs ZGC : GC 방식 차이와 선택 기준 (0) | 2026.07.18 |
|---|---|
| [내일배움캠프 TIL] - Lettuce Redis 명령이 Zipkin에 안 나타나는 이유 & 해결 (0) | 2026.07.06 |
| [내일배움캠프 TIL] - Redis 동시성 제어 3가지 방식 비교 (0) | 2026.07.02 |
| [내일배움캠프 TIL] GitHub Actions에서 org 레포 ghcr.io 패키지 push 권한 (0) | 2026.07.01 |
| [내일배움캠프 TIL] Lettuce 첫 번째 Redis 호출이 3초나 걸린 이유 (Cold Start 지연) (0) | 2026.06.30 |