지연 시간 백분위수 계산기 쉽게 이해하기 — 개념과 원리
응답 시간 데이터는 거의 언제나 한쪽으로 치우쳐 있습니다. 대부분의 요청은 빠르고 일부만 매우 느립니다. 이런 분포는 평균보다 백분위수로 훨씬 잘 설명됩니다. 이 계산기는 지연 시간 표본 목록에서 중앙값(p50), 꼬리 백분위수인 p95와 p99, 평균, 최댓값을 구합니다. 서비스 수준 목표(SLO)를 정하거나 배포 전후를 비교하고 느린 이상값을 찾을 때 씁니다.
계산 방법
표본을 작은 것부터 x₁ ≤ x₂ ≤ … ≤ xₙ으로 정렬합니다. 백분위 p(소수)에 대해 위치 h = (n − 1) × p를 0부터 셉니다. h가 두 표본 사이에 있으면 선형 보간으로 Q = x₍⌊h⌋₎ + (h − ⌊h⌋) × (x₍⌊h⌋+1₎ − x₍⌊h⌋₎)를 계산합니다. 이는 하인드먼과 팬이 정리한 "7형" 정의로, R, NumPy, 스프레드시트의 PERCENTILE 함수가 기본으로 쓰는 방식입니다. 평균은 합계 ÷ n, 최댓값은 가장 큰 표본입니다.
원리
백분위수는 "요청의 p%가 이 값 이하로 끝난다"는 뜻입니다. 중앙값은 데이터를 절반으로 나누며 느린 요청이 얼마나 극단적인지는 반영하지 않습니다. 반면 평균은 느린 이상값 하나하나에 끌려 올라가 실제로는 거의 없는 값을 가리킬 수 있습니다. 꼬리 백분위수가 중요한 이유는 사용자가 느린 경우를 체감하기 때문입니다. 한 페이지가 백엔드를 여러 번 호출하면 그중 한 번은 p99 응답을 만날 가능성이 높아, 각 서비스의 꼬리가 페이지 전체의 평범한 경험이 됩니다.
예제 풀이
- 정렬한 표본(n = 12)은 12, 13, 14, 14, 15, 15, 16, 17, 18, 22, 95, 210입니다.
- p50: h = 11 × 0.5 = 5.5이므로 15와 16 사이, 15 + 0.5 × 1 = 15.5ms입니다.
- p95: h = 10.45이므로 95와 210 사이, 95 + 0.45 × 115 = 146.75ms입니다.
- p99: h = 10.89이므로 95 + 0.89 × 115 = 197.35ms입니다.
- 평균은 461 ÷ 12 = 38.42ms, 최댓값은 210ms입니다.
결과 해석
중앙값은 15.5ms인데 평균은 느린 요청 두 개 때문에 그 두 배가 넘습니다. 이런 차이는 가비지 컬렉션, 캐시 미적중, 잠금 경합, 재시도 같은 원인을 살펴봐야 한다는 신호입니다. SLO는 보통 "30일 동안 p99 300ms 미만"처럼 p95나 p99로 정합니다.
흔한 실수
- 여러 서버의 백분위수를 평균 내는 경우입니다. 전체 데이터를 합치거나 병합 가능한 히스토그램으로 다시 계산해야 합니다.
- 표본 12개로 p99를 말하는 경우입니다. 상위 두 값 사이를 보간한 것이라 매우 불안정합니다.
- 백분위수 정의가 다른 도구의 결과를 그대로 비교하는 경우입니다.
자주 묻는 질문
p50과 중앙값은 같은 것인가요?
같습니다. p50이 곧 중앙값입니다.
믿을 만한 p99를 얻으려면 표본이 몇 개 필요한가요?
p99보다 큰 표본이 100개를 훌쩍 넘을 정도는 되어야 하므로, 구간마다 수천 건 이상의 요청을 모으는 경우가 많습니다.
출처: R. J. Hyndman, Y. Fan, "Sample Quantiles in Statistical Packages", The American Statistician 50(4), 1996 · J. Dean, L. A. Barroso, "The Tail at Scale", Communications of the ACM 56(2), 2013