Docs |
Src
| A- | A+
| -/-
Metadata
(요약) Why Percentiles Don’t Work the Way You Think
- 고객들은 메트릭의 p99(99백분위수, 99th percentile)를 자주 요청함.
- 작성자는 Database Performance Monitor(DPM)에 이런 기능을 추가할 계획임.
- 그러나 많은 고객이 실제로 원하는 것은 메트릭의 99백분위수가 아니라, 99백분위수의 메트릭(metric of 99th percentile) 임.
- 이는 Graphite 같은 시스템에서 매우 흔한 방식임.
- 하지만 이 방식은 사람들이 흔히 기대하는 효과를 내지 못함.
- 이 글은 백분위수가 어떻게 사람을 속일 수 있는지, 그 오류나 문제의 정도가 어느 수준인지, 그리고 백분위수 메트릭이 맞지 않을 때 무엇을 할 수 있는지 설명함.
Away From Averages
- 지난 몇 년 동안 모니터링에서 평균(average)의 문제점이 많이 논의되기 시작했음.
- 이 주제가 널리 논의되는 것은 긍정적임.
- 오랫동안 평균은 깊은 검토 없이 받아들여졌음.
- 평균은 모니터링에서 도움이 되지 않을 수 있음.
- 평균만 보면 이상치(outlier)를 놓칠 수 있음.
- 그리고 이상치는 평균보다 훨씬 더 중요할 수 있음.
- 이상치가 있는 상황에서 평균에는 두 가지 문제가 있음.
- 첫째, 평균은 이상치를 가려서 보이지 않게 함.
- 둘째, 이상치는 평균을 왜곡하므로, 이상치가 있는 시스템에서 평균은 전형적 행동을 대표하지 못함.
- 따라서 불규칙한 동작을 하는 시스템의 메트릭을 평균내면 최악의 조합이 발생함.
- 즉, 전형적 행동도 보이지 않고 비정상적 행동도 보이지 않음.
- 그리고 대부분의 시스템에는 많은 이상치 데이터 포인트가 존재함.
- “롱테일(long tail)”의 극단값을 보는 것은 중요함.
- 이는 상황이 얼마나 나빠질 수 있는지를 보여주기 때문임.
- 평균에 의존하면 이런 점을 놓치게 됨.
- Amazon의 Werner Vogels는 AWS re:Invent 기조연설에서 평균이 말해주는 것은 고객의 절반이 더 나쁜 경험을 하고 있다는 것뿐이라고 말했음.
- 이 말은 취지상 맞지만 실무적으로 정확히 일치하지는 않음.
- 구체적으로는 중앙값(median), 즉 50백분위수(50th percentile)가 그런 성질을 제공함.
- Optimizely는 이 블로그 글에서 평균이 왜 역효과를 낼 수 있는지 잘 설명했음.
- 해당 글은 평균 응답시간을 보는 것은 병원의 평균 체온을 재는 것과 같다고 비유했음.
- 실제로 중요한 것은 각 환자의 체온이며, 특히 가장 도움이 필요한 환자들이라고 설명했음.
- Brendan Gregg도 평균은 실용적 용도는 많지만 분포(distribution)를 제대로 이해하는 데에는 적합하지 않다고 설명했음.
And Towards Percentiles
- 백분위수(percentiles), 더 넓게는 분위수(quantiles)는 평균의 근본적 문제를 우회하는 방법으로 자주 칭찬받음.
- 99백분위수의 개념은 데이터 집단(population)을 정렬한 뒤 최악의 1%를 버리고 남은 값 중 가장 큰 값을 보는 것임.
- 이 값에는 두 가지 중요한 성질이 있음.
- 첫째, 이는 99%의 시간에 발생하는 값 중 가장 큰 값임.
- 예를 들어 웹페이지 로드 시간이라면 방문자의 99%가 겪는 최악의 경험을 나타냄.
- 둘째, 이는 진짜 극단적 이상치에 대해 강건함.
- 이런 이상치는 측정 오류 등 다양한 원인에서 발생함.
- 꼭 99%를 선택할 필요는 없음.
- 흔한 대안으로는 90백분위수, 95백분위수, 99.9백분위수 등이 있음.
- 이 지점에서 많은 사람은 평균은 나쁘고 백분위수는 좋으니 백분위수 메트릭을 계산해 시계열 데이터베이스(time series database)에 넣으면 된다고 생각함.
- 그러나 그렇게 단순하지 않음.
How Time Series Databases Store and Transform Metrics
- 대부분의 시계열 데이터와 백분위수 사이에는 큰 문제가 존재함.
- 시계열 데이터베이스는 원래 측정된 전체 이벤트 집단(full population)이 아니라, 시간 구간별 집계 메트릭(aggregate metrics)을 저장하는 경우가 거의 전부임.
- 그리고 시계열 데이터베이스는 여러 방식으로 이 메트릭들을 다시 평균냄.
- 가장 중요한 첫 번째 경우는, 저장된 해상도와 다른 시간 해상도로 조회할 때 데이터를 평균내는 것임.
- 예를 들어 하루치 메트릭을 600px 너비 차트로 그리면 각 픽셀은 144초의 데이터를 나타냄.
- 이 평균 과정은 암묵적으로 일어나며 사용자에게 공개되지 않음.
- 작성자는 여기에 경고 문구라도 붙여야 한다고 말함.
- 두 번째 경우는 장기 저장을 위해 더 낮은 해상도로 아카이브할 때 데이터를 평균내는 것임.
- 거의 모든 시계열 데이터베이스가 이렇게 함.
- 따라서 여전히 어떤 형태로든 평균을 다루고 있는 셈임.
- 그리고 백분위수의 평균은 작동하지 않음.
- 백분위수를 계산하려면 원래 이벤트 집단이 필요하기 때문임.
- 수학 자체가 성립하지 않음.
- 백분위수의 평균은 무의미함.
- 다만 그 결과가 낳는 영향은 상황에 따라 다름.
- 많은 모니터링 소프트웨어는 저장된 백분위수 메트릭과 리샘플링(resampling)된 백분위수 메트릭 사용을 장려함.
- 예를 들어 StatsD는 원하는 백분위수에 대한 메트릭을 계산하게 해줌.
- 그리고 foo.upper_99 같은 이름의 메트릭을 생성해 주기적으로 내보내 Graphite에 저장하게 함.
- 원하는 시간 해상도가 절대 리샘플링되지 않는다면 괜찮음.
- 그러나 실제로는 그렇지 않음.
- 이런 계산 방식에 대한 혼란은 매우 널리 퍼져 있음.
- StatsD GitHub 이슈의 관련 댓글을 보면 이를 잘 알 수 있음.
- 그중 일부는 사실과 맞지 않는 말을 하고 있음.
- 이 문제를 가장 간결하게 표현하면 다음과 같음.
- 백분위수는 데이터 집단으로부터 계산되며, 집단 즉 시간 구간이 바뀔 때마다 다시 계산되어야 함.
- 전통적인 메트릭을 저장하는 시계열 데이터베이스에는 원래 데이터 집단이 없음.
Alternative Ways To Compute Percentiles
- 웹페이지 로드 시간처럼 개별 이벤트의 원래 집단이 필요하다면 큰 문제가 생김.
- 이는 정확히 말해 빅데이터(Big Data) 문제임.
- 백분위수는 이런 이유로 계산 비용이 매우 큰 것으로 악명 높음.
- 하지만 전체 집단을 보관하고 정렬하는 것에 거의 준하는 수준의 근사 백분위수(approximate percentiles) 계산 방법이 많이 존재함.
- 관련 학술 연구도 매우 많음.
- 한 방법은 히스토그램(histograms)임.
- 히스토그램은 값을 범위 또는 빈(bin)으로 나누고 각 범위에 얼마나 많이 속하는지 셈함.
- 또 다른 방법은 근사 스트리밍 데이터 구조와 알고리즘(sketches)임.
- 또 다른 방법은 집단에서 샘플링하여 빠른 근사 답을 제공하는 데이터베이스임.
- 시간, 공간, 또는 둘 다에 제한을 둔 해법도 존재함.
- 이런 해법들의 핵심은 대체로 집단의 분포(distribution)를 어떤 방식으로든 근사하는 것임.
- 분포로부터 근사 백분위수뿐 아니라 다른 흥미로운 정보도 계산할 수 있음.
- Optimizely 블로그 글에는 응답시간 분포와 평균, 99백분위수를 보여주는 좋은 예시가 있음.
- 근사 분포를 계산하고 저장하는 방법은 많음.
- 그중 히스토그램은 상대적으로 단순해서 인기 있음.
- 일부 모니터링 솔루션은 실제로 히스토그램을 지원함.
- 예를 들어 Circonus가 그러함.
- Circonus CEO Theo Schlossnagle는 히스토그램의 장점을 자주 설명함.
- 궁극적으로 원래 집단의 분포를 가진다는 것은 백분위수 계산 이상의 의미가 있음.
- 분포는 백분위수보다 훨씬 더 많은 것을 드러냄.
- 백분위수는 결국 많은 정보를 대표하려는 하나의 숫자일 뿐임.
- 작성자는 Theo가 트윗에서 “99th percentile is as bad as an average”라고 말한 정도까지는 동의하지 않음.
- 작성자는 백분위수 지지자들처럼, 백분위수가 평균보다 원래 집단의 중요한 특성을 더 잘 대표한다고 봄.
- 그러나 히스토그램만큼 잘 대표하지는 못함.
- 히스토그램은 훨씬 더 세밀함.
- 위의 Optimizely 차트는 어떤 단일 숫자보다 훨씬 많은 정보를 담고 있음.
Percentiles Done Better in Time Series Databases
- 시계열 데이터베이스에서 백분위수를 더 잘 계산하는 방법은 밴드형 메트릭(banded metrics)을 수집하는 것임.
- 이 설명은 많은 시계열 데이터베이스가 히스토그램을 저장할 능력이 없는, 이름 붙은 값의 정렬된 타임스탬프 집합일 뿐이라는 가정 위에 있음.
- 밴드형 메트릭은 시간에 따른 일련의 히스토그램과 같은 효과를 제공함.
- 방법은 값의 공간을 여러 범위 또는 밴드로 나누는 경계를 선택하는 것임.
- 그리고 각 밴드에 대해 시간에 따라 메트릭을 계산하고 저장함.
- 이 메트릭은 히스토그램과 마찬가지로 해당 범위에 속하는 관측치 수(count)임.
- 적절한 범위를 고르는 것은 일반적으로 어려운 문제임.
- 흔한 해법으로는 로그 스케일 범위(logarithmic ranges)가 있음.
- 또는 일정한 유효 자릿수(significant digits)를 제공하는 범위가 있음.
- 이런 방식은 균일하게 증가하지 않는 대신 계산이 더 빠를 수 있음.
- 균등 분할(even divisions)은 좋은 선택이 아닌 경우가 드묾.
- 이 주제에 대해서는 Brendan Gregg의 훌륭한 글을 읽어볼 것을 권함.
- 근본적인 긴장은 보존되는 데이터 양과 해상도의 세밀함 사이에 있음.
- 그러나 거친 밴딩(coarse banding)만으로도 단순 평균보다 더 많은 것을 보여줄 수 있음.
- 예를 들어 Phusion Passenger Union Station은 11개 밴드를 사용해 요청 지연시간(latency)의 밴드형 메트릭을 보여줌.
- 작성자는 그 시각화가 가장 효과적이라고 생각하지 않음.
- y축의 의미가 혼란스럽고, 본질적으로 3차원 차트를 비선형 방식으로 2차원에 매핑한 형태라고 봄.
- 그럼에도 불구하고 평균보다 더 많은 세부 정보를 보여줌.
- 이를 인기 있는 오픈소스 시계열 도구로 구현하려면 범위를 정의하고 예시와 같은 누적 차트(stacked charts)를 만들어야 함.
- 여기서 백분위수를 계산하는 것은 훨씬 더 어려움.
- 가장 큰 밴드부터 가장 작은 밴드까지 역순으로 순회하며 누적합을 계산해야 함.
- 누적합이 전체의 1%를 넘지 않는 지점에 도달하면 그 밴드가 99백분위수를 포함함.
- 여기에는 많은 미묘한 사항이 존재함.
- 예를 들어 엄격 부등식 처리, 경계 사례(edge cases) 처리, 백분위수 값으로 무엇을 사용할지 등이 있음.
- 상한 빈 경계(upper bin limit)를 쓸지, 하한을 쓸지, 중간값을 쓸지, 가중치를 둘지 등을 결정해야 함.
- 수학도 혼란스러울 수 있음.
- 예를 들어 99백분위수를 계산하려면 최소 100개 밴드가 필요하다고 생각할 수 있음.
- 그러나 실제로는 경우에 따라 다름.
- 두 개의 밴드만 있어도, 상위 밴드에 전체 값의 1%가 들어 있다면 이미 99백분위수를 구한 셈임.
- 이것이 직관에 반한다면 분위수(quantiles)를 깊이 생각해볼 가치가 있다고 작성자는 말함.
- 따라서 이 문제는 복잡함.
- 추상적으로는 가능함.
- 하지만 대체로 데이터베이스의 질의 언어(query language)가 근사 백분위수를 구하는 데 필요한 계산을 지원하는지에 달려 있음.
- 작성자는 이것이 확실히 가능한 시스템이 있다면 댓글로 알려달라고 말함.
- Graphite처럼 모든 메트릭이 자유롭게 평균 및 리샘플링 가능하다고 순진하게 가정하는 시스템에서는 밴드형 메트릭의 장점이 있음.
- 밴드형 메트릭은 이런 변환에 강건함.
- 계산이 모든 시간 구간에 대해 교환법칙(commutative)을 만족하기 때문에 올바른 답을 얻을 수 있음.
Beyond Percentiles: Heatmaps
- 백분위수는 평균과 마찬가지로 여전히 하나의 숫자임.
- 평균은 집단의 무게중심(center of gravity)을 보여준다고 할 수 있음.
- 백분위수는 집단의 일정 부분에 대한 고수위선(high-water mark)을 보여줌.
- 작성자는 백분위수를 해변의 파도 자국(wave marks)에 비유함.
- 이는 평균처럼 중심 경향만이 아니라 집단의 경계를 드러내기는 함.
- 그러나 여전히 전체 집단의 형태(shape)를 보여주는 분포만큼 설명력이 높지 않음.
- 이 지점에서 히트맵(heatmaps)이 등장함.
- 히트맵은 본질적으로 히스토그램을 옆으로 눕혀 쌓고, 이를 시간에 따라 수집하며, 색의 진하기로 시각화한 3차원 차트와 같은 것임.
- 다시 말해 Circonus는 히트맵 시각화의 훌륭한 예를 제공함.
- 반면 작성자가 알기로 Graphite는 밴드형 메트릭으로 히트맵을 만드는 능력이 없음.
- 만약 영리한 방법으로 가능하다면 알려달라고 작성자는 말함.
- 히트맵은 특히 지연시간의 형태와 밀도(density)를 시각화하는 데 훌륭함.
- 또 다른 예로 Fastly의 스트리밍 대시보드가 있음.
- 심지어 원시적으로 보일 수 있는 오래된 도구도 히트맵을 만들 수 있음.
- 예를 들어 Smokeping은 음영(shading)을 사용해 값의 범위를 보여줌.
- 그중 밝은 초록색은 평균을 나타냄.
How Bad Is It To Store Metrics Of Percentiles?
- 이런 복잡성과 미묘함을 본 뒤에는 StatsD의 upper_99 같은 백분위수 메트릭도 그렇게 나쁘지 않아 보일 수 있음.
- 이런 방식은 단순하고 효율적이며 즉시 사용 가능한(turnkey) 해법임.
- 그렇다면 실제로 얼마나 나쁜지가 문제임.
- 답은 상황에 따라 다름.
- 많은 목적에서는 이런 방식으로도 전혀 괜찮음.
- 물론 백분위수 자체가 단독으로는 설명력이 높지 않다는 한계는 여전히 있음.
- 그러나 그 점을 감수할 수 있다면, 남는 가장 큰 문제는 리샘플링 과정에서 값이 훼손되어 결국 틀린 데이터를 보게 된다는 점임.
- 하지만 모든 측정은 틀리다는 말도 있음.
- 그리고 많은 틀린 측정값도 여전히 유용함.
- 예를 들어 작성자는 사람들이 모니터링 시스템에서 쓰는 메트릭의 절반은 이미 의도적으로 변형된 값이라고 봄.
- 부하 평균(load average)이 그 예임.
- 부하 평균은 매우 유용함.
- 그러나 그 내부 계산 방식을 알게 되면 처음엔 꽤 놀랄 수 있음.
- 비슷하게 널리 사용되는 많은 시스템은 성능에 대한 부분적으로 가공된 메트릭을 보고함.
- Cassandra의 여러 메트릭은 Coda Hale의 Metrics 라이브러리 출력값임.
- 그리고 이것들은 시간 감쇠 평균(time-decayed averages), 즉 지수 가중 이동 평균(exponentially weighted moving averages)임.
- 어떤 사람들은 이런 방식에 강한 거부감을 보임.
- 다시 백분위수 메트릭으로 돌아오면, p99 메트릭을 저장한 뒤 확대를 풀어 긴 시간 범위의 평균 버전을 보게 되면 그것은 “올바른” 값이 아닐 수 있음.
- 그리고 실제 99백분위수와 꽤 다를 수도 있음.
- 그러나 그 값이 틀린 방식이 반드시 목적에 부적합하게 만들지는 않음.
- 여기서 목적이란 대다수 사용자가 애플리케이션에서 겪는 최악의 경험을 이해하는 것임.
- 정확한 값이나 오차와 무관하게, 백분위수 메트릭은 대체로 두 가지 성질을 가짐.
- 첫째, 이상 행동(outlying behavior)을 보여줌.
- 둘째, 이상 행동이 더 나빠질수록 값도 더 커짐.
- 이는 매우 유용함.
- 따라서 다시 말해 상황에 따라 다름.
- 백분위수의 작동 방식과 백분위수 평균이 틀렸다는 사실을 이해하고도 괜찮다면, 백분위수 메트릭을 저장하는 것이 여전히 유용할 수 있음.
- 그러나 이는 일종의 도덕적 해이(moral hazard)를 도입함.
- 자신이 무엇을 했는지 모르는 사람들, 특히 동료들을 깊이 혼란스럽게 만들 수 있기 때문임.
- StatsD 이슈의 댓글만 다시 봐도 그 혼란이 분명함.
- 작성자는 나쁜 비유 하나를 제시함.
- 작성자는 냉장고 안의 어떤 음식과 음료는 자신은 먹고 마셔도 남에게는 주지 않는다고 말함.
- 병에 “alcohol”이라고 적혀 있는데 실제로 메탄올(methanol)이 들어 있다면 어떤 사람은 마시고 실명할 수도 있음.
- 다른 사람은 병 안에 어떤 종류의 알코올이 들어 있는지 물을 것임.
- 이런 위험에 대한 책임을 져야 한다는 뜻임.
What Does DPM Do?
- 글 작성 시점 기준으로 DPM의 시계열 데이터베이스는 히스토그램을 지원하지 않음.
- 그리고 백분위수 메트릭을 계산해 저장하지도 않음.
- 다만 원한다면 사용자 정의 메트릭(custom metrics)을 쉽게 보낼 수 있음.
- 향후에는 고해상도, 즉 많은 밴드를 가진 밴드형 메트릭을 저장할 계획임.
- 대부분의 밴드는 아마 비어 있을 것이며, DPM의 시계열 데이터베이스는 희소 데이터(sparse data)를 효율적으로 처리할 수 있기 때문에 이것이 가능함.
- 이는 본질적으로 초당 한 번의 히스토그램을 제공하게 됨.
- DPM의 모든 시계열 데이터는 1초 단위 세분성(granularity)을 가짐.
- 기본적으로 3일인 설정 가능한 보존 기간이 지난 뒤에는 데이터를 1분 단위 세분성으로 다운샘플링함.
- 밴드형 메트릭은 어떤 수학적 이상 현상 없이 1분 단위 히스토그램으로 다운샘플링될 것임.
- 최종적으로 이 밴드형 메트릭으로부터 원하는 어떤 백분위수도 계산할 수 있게 될 것임.
- 그리고 값의 추정 오차를 표시할 수 있게 될 것임.
- 히트맵도 보여줄 수 있게 될 것임.
- 분포의 형태도 보여줄 수 있게 될 것임.
- 이는 빠르게 끝날 프로젝트가 아님.
- 많은 시스템 전반에 걸친 대규모 엔지니어링이 필요함.
- 그러나 기반은 이미 존재함.
- 시스템도 결국 이를 지원하도록 설계되었음.
- 언제 구현될지는 약속할 수 없음.
- 다만 장기적인 방향성을 알리는 것이 유익할 것이라고 작성자는 생각함.
Conclusions
- 작성자는 이 글이 예상보다 길어졌고 많은 주제를 다뤘다고 말함.
- 이 글이 도움이 되었기를 바란다고 말함.
- 작성자 Baron은 성능(performance)과 확장성(scalability) 전문가임.
- 그는 다양한 데이터베이스, 오픈소스, 분산 시스템 커뮤니티에 참여함.
- 그리고 많은 대규모 시스템의 구축과 확장을 도운 경력이 있음.