동시성 모니터링 - AWS Lambda

동시성 모니터링

Lambda는 CloudWatch Amazon 지표를 생성하여 함수의 동시성을 모니터링하는 데 도움이 됩니다. 이 토픽에서는 이러한 지표와 이를 해석하는 방법을 설명합니다.

일반 동시성 지표

다음 지표를 사용하여 Lambda 함수의 동시성을 모니터링합니다. 각 지표의 단위는 1분입니다.

  • ConcurrentExecutions - 지정된 시점의 활성 동시 호출 수입니다. Lambda는 모든 함수, 버전 및 별칭에 대해 이 지표를 내보냅니다. Lambda 콘솔의 모든 함수에 대해 Lambda는 기본적으로 지표 아래의 모니터링 탭에 ConcurrentExecutions에 대한 그래프를 표시합니다. MAX를 사용하여 이 지표를 봅니다.

  • UnreservedConcurrentExecutions - 예약되지 않은 동시성을 사용하는 활성 동시 호출 수입니다. Lambda는 리전의 모든 함수에 대해 이 지표를 내보냅니다. MAX를 사용하여 이 지표를 봅니다.

  • ClaimedAccountConcurrency - 온디맨드 간접 호출에 사용할 수 없는 동시 실행 수입니다. ClaimedAccountConcurrencyUnreservedConcurrentExecutions에 할당된 동시성 크기를 더한 값과 같습니다(즉, 예약된 총 동시성과 프로비저닝된 총 동시성 합계). ClaimedAccountConcurrency가 계정의 동시성 한도를 초과하는 경우 더 높은 계정 동시성 한도를 요청할 수 있습니다. MAX를 사용하여 이 지표를 봅니다. 자세한 설명은 ClaimedAccountConcurrency 지표 작업 섹션을 참조하세요.

프로비저닝된 동시성 지표

다음 지표를 사용하여 프로비저닝된 동시성을 사용하는 Lambda 함수를 모니터링합니다. 각 지표의 단위는 1분입니다.

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

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

  • ProvisionedConcurrentInvocations – Lambda가 프로비저닝된 동시성을 사용하여 함수 코드를 호출되는 횟수입니다. Lambda는 프로비저닝된 동시성이 구성된 각 함수 버전 및 별칭에 대해 이 지표를 내보냅니다. SUM을 사용하여 이 지표를 봅니다.

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

과 를 구분하는 그래픽. ProvisionedConcurrentInvocations ProvisionedConcurrentExecutions

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

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

1분에서 2분 사이에 Request 2가 들어오고 Request 1이 계속 실행됩니다. 2분에서 MAX(ProvisionedConcurrentExecutions)의 값은 2입니다. 지난 1분 동안 최대 2개의 실행 환경이 활성화되었기 때문입니다. 그러나 SUM(ProvisionedConcurrentInvocations) 값은 1입니다. 지난 1분 동안 1개의 새 요청만 들어왔기 때문입니다. 이 지표 동작은 예제가 끝날 때까지 계속됩니다.

  • ProvisionedConcurrencySpilloverInvocations – 모든 프로비저닝된 동시성을 사용 중인 경우 Lambda가 표준 동시성(예약되거나 예약되지 않은 동시성)을 사용하여 함수를 호출하는 횟수입니다. Lambda는 프로비저닝된 동시성이 구성된 각 함수 버전 및 별칭에 대해 이 지표를 내보냅니다. SUM을 사용하여 이 지표를 봅니다. ProvisionedConcurrentInvocations + ProvisionedConcurrencySpilloverInvocations의 값은 총 함수 호출 수(즉, Invocations 지표)와 같아야 합니다.

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

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

ProvisionedConcurrencySpilloverInvocations 값이 높으면 함수에 프로비저닝된 동시성을 추가로 할당해야 할 수 있습니다. 또는 사전 정의된 임계값을 기반으로 프로비저닝된 동시성의 자동 크기 조정을 처리하도록 Application Auto Scaling을 구성할 수 있습니다.

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

ClaimedAccountConcurrency 지표 작업

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

ClaimedAccountConcurrency = UnreservedConcurrentExecutions + (allocated concurrency)

UnreservedConcurrentExecutions는 예약되지 않은 동시성을 사용하는 활성 동시 간접 호출 수입니다. 할당된 동시성은 다음 두 부분의 합계입니다(RC는 '예약된 동시성', PC는 '프로비저닝된 동시성'으로 대체).

  • 리전의 모든 함수에 대한 RC 합계.

  • RC를 사용하는 함수를 제외하고 PC를 사용하는 리전의 모든 함수에서 PC 합계.

참고

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

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

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

Lambda의 결정 방식을 보여주는 그래프. ClaimedAccountConcurrency

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

이 시나리오에서 할당된 동시성은 ClaimedAccountConcurrency 수식에서 800입니다. 그러면 다이어그램의 다양한 지점에서 ClaimedAccountConcurrency의 값을 파생시킬 수 있습니다.

  • t1에서 ClaimedAccountConcurrency는 800(800 + UnreservedConcurrentExecutions 0)입니다.

  • t2에서 ClaimedAccountConcurrency는 900(800 + UnreservedConcurrentExecutions 100)입니다.

  • t3에서 ClaimedAccountConcurrency는 다시 900(800 + UnreservedConcurrentExecutions 100)입니다.

측정치 설정: ClaimedAccountConcurrency CloudWatch

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

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

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

에서 ClaimedAccountConcurrency 메트릭을 사용하는 방법을 보여주는 스크린샷 CloudWatch.

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