semtax의 개발 일지

통계값을 효율적으로 저장하기 : HdrHistogram 본문

개발/알고리즘

통계값을 효율적으로 저장하기 : HdrHistogram

semtax 2020. 5. 16. 15:15
반응형

개요

이번 포스팅에서는, P95값이나 평균 값과 같은 통계 지표들을 효율적으로 저장할 수 있는 방법 중에 하나인 HdrHistogram에 대해 알아보도록 하겠다.

P95와 평균을 저장하는 단순한 방법

우선 다음과 같은 상황을 가정해보자

만약 당신이, 모니터링 시스템을 만든다고 가정을 해보자.

이때, 수천~수억건의 응답시간 로그 데이터로 부터, 하위 5% 응답속도와 평균응답 속도를 계산해야 한다.

당신이라면 어떻게 하겠는가?

먼저, P95나 평균을 저장하는 단순한 방법은, 데이터를 계속 가지고 있다가 P95값이나 평균 값이 필요할때 마다, 또는 일정 주기마다 데이터들을 정렬해서 P95(하위 5% 값) 이나 평균값을 계산하는 방법이 있다.

하지만, 이러한 방법은 매번 데이터를 전부 들고있어야 하고, 수 많은 데이터를 매번 정렬을 해서 계산을 해야 되기 때문에 매우 느리다.

조금 더 나은 방법으로, 슬라이딩 윈도우 기법을 통해 부분적인 데이터만으로 P95나 평균을 계산하는 방법이 있다.

물론 이 방법도 좋은 방법이기는 하지만, 이전데이터들을 전부 버리기 때문에, 이전 데이터에 대한 통계 데이터를 찾는 연산을 수행(이전 24시간의 데이터 통계값 가져오기)하기에는 뭔가 모자란 느낌이다.

뭔가 더 좋은 방법이 있을것 같다. 그렇다면 더 나은방법이 있는것일까?

HdrHistogram의 동작방식

위와 같은 문제점을 해결하기 위해 나온 방식 중 하나가 HdrHistorgram 이라는 방식이다.

HDRHistogram 방식을 설명하기 전에, 중학교 1학년 수학시간으로 잠깐 돌아가보자.

중학교 1학년때, 히스토그램이라는 통계자료를 배웠을 것이다. 히스토그램의 핵심은 x축에 특정 데이터의 구간을 설정해서 두고, y축에 해당 구간에 속한 데이터의 값을 넣는 방식이다.

HDR Histogram은, 이러한 아이디어에서 착안, 마치 히스토그램 처럼 이전에 들어온 데이터들을, 특정 구간대로 끊어서 해당 구간에서의 평균, P95와 같은 백분위 값들을 요약해서 저장하는 방식을 사용해서 데이터를 저장한다.

또한, HDRHistogram 과 같은 경우, 사용자가 지정한 구간을, 내부적으로 더욱 세부적으로 나눠서 미리 선언된 버킷을 이용해서저장한 뒤, 해당 버킷에 있는 값을 이용해서 계산하므로 위에서 언급한 슬라이드 윈도우 방식에 비해서 더욱 정확한 통계값을 얻을 수 있다는 장점도 있다.

따라서, HDR 히스토그램을 통해 시계열 데이터에 대한 통계값들을 효율적으로 저장 할 수 있다.

img

활용

보통 시계열 데이터에 대한 통계 값들을 저장할때 많이 사용한다.

(지난 24시간의 응답속도 평균, 하위 95%, 하위 99.999% 등등)

따라서, 시계열 자료구조를 많이 사용하는 모니터링 시스템에 많이 적용할 수 있다.

실제로, 프로메테우스와 같은 시계열 DB에서 해당 알고리즘을 채택해서 사용하고 있다.

라이브러리

다행(?)히도, 많은 언어로 이미 구현이 되어있는 라이브러리가 github에 존재한다.

C, Java, javascript, python3, C# 등의 많은 언어를 지원한다.

https://github.com/HdrHistogram/HdrHistogram/blob/master/README.md

출처

  1. https://github.com/HdrHistogram/HdrHistogram/blob/master/README.md

  2. https://groups.google.com/d/topic/prometheus-developers/90HB7vPB6LY

  3. https://tideways.com/profiler/blog/developing-a-time-series-database-based-on-hdrhistogram

반응형
Comments