- 새 캐시 계층 배포 후 평균 지연 시간은 112ms에서 122ms로 악화됐지만, 중앙값은 99ms에서 54ms로 개선되고 p99는 309ms에서 678ms로 악화돼 단일 통계값만으로 성패를 판단하기 어려움
- 배포 후 지연 시간 분포가 하나의 봉우리에서 두 봉우리로 갈라졌으며, 누적분포함수(CDF) 를 겹쳐 보면 약 140ms를 경계로 빠른 요청은 개선되고 느린 요청은 악화됨
- 백분위별 변화량을 나타내는 이동 함수와 일별 능선 그래프·히트맵은 개선과 회귀의 크기, 배포율이 0%에서 100%로 높아지는 동안 느린 요청 집단이 커지는 과정을 드러냄
- 데이터를 캐시 결과와 응답 크기로 나누자 작은 응답의 캐시 적중은 빨라지고 큰 응답의 캐시 미스는 추가 홉 때문에 느려져 이봉 분포가 만들어진 원인을 확인할 수 있었음
- 평균이나 특정 백분위 하나만 선택하면 서로 반대되는 판단도 정당화할 수 있으므로, 분포 전체와 하위 집단을 함께 살펴야 캐시 최대 객체 크기 확대나 큰 응답 분할 같은 조치로 이어질 수 있음
프로덕션에서 보이지 않던 성능 개선
lld관련 성능 개선은 벤치마크에서 나타났지만, 실제 프로덕션 대시보드에서는 데이터 잡음 때문에 분명한 변화를 찾기 어려웠음- 빌드 속도는 콜드 캐시, 증분 빌드, 로컬·원격 실행, 시스템 상태, 워크로드 등 여러 변수에 따라 크게 달라질 수 있음
- 누적분포함수(CDF)로 빌드 성능을 평가한 사례를 계기로, 하나의 이미지나 통계값보다 여러 방식으로 데이터 자체를 살펴볼 필요가 생김
- 모든 예시는 고정 시드를 사용한 하나의 합성 데이터셋에서 생성됐으며, 전체 스크립트는
nix-shellshebang을 포함해 Nix 환경에서 각 그림을 그대로 재현할 수 있음 - 이야기용 데이터와 차트 생성에는 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는 여러 요청 집단을 비교하면서 전체 분포를 하나의 차트에 담는 데 유용함