

# 동시성 모니터링
<a name="monitoring-concurrency"></a>

Lambda가 함수에 대한 동시성 지표를 모니터링하는 데 도움이 되는 Amazon CloudWatch 지표를 내보냅니다. 이 토픽에서는 이러한 지표와 이를 해석하는 방법을 설명합니다.

**Topics**
+ [일반 동시성 지표](#general-concurrency-metrics)
+ [프로비저닝된 동시성 지표](#provisioned-concurrency-metrics)
+ [`ClaimedAccountConcurrency` 지표 작업](#claimed-account-concurrency)

## 일반 동시성 지표
<a name="general-concurrency-metrics"></a>

다음 지표를 사용하여 Lambda 함수의 동시성을 모니터링합니다. 각 지표의 단위는 1분입니다.
+ `ConcurrentExecutions` - 지정된 시점의 활성 동시 호출 수입니다. Lambda는 모든 함수, 버전 및 별칭에 대해 이 지표를 내보냅니다. Lambda 콘솔의 모든 함수에 대해 Lambda는 기본적으로 **지표** 아래의 **모니터링** 탭에 `ConcurrentExecutions`에 대한 그래프를 표시합니다. **MAX**를 사용하여 이 지표를 봅니다.
+ `UnreservedConcurrentExecutions` - 예약되지 않은 동시성을 사용하는 활성 동시 호출 수입니다. Lambda는 리전의 모든 함수에 대해 이 지표를 내보냅니다. **MAX**를 사용하여 이 지표를 봅니다.
+ `ClaimedAccountConcurrency` - 온디맨드 간접 호출에 사용할 수 없는 동시 실행 수입니다. `ClaimedAccountConcurrency`는 `UnreservedConcurrentExecutions`에 할당된 동시성 크기를 더한 값과 같습니다(즉, 예약된 총 동시성과 프로비저닝된 총 동시성 합계). `ClaimedAccountConcurrency`가 계정의 동시성 한도를 초과하는 경우 [더 높은 계정 동시성 한도](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-concurrency-limit-increase/)를 요청할 수 있습니다. **MAX**를 사용하여 이 지표를 봅니다. 자세한 내용은 [`ClaimedAccountConcurrency` 지표 작업](#claimed-account-concurrency) 섹션을 참조하세요.

## 프로비저닝된 동시성 지표
<a name="provisioned-concurrency-metrics"></a>

다음 지표를 사용하여 프로비저닝된 동시성을 사용하는 Lambda 함수를 모니터링합니다. 각 지표의 단위는 1분입니다.
+ `ProvisionedConcurrentExecutions` – 프로비저닝된 동시성에 대한 호출을 능동적으로 처리하는 실행 환경 인스턴스의 수입니다. Lambda는 프로비저닝된 동시성이 구성된 각 함수 버전 및 별칭에 대해 이 지표를 내보냅니다. **MAX**를 사용하여 이 지표를 봅니다.

`ProvisionedConcurrentExecutions`는 할당하는 프로비저닝된 동시성의 총 수와 동일하지 않습니다. 예를 들어, 100단위의 프로비저닝된 동시성을 함수 버전에 할당한다고 가정해 보겠습니다. 지정된 시간 동안 실행 환경 100개 중 최대 50개가 호출을 동시에 처리하는 경우 **MAX**(`ProvisionedConcurrentExecutions`) 값은 50입니다.
+ `ProvisionedConcurrencyInvocations` – Lambda가 프로비저닝된 동시성을 사용하여 함수 코드를 간접 호출되는 횟수입니다. Lambda는 프로비저닝된 동시성이 구성된 각 함수 버전 및 별칭에 대해 이 지표를 내보냅니다. **SUM**을 사용하여 이 지표를 봅니다.

`ProvisionedConcurrencyInvocations`는 총 호출 수를 계산하고 `ProvisionedConcurrentExecutions`는 활성 환경 수를 계산한다는 점에서 `ProvisionedConcurrencyInvocations`는 `ProvisionedConcurrentExecutions`와 다릅니다. 이러한 차이를 이해하려면 다음 시나리오를 고려하세요.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/concurrency-metrics-pc-executions-vs-invocations.png)


이 예제에서는 분당 1개의 호출을 수신하고 각 호출을 완료하는 데 2분이 걸린다고 가정해 보겠습니다. 각 주황색 가로 막대는 단일 요청을 나타냅니다. 각 요청이 프로비저닝된 동시성에서 실행되도록 이 함수에 10단위의 프로비저닝된 동시성을 할당한다고 가정해 보겠습니다.

0분에서 1분 사이에 `Request 1`이 들어옵니다. **1분에서** **MAX**(`ProvisionedConcurrentExecutions`)의 값은 1입니다. 지난 1분 동안 최대 1개의 실행 환경이 활성화되었기 때문입니다. **SUM**(`ProvisionedConcurrencyInvocations`) 값도 1입니다. 지난 1분 동안 1개의 새 요청이 들어왔기 때문입니다.

1분에서 2분 사이에 `Request 2`가 들어오고 `Request 1`이 계속 실행됩니다. **2분에서** **MAX**(`ProvisionedConcurrentExecutions`)의 값은 2입니다. 지난 1분 동안 최대 2개의 실행 환경이 활성화되었기 때문입니다. 그러나 **SUM**(`ProvisionedConcurrencyInvocations`) 값은 1입니다. 지난 1분 동안 1개의 새 요청만 들어왔기 때문입니다. 이 지표 동작은 예제가 끝날 때까지 계속됩니다.
+ `ProvisionedConcurrencySpilloverInvocations` – 모든 프로비저닝된 동시성을 사용 중인 경우 Lambda가 표준 동시성(예약되거나 예약되지 않은 동시성)을 사용하여 함수를 간접 호출하는 횟수입니다. Lambda는 프로비저닝된 동시성이 구성된 각 함수 버전 및 별칭에 대해 이 지표를 내보냅니다. **SUM**을 사용하여 이 지표를 봅니다. `ProvisionedConcurrencyInvocations` \$1 `ProvisionedConcurrencySpilloverInvocations`의 값은 총 함수 호출 수(즉, `Invocations` 지표)와 같아야 합니다.

  `ProvisionedConcurrencyUtilization` – 사용 중인 프로비저닝된 동시성의 백분율(즉, `ProvisionedConcurrentExecutions` 값을 할당된 프로비저닝된 동시성의 총량으로 나눈 값). Lambda는 프로비저닝된 동시성이 구성된 각 함수 버전 및 별칭에 대해 이 지표를 내보냅니다. **MAX**를 사용하여 이 지표를 봅니다.

예를 들어, 100단위의 프로비저닝된 동시성을 함수 버전에 프로비저닝한다고 가정해 보겠습니다. 지정된 시간 동안 실행 환경 100개 중 최대 60개가 호출을 동시에 처리하는 경우 **MAX**(`ProvisionedConcurrentExecutions`) 값은 60이고 **MAX**(`ProvisionedConcurrencyUtilization`) 값은 0.6입니다.

`ProvisionedConcurrencySpilloverInvocations` 값이 높으면 함수에 프로비저닝된 동시성을 추가로 할당해야 할 수 있습니다. 또는 사전 정의된 임계값을 기반으로 [프로비저닝된 동시성의 자동 크기 조정을 처리하도록 Application Auto Scaling을 구성](https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html#managing-provisioned-concurency)할 수 있습니다.

반대로 `ProvisionedConcurrencyUtilization`의 값이 계속 낮으면 함수에 대해 프로비저닝된 동시성이 과도하게 할당되었을 수 있습니다.

## `ClaimedAccountConcurrency` 지표 작업
<a name="claimed-account-concurrency"></a>

Lambda는 `ClaimedAccountConcurrency` 지표를 사용하여 온디맨드 간접 호출에 사용할 수 있는 계정의 동시성 수를 결정합니다. Lambda는 다음 수식을 `ClaimedAccountConcurrency`를 계산합니다.

```
ClaimedAccountConcurrency = UnreservedConcurrentExecutions + (allocated concurrency)
```

`UnreservedConcurrentExecutions`는 예약되지 않은 동시성을 사용하는 활성 동시 간접 호출 수입니다. 할당된 동시성은 다음 두 부분의 합계입니다(`RC`는 '예약된 동시성', `PC`는 '프로비저닝된 동시성'으로 대체).
+ 리전의 모든 함수에 대한 `RC` 합계.
+ `RC`를 사용하는 함수를 제외하고 `PC`를 사용하는 리전의 모든 함수에서 `PC` 합계.

**참고**  
함수에서 `RC`보다 더 많은 `PC`를 할당할 수 없습니다. 따라서 함수의 `RC`는 항상 해당 `PC` 이상입니다. `PC` 및 `RC`를 모두 사용하는 함수에 할당된 동시성의 기여도를 계산할 때 Lambda는 둘 중 최댓값인 `RC`만 고려합니다.

Lambda는 `ConcurrentExecutions` 대신 `ClaimedAccountConcurrency` 지표를 사용하여 온디맨드 간접 호출에 사용할 수 있는 동시성 수를 결정합니다. `ConcurrentExecutions` 지표는 활성 동시 간접 호출 수를 추적하는 데 유용하지만 실제 동시 실행 가능 여부를 항상 반영하는 것은 아닙니다. Lambda는 예약 동시성과 프로비저닝된 동시성도 고려하여 가용성을 결정하기 때문입니다.

`ClaimedAccountConcurrency`를 설명하기 위해 함수 전체에서 많은 예약 동시성과 프로비저닝된 동시성을 구성하지만 거의 사용되지 않는 시나리오를 살펴봅니다. 다음 예제에서는 계정 동시성 한도가 1,000이고 계정에 두 가지 주요 함수(`function-orange` 및 `function-blue`)가 있다고 가정합니다. `function-orange`의 예약된 동시성 단위로 600을 할당합니다. `function-blue`의 프로비저닝된 동시성 단위로 200을 할당합니다. 시간이 지남에 따라 추가 함수를 배포하고 다음 트래픽 패턴을 관찰한다고 가정합니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/claimed-account-concurrency.png)


이전 다이어그램에서 검은색 선은 시간 경과에 따른 실제 동시성 수를 나타내고 빨간색 선은 시간 경과에 따른 `ClaimedAccountConcurrency` 값을 나타냅니다. 함수 전체에서 실제 동시성 사용률은 낮지만 이 시나리오에서는 `ClaimedAccountConcurrency`의 최솟값이 800입니다. `function-orange` 및 `function-blue`에 총 800의 동시성 단위를 할당했기 때문입니다. Lambda의 관점에서 이 동시성을 사용하도록 '청구'했으므로 다른 함수에 사용할 수 있는 남은 동시성 단위는 실제로 200입니다.

이 시나리오에서 할당된 동시성은 `ClaimedAccountConcurrency` 수식에서 800입니다. 그러면 다이어그램의 다양한 지점에서 `ClaimedAccountConcurrency`의 값을 파생시킬 수 있습니다.
+ `t1`에서 `ClaimedAccountConcurrency`는 800(800 \$1 `UnreservedConcurrentExecutions` 0)입니다.
+ `t2`에서 `ClaimedAccountConcurrency`는 900(800 \$1 `UnreservedConcurrentExecutions` 100)입니다.
+ `t3`에서 `ClaimedAccountConcurrency`는 다시 900(800 \$1 `UnreservedConcurrentExecutions` 100)입니다.

### CloudWatch에서 `ClaimedAccountConcurrency` 지표 설정
<a name="claimed-account-concurrency-example"></a>

Lambda는 CloudWatch에서 `ClaimedAccountConcurrency` 지표를 생성합니다. 다음 수식과 같이 계정의 동시성 사용률 퍼센트를 얻기 위해 `SERVICE_QUOTA(ConcurrentExecutions)`의 값과 함께 이 지표를 사용합니다.

```
Utilization = (ClaimedAccountConcurrency/SERVICE_QUOTA(ConcurrentExecutions)) * 100%
```

다음 스크린샷은 CloudWatch에서 이 수식을 그래프로 표시하는 방법을 보여줍니다. 녹색 `claim_utilization` 선은 이 계정의 동시성 사용률을 나타내며, 약 40%입니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/claimed-account-concurrency-cloudwatch-graph.png)


이전 스크린샷에는 동시성 사용률이 70%를 초과할 때 `ALARM` 상태가 되는 CloudWatch 경보도 포함되어 있습니다. 유사한 경보와 함께 `ClaimedAccountConcurrency` 지표를 사용하여 계정 동시성 한도 상향 조정을 요청해야 하는 시기를 사전에 결정할 수 있습니다.