# 평균은 아무 의미가 없다

> Clean Markdown view of GeekNews topic #31949. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=31949](https://news.hada.io/topic?id=31949)
- GeekNews Markdown: [https://news.hada.io/topic/31949.md](https://news.hada.io/topic/31949.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-07-29T20:02:01+09:00
- Updated: 2026-07-29T20:02:01+09:00
- Original source: [fzakaria.com](https://fzakaria.com/2026/07/27/the-mean-means-nothing)
- Points: 1
- Comments: 0

## Topic Body

- 새 캐시 계층 배포 후 평균 지연 시간은 112ms에서 122ms로 악화됐지만, 중앙값은 99ms에서 54ms로 개선되고 p99는 309ms에서 678ms로 악화돼 **단일 통계값만으로 성패를 판단하기 어려움**
- 배포 후 지연 시간 분포가 하나의 봉우리에서 두 봉우리로 갈라졌으며, **누적분포함수(CDF)** 를 겹쳐 보면 약 140ms를 경계로 빠른 요청은 개선되고 느린 요청은 악화됨
- 백분위별 변화량을 나타내는 **이동 함수**와 일별 능선 그래프·히트맵은 개선과 회귀의 크기, 배포율이 0%에서 100%로 높아지는 동안 느린 요청 집단이 커지는 과정을 드러냄
- 데이터를 캐시 결과와 응답 크기로 나누자 작은 응답의 **캐시 적중**은 빨라지고 큰 응답의 캐시 미스는 추가 홉 때문에 느려져 이봉 분포가 만들어진 원인을 확인할 수 있었음
- 평균이나 특정 백분위 하나만 선택하면 서로 반대되는 판단도 정당화할 수 있으므로, **분포 전체와 하위 집단**을 함께 살펴야 캐시 최대 객체 크기 확대나 큰 응답 분할 같은 조치로 이어질 수 있음

---

### 프로덕션에서 보이지 않던 성능 개선
- `lld` 관련 성능 개선은 벤치마크에서 나타났지만, 실제 프로덕션 대시보드에서는 데이터 잡음 때문에 분명한 변화를 찾기 어려웠음
- 빌드 속도는 **콜드 캐시**, 증분 빌드, 로컬·원격 실행, 시스템 상태, 워크로드 등 여러 변수에 따라 크게 달라질 수 있음
- 누적분포함수(CDF)로 빌드 성능을 평가한 사례를 계기로, 하나의 이미지나 통계값보다 여러 방식으로 데이터 자체를 살펴볼 필요가 생김
- 모든 예시는 고정 시드를 사용한 하나의 **합성 데이터셋**에서 생성됐으며, [전체 스크립트](https://gist.github.com/fzakaria/17c72f0eddc0f10469e008e67e1385cc)는 `nix-shell` shebang을 포함해 [Nix](https://nixos.org/) 환경에서 각 그림을 그대로 재현할 수 있음
- 이야기용 데이터와 차트 생성에는 **AI**가 활용됐음

### 평균으로는 실패처럼 보인 캐시 배포
- 웹 서비스의 요청 지연 시간을 줄이려고 새 캐시 계층을 일주일 동안 배포했지만, 평균 지연 시간은 **112ms에서 122ms**로 9% 증가함
- 평균만 보면 변경을 되돌리고 장애 대응과 사후 분석을 시작할 만한 회귀로 판단하기 쉬움

### 하나의 데이터가 만든 네 가지 판단
- 배포 전후 통계는 서로 다른 방향을 가리킴
  - 평균: 112ms → 122ms, **9% 악화**
  - p50 중앙값: 99ms → 54ms, **46% 개선**
  - p95: 224ms → 454ms, **103% 악화**
  - p99: 309ms → 678ms, **119% 악화**
- 평균은 가벼운 회귀를 나타내지만, 중앙값으로는 일반적인 요청이 거의 두 배 빨라졌고 p99로는 최악의 요청이 두 배 이상 느려진 심각한 문제가 보임
- 같은 데이터에서 계산한 **평균과 중앙값**이 반대 방향을 가리키므로, 자신의 판단을 뒷받침하는 통계만 선택하기 쉬움

### 분포 형태가 드러낸 두 요청 집단
- 밀도 그래프에서 배포 전 분포는 **하나의 봉우리**였지만, 배포 후에는 두 개의 봉우리로 갈라짐
- 이 형태는 통계값 사이의 모순을 설명하지만 밀도 그래프에도 제약이 있음
  - 형태가 선택한 **평활화 매개변수**에 따라 달라짐
  - 두 분포를 채운 영역이 겹치면 읽기 어려움
  - 두 집단의 존재는 보이지만 중앙값 같은 백분위 위치를 바로 파악하기 어려움

### CDF로 전체 백분위 비교하기
- 누적분포함수(CDF)는 각 지연 시간 `x`에 대해 **x밀리초 이하로 완료된 요청의 비율**을 보여줌
- 배포 전후 CDF를 한 차트에 겹치면 전체 요청 집단에서 각 백분위가 어떻게 이동했는지 확인할 수 있음
- 배포 후 곡선은 140ms 미만 구간에서 왼쪽으로 이동해 더 많은 요청이 이전보다 빨라졌지만, 140ms 이후에는 더 많은 요청이 느려짐
- 두 곡선이 교차하는 약 **140ms**가 변경 효과가 개선에서 악화로 바뀌는 경계임
- 두 CDF가 교차하면 효과의 방향이 선택한 백분위에 따라 달라지므로 **어떤 단일 백분위도 변화 전체를 요약할 수 없음**

### 백분위마다 변화량 측정하기
- CDF는 각 구간이 빨라졌는지 느려졌는지를 보여주지만 변화량 자체는 직접 나타내지 않음
- **이동 함수(shift function)** 는 각 백분위 `p`에서 배포 후 지연 시간과 배포 전 지연 시간의 차이를 계산함
  - 0 아래는 개선된 구간임
  - 0 위는 느려진 구간임
- 이를 통해 분포의 각 지점에서 변화의 방향뿐 아니라 **크기**까지 확인할 수 있음

### 배포 과정에서 자라난 회귀
- 새 캐시 계층은 일주일 동안 트래픽의 0%에서 100%까지 점진적으로 확대됐으며, 배포 전후 두 시점만 비교하면 중간 변화를 놓치게 됨
- 일별 분포를 쌓은 **능선 그래프(ridgeline)** 에서는 배포가 진행될수록 빠른 요청의 주 봉우리가 왼쪽으로 이동하고, 느린 요청의 두 번째 봉우리가 오른쪽에 나타남
- 중앙값이 낮아지는 동시에 느린 요청의 수와 지연 시간은 조용히 증가함
- 지연 시간은 대략 로그정규분포를 이루므로 x축에 **로그 척도**를 사용함
  - 선형 축에서는 빠른 요청의 봉우리가 높게 솟고 느린 요청은 희미하게 퍼져 두 봉우리를 함께 읽기 어려움
- 일별 열과 지연 시간별 트래픽 양을 색상으로 나타낸 **히트맵**에서도 새로운 요청 집단이 희미하게 나타남
- 일주일 전체를 하나의 집계값으로 합치면 서로 다른 일곱 개의 일별 분포와 변화 추세가 사라짐

### 캐시 적중과 미스로 분해한 이봉 분포
- 실제 `lld` 분석에서는 바이너리 크기, 예를 들어 **50MiB 초과 여부**로 데이터를 나눠야 지연 시간의 이봉 분포를 확인할 수 있었음
- 합성 사례의 새 계층에서는 요청이 캐시에서 처리되는 **적중(hit)** 과 백엔드로 전달되며 추가 홉을 거치는 미스(miss)로 나뉨
- 배포 후 요청의 CDF를 캐시 결과별로 분리하면 각 집단은 다시 하나의 봉우리를 가짐
  - 캐시 적중은 기존 기준선보다 왼쪽으로 이동해 더 빨라짐
  - 캐시 미스는 추가 홉 비용 때문에 훨씬 오른쪽에 위치함

### 응답 크기에서 찾은 원인과 조치
- 캐시 미스는 작동 메커니즘일 뿐이며, 어떤 요청이 왜 미스를 일으키는지 파악하려면 **응답 크기**를 함께 봐야 함
- 캐시는 작고 자주 사용되는 객체를 유지하지만, 큰 객체는 퇴출되거나 처음부터 들어가지 못함
- 지연 시간과 응답 크기의 관계를 캐시 적중·미스 색상으로 구분하고 각 축의 밀도 분포를 결합한 **결합 그래프(jointplot)** 에서 두 집단이 분명히 드러남
  - 작은 응답·낮은 지연 시간 집단은 캐시 적중임
  - 큰 응답·높은 지연 시간 집단은 캐시 미스임
- 지연 시간의 이봉 분포는 응답 크기 분포의 이봉성에서 비롯됐으며, **캐시 최대 객체 크기를 늘리거나 큰 응답을 분할**해 대응할 수 있음

### 하나의 그래프를 넘어 분포 전체 보기
- 단일 패널이나 그래프는 전체 상황을 담기 부족하며, 경우에 따라 잘못된 판단을 유도할 수 있음
- 같은 데이터를 여러 방식으로 살펴야 분포의 형태, 백분위별 효과, 시간에 따른 변화, 하위 집단과 원인을 함께 이해할 수 있음
- 특히 **CDF**는 여러 요청 집단을 비교하면서 전체 분포를 하나의 차트에 담는 데 유용함

## Comments



_No public comments on this page._
