백분위수 및 분포 값 측정항목

이 문서에서는 Distribution 값 유형의 측정항목 데이터에 대한 백분위수와 히스토그램 모델을 이해하는 방법을 설명합니다. 분포 측정항목은 버킷이라고 하는 값 범위를 정의하고 각 버킷에 포함되는 측정된 값 수를 기록합니다. 분포 측정항목은 개별 측정 값을 보고하지 않습니다. 대신에 버킷의 개수 히스토그램을 보고합니다. 이러한 값 유형은 개별 측정값이 너무 많아서 수집하기 어렵지만 평균이나 백분위수와 같은 통계 정보가 유용한 경우에 사용됩니다.

히트맵에 분포 값 측정항목을 차트로 표시하면 차트 툴바의 옵션을 사용하여 50번째, 95번째, 99번째 백분위수를 오버레이할 수 있습니다. 선 차트에 분포 값 측정항목을 표시하려면 분포 값을 숫자 값으로 변환하도록 차트를 구성해야 합니다. 백분율을 선택하는 정렬기를 사용하여 이 변환을 수행할 수 있습니다.

이 페이지의 다음 섹션에서는 합성 예시를 사용하여 백분위수가 결정되는 방식을 보여줍니다. 이 예시에서는 버킷 수, 버킷 너비, 측정값 분포, 샘플 총개수에 따라 달라지는 백분위수 값을 보여줍니다. 백분위수 값을 히스토그램에서 사용할 수 없으므로 이 값은 실제 측정 값에 종속되지 않습니다.

합성 데이터의 예시

비율이 1이고 성장 계수가 2이며 유한 버킷이 10개인 Exponential 버킷 모델이 있다고 가정해 보겠습니다. 이 히스토그램에는 유한 버킷 10개, 상한값만 지정하는 버킷 1개, 하한값만 지정하는 버킷 1개로 총 12개의 버킷이 포함됩니다. 이 예시에서 색인이 n+1인 유한 버킷은 색인이 n인 유한 버킷 너비의 2배입니다.

다음 예시에서는 버킷의 너비에 따라 계산된 백분위수와 측정값 간의 최대 오류가 결정된다는 것을 보여줍니다. 또한 히스토그램의 샘플 수가 중요하다는 점을 보여줍니다. 예를 들어 샘플 수가 20개 미만이면 95번째 및 99번째 백분위수는 항상 동일한 버킷에 있습니다.

사례 1: 총 샘플 수는 1입니다.

측정값이 하나인 경우 3번째 백분위수 값은 다르지만 동일한 버킷의 50번째, 95번째, 99번째 백분위수만 표시됩니다. 측정값을 알 수 없으므로 추정치와 실제 측정값 간의 오차를 확인할 수 없습니다.

예를 들어 측정값의 히스토그램이 다음 표에 표시된다고 가정합니다.

버킷 번호 하한값 상한값 개수 백분위수 범위
0 1 0 0
1 1 2 0 0
2 2 4 0 0
3 4 8 0 0
4 8 16 0 0
5 16 32 0 0
6 32 64 0 0
7 64 128 0 0
8 128 256 1 0 - 100
9 256 512 0 0
10 512 1024 0 0
11 1024 0 0

50번째 백분위수를 계산하려면 다음을 수행합니다.

  1. 버킷 개수를 사용하여 50번째 백분위수가 포함된 버킷을 확인합니다. 이 예시에서는 버킷 8번에 50번째 백분위수가 포함되어 있습니다.
  2. 다음 규칙을 사용하여 추정치를 계산합니다.

    pth percentage = bucket_low +
                    (bucket_up - bucket_low)*(p - p_low)/(p_up - p_low)
    

    이전 표현식에서 p_lowp_up은 버킷의 백분위수 범위의 하한 및 상한입니다. 마찬가지로 bucket_lowbucket_up은 버킷의 하한 및 상한입니다. p_lowp_up의 값은 개수가 서로 다른 버킷 간에 분산되는 방식에 따라 다릅니다.

예를 들어 50번째 백분위수는 다음과 같이 계산됩니다.

   50th percentile = 128 + (256-128)*(50-0)/(100-0)
                   = 128 + 128 * 50 / 100
                   = 128 + 64
                   = 192

95번째 백분위수를 계산하려면 이전 표현식의 5095로 바꿉니다. 정확히 샘플이 하나 있는 이 예시에서 백분위수는 다음과 같습니다.

백분위수 버킷 번호
50번째 8 192
95번째 8 249.6
99번째 8 254.7

추정치와 실제 측정값 간의 오차는 제한될 수 있지만 측정값을 알 수 없으므로 확인할 수 없습니다.

사례 2: 총 샘플 수는 10입니다.

10개의 샘플이 있는 경우 50번째 백분위수는 95번째 백분위수 및 99번째 백분위수와 다른 버킷에 있을 수 있습니다. 그러나 95번째와 99번째 백분위수를 다른 버킷에 있도록 하기에는 측정값이 충분하지 않습니다.

예를 들어 측정값의 히스토그램이 다음 표에 표시된다고 가정합니다.

버킷 번호 하한값 상한값 개수 백분위수 범위
0 1 4 0 - 40
1 1 2 2 40 - 60
2 2 4 1 60 - 70
3 4 8 1 70 - 80
4 8 16 1 80 - 90
5 16 32 0 0
6 32 64 0 0
7 64 128 0 0
8 128 256 1 90 - 100
9 256 512 0 0
10 512 1024 0 0
11 1024 0 0

앞에서 설명한 절차를 사용하여 50번째, 95번째, 99번째 백분위수를 계산할 수 있습니다. 예를 들어 버킷 1번에 있는 50번째 백분위수는 다음과 같이 계산됩니다.

50th percentile = 1 + (2-1)*(50-40)/(60-40)
                = 1 + (1 * 10 / 20)
                = 1 + 0.5
                = 1.5

마찬가지로 95번째 백분위수는 다음과 같이 계산됩니다.

95th percentile = 128 + (256-128)*(95-90)/(100-90)
                = 128 + 128 * 5 / 10
                = 128 + 64
                = 192

앞에서 설명한 프로세스를 사용하면 백분위수를 계산할 수 있습니다. 다음 표의 각 행에는 백분위수, 해당 버킷, 계산된 값이 나열되어 있습니다.

백분위수 버킷 번호 최대 오류
50번째 1 1.5 0.5
95번째 8 192 74
99번째 8 243.2 115.2

이 예시와 이전 예시에서 95번째 백분위수는 8번 버킷에 있습니다. 그러나 백분위수 값은 다릅니다. 이 차이는 샘플 배포 방식으로 인해 발생합니다. 첫 번째 예시에서는 모든 샘플이 같은 버킷에 있지만 최신 예시에서는 샘플이 서로 다른 버킷에 있습니다.

실제 데이터의 예시

이 섹션에는 특정 측정항목에서 사용하는 버킷 모델을 확인하는 방법을 설명하는 예시가 나와 있습니다. 이 섹션에서는 계산된 백분위수 값에서 잠재적인 오류를 평가하는 방법도 설명합니다.

버킷 모델 식별

특정 시간 간격 동안 측정항목에 사용된 버킷을 확인하려면 Cloud Monitoring API의 projects.timeSeries/list 메서드를 호출합니다.

예를 들어 측정항목의 버킷 모델을 식별하려면 다음을 수행하세요.

  1. projects.timeSeries/list 웹페이지로 이동합니다.
  2. API 탐색기에서 측정항목, 시작 시간 및 종료 시간을 지정하는 필터를 입력합니다.

    예를 들어 API 요청 지연 시간을 저장하는 측정항목에 대한 정보를 가져오려면 다음을 입력합니다.

    metric.type="serviceruntime.googleapis.com/api/request_latencies"
    resource.type="consumed_api"
    

    이 예시에서 필터 필드는 측정항목 유형과 리소스 유형을 지정합니다. 이러한 필터에 대한 자세한 내용은 Monitoring 필터를 참조하세요.

  3. 입력을 클릭합니다.

다음은 하나의 Google Cloud 프로젝트에서 사용할 수 있는 분포 값 측정항목의 list API 응답입니다.

{
  "timeSeries": [
    {
      "metric": {...},
      "resource": {...},
      },
      "metricKind": "DELTA",
      "valueType": "DISTRIBUTION",
      "points": [
        {
          "interval": {
            "startTime": "2020-11-03T15:05:00Z",
            "endTime": "2020-11-03T15:06:00Z"
          },
          "value": {
            "distributionValue": {
              "count": "3",
              "mean": 25.889,
              "bucketOptions": {
                "exponentialBuckets": {
                  "numFiniteBuckets": 66,
                  "growthFactor": 1.4,
                  "scale": 1
                }
              },
              "bucketCounts": [
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "3"
              ]
            }
          }
        },

API 응답에서 value 필드는 points 배열에 저장된 데이터를 설명합니다. countmean 필드는 지정된 시간 간격에 측정값 3개가 있고 평균 값이 25.889라고 보고합니다. bucketOptions 필드에서는 지수 모델이 버킷 66개, 비율 1, 성장 계수 1.4를 갖도록 구성되었음을 보여줍니다.

색인이 n인 버킷의 하한 및 상한을 계산하려면 다음 규칙을 사용하세요.

  • 하한값(1 ≤ n < N) = 비율 * (성장 계수)(n-1)
  • 상한값(0 ≤ n < N-1) = 비율 * (성장 계수)n

이전 표현식에서 N은 버킷의 총개수입니다.

다음 표에는 이 측정항목의 버킷과 각 버킷의 중간점이 나와 있습니다.

n번째 버킷 하한값 상한값 중간값
0 1 해당 없음
1 1 1.40 1.20
2 1.40 1.96 1.68
...
9 14.76 20.66 17.71
10 20.66 28.93 24.79
11 28.93 40.50 34.71
...

백분위수 계산 확인

이제 버킷 구성을 알고 있으므로 측정값 세트에서 50번째, 95번째, 99번째 백분위수 값을 예측할 수 있습니다. 예를 들어 샘플이 하나 있고 버킷 10번에 있는 경우 50번째 백분위수 값은 24.79입니다.

측정항목의 50번째, 95번째, 99번째 백분위수 값을 검색하려면 API 메서드 projects.timeSeries/list를 사용하고 정렬 기간과 정렬기를 포함하면 됩니다. 이 예시에서는 다음 설정이 선택되었습니다.

  • Aligner: ALIGN_PERCENTILE_50, ALIGN_PERCENTILE_95 또는 ALIGN_PERCENTILE_99
  • 정렬 기간: 60초

ALIGN_PERCENTILE_50 선택의 경우 시계열의 각 값은 버킷의 50번째 백분위수입니다.

{
  "timeSeries": [
    {
      "metric": {...},
      "resource": {...},
      "metricKind": "GAUGE",
      "valueType": "DOUBLE",
      "points": [
        {
          "interval": {
            "startTime": "2020-11-03T15:06:36Z",
            "endTime": "2020-11-03T15:06:36Z"
          },
          "value": {
            "doubleValue": 24.793256140799986
          }
        },
        {
          "interval": {
            "startTime": "2020-11-03T15:05:36Z",
            "endTime": "2020-11-03T15:05:36Z"
          },
          "value": {
            "doubleValue": 34.710558597119977
          }
        },
        {
          "interval": {
            "startTime": "2020-11-03T15:04:36Z",
            "endTime": "2020-11-03T15:04:36Z"
          },
          "value": {
            "doubleValue": 24.793256140799986
          }
        }
      ]
    },

두 샘플 중 50번째 백분위수는 10번 버킷에 있으며, 다른 샘플에서는 11번 버킷에 있습니다.

다음 표에서는 다른 정렬기를 사용하여 projects.timeSeries/list 메서드를 실행한 결과를 보여줍니다. 첫 번째 행은 정렬기가 지정되지 않은 경우에 해당합니다. 정렬기를 지정하지 않으면 버킷 모델과 평균 값이 반환됩니다. 다음 세 행에는 정렬기가 ALIGN_PERCENTILE_50, ALIGN_PERCENTILE_95, ALIGN_PERCENTILE_99로 설정될 때 반환된 데이터가 나열되어 있습니다.

통계 샘플 @ 15:06 샘플 @ 15:05 샘플 @ 15:04
평균 25.889 33.7435 지원되지 않음
50번째 백분위수 24.79 34.71 24.79
95번째 백분위수 28.51 39.91 28.51
99번째 백분위수 28.84 40.37 28.84

합성 데이터가 있는 두 예시에서 보여주는 것처럼 백분위수 값은 샘플 분포 방식에 따라 달라집니다. 모든 샘플이 샘플 버킷에 있으면 50번째 백분위수는 해당 버킷의 중간값입니다. 그러나 샘플이 다른 버킷에 있으면 이 분포가 추정치에 영향을 미칩니다.

50번째 백분위수가 평균 값의 합리적인 추정치인지 확인하려면 평균 값을 50번째 백분위수와 비교하면 됩니다. 평균 값은 버킷 세부정보와 함께 반환됩니다.

다음 단계

분포 값 측정항목 정보에서 분포 값 측정항목을 시각화하는 방법 알아보기