성능 측정 지표: 백분위수
평균(Average)은 소수의 느린 요청을 숨겨 실제 사용자 경험을 왜곡할 수 있습니다.
-
P50 (중앙값): 일반적인 경우를 나타내지만, 테일 레이턴시(tail latency)를 무시하여 느린 요청을 간과하므로 느린 액션 판단에는 부적합합니다.
-
P95: 전체 요청의 95%가 이 시간보다 빠름을 의미합니다. 충분히 많은 사용자에게 영향을 미치는 문제를 포착하며, 알림 임계치 설정, 최적화 필요성 판단, 엔드포인트 간 성능 비교에 적합한 ‘스위트 스팟’으로 권장됩니다.
-
P99: 전체 요청의 99%가 이 시간보다 빠름을 의미합니다. 최악의 경우 성능을 파악하고 특정 느린 요청을 디버깅하는 데 유용하지만, 대부분의 애플리케이션에서는 노이즈가 많아 ‘느림’을 정의하는 주요 지표로는 과도할 수 있습니다.
-
결정 규칙: P95를 느린 액션의 임계치로 사용하고, P99는 추가 조사가 필요한 예외 상황을 파악하는 데 활용합니다.
서버 응답 시간의 중요성
Rails는 Completed 200 OK in 250ms (Views: 180ms | ActiveRecord: 45ms)와 같이 서버 처리 시간을 제공합니다.
-
빠름: 100ms 미만(즉각적), 100-200ms(여전히 반응성 좋음).
-
문제 영역: 200-500ms(인지 가능), 500ms-1s(사용자 대기), 1-3초(사용자 이탈), 3초 초과(사용자 다른 탭 열음). 컨텍스트에 따라 허용 범위가 다르지만, 500ms를 일관되게 초과하는 경우 조사가 필요합니다.
병목 현상 분석 및 임계치 (P95 기준)
-
데이터베이스 쿼리: P95 > 100ms일 경우 조사 필요. 주요 원인으로 인덱스 누락, N+1 쿼리, 대규모 테이블 전체 스캔, 비최적화된
LIKE쿼리가 있으며,EXPLAIN ANALYZE활용이 권장됩니다. -
뷰 렌더링: P95 > 100ms일 경우 조사 필요. 너무 많은 부분 렌더링, 뷰 코드 내 숨겨진 N+1 쿼리, 프래그먼트 캐싱 미사용 등이 원인입니다.
-
외부 API 호출: P95 > 200ms일 경우 조사 필요. 500ms 초과 시 백그라운드 작업으로 이동하거나 적극적으로 캐싱해야 합니다. 동기 호출 시 타임아웃 및 폴백(fallback) 또는 서킷 브레이커(circuit breaker) 사용이 필수입니다.
요약 임계치 (P95)
-
액션: P95 > 500ms
-
데이터베이스 쿼리: P95 > 100ms
-
API 호출: P95 > 200ms 이 임계치들은 프로젝트 및 비즈니스 요구사항에 따라 달라질 수 있지만, 견고한 시작점입니다.