AWS SnapStart - 부분 Lambda 계층을 사용하여 Java로 콜드 및 웜 스타트 측정(2)
소개
Java 21 Lambda 함수용 레이어 생성, 게시 및 사용 방법 블로그 게시물에서 Java 21을 사용하여 첫 번째 Lambda 레이어를 게시하는 방법을 설명했습니다. 기사에서 Lambda 레이어를 사용하여 Java 21의 콜드 스타트 및 웜 스타트 측정(1) 이 Lambda 계층을 사용하여 애플리케이션을 생성한 다음 SnapStart를 활성화하지 않고 SnapStart를 활성화한 상태에서 콜드 및 웜 시작 시간을 측정하고 DynamoDB 호출 프라이밍 최적화를 적용하고 Lambda 계층을 사용하지 않고 POM 파일에 모든 종속성을 제공하지 않고 결과를 측정값과 비교합니다. 다양한 Lambda 메모리 설정을 사용하여 Java 21의 콜드 및 웜 스타트 측정 기사에서 이 작업을 수행했습니다. 이 기사에서는 모든 종속성을 포함하는 또 다른 Lambda 레이어를 생성하고 애플리케이션에서 이 레이어를 사용하여 동일한 측정을 수행하고 결과를 이전 실험과 비교할 것입니다.
모든 종속성이 있는 Lambda 계층을 사용하여 Java 21로 콜드 및 웜 스타트 측정
탐색을 위해 샘플 Lambda 계층을 사용하여 모든 종속성을 계층에 패키징하는 Java 21 런타임으로 Lambda 계층을 생성합니다.
- 다이나모드
- 람다
- 아파치 클라이언트
- aws-lambda-java-코어
- aws-lambda-java-이벤트
- org-crac
- slf4j-간단
- jackson-dataformat-xml
샘플 애플리케이션도 사용할 예정입니다. 기본적으로 AWS SAM 템플릿에는 API 게이트웨이 요청에 응답하고 DynamoDB의 API 게이트웨이에서 받은 ID로 제품을 검색하는 2개의 Lambda 함수가 정의되어 있습니다. 하나의 Lambda 함수 GetProductByIdWithPureJava21LambdaWithAllLayer는 SnapStart 유무에 관계없이 사용할 수 있으며 두 번째 함수 GetProductByIdWithPureJava21LambdaAndPrimingWithAllLayer는 SnapStart 및 DynamoDB 요청 호출 프라이밍을 사용합니다.
AWS SAM 템플릿의 Lambda 함수에 대해 이전에 생성된 모든 종속성과 함께 Lambda 계층을 사용하려면 다음과 같이 Lambda 함수에 Layers 매개변수를 추가해야 합니다.
Type: AWS::Serverless::Function Properties: FunctionName: GetProductByIdWithPureJava21LambdaWithAllLayer AutoPublishAlias: liveVersion Layers: - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:aws-pure-java-21-common-lambda-layer:1 Handler: software.amazonaws.example.product.handler.GetProductByIdHandler::handleRequest
계층 ARN(버전 포함)을 게시 계층 명령(awslambdaPublish-layer-version)의 출력인 자체 ARN으로 바꾸십시오.
pom.xml에서는 제공(첨부된 Lambda 레이어에 의해) 범위의 모든 종속성을 볼 수 있습니다.
아래 실험 결과는 약 1시간 동안 진행된 실험으로 100번 이상의 콜드 스타트와 약 100,000번의 웜 스타트를 재현한 결과입니다. 이를 위해(및 이전 기사의 실험) 부하 테스트 도구를 사용했지만 Serverless-artillery 또는 Postman과 같이 원하는 도구를 사용할 수 있습니다.
저는 Lambda 함수에 1024MB 메모리를 제공하고 환경 변수를 통해 다음 컴파일 옵션을 전달하여 이 모든 실험을 실행했습니다. JAVA_TOOL_OPTIONS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1"(프로파일링 없이 클라이언트 컴파일).
아래 표에서는 다른 Lambda 메모리를 사용하여 Java 21의 콜드 및 웜 스타트 측정 문서에서 수행한 Lambda 레이어를 사용하지 않고(그리고 POM 파일에 모든 종속성 제공) 측정 결과를 제공할 것입니다. 일반 Lambda 레이어를 사용할 때의 설정과 측정값을 직접 비교해보세요.
약어 c는 Cold Start, w는 Warm Start를 의미합니다.
SnapStart가 없는 콜드(c) 및 웜(w) 시작 시간(ms):
Experiment | c p50 | c p75 | c p90 | c p99 | c p99.9 | c max | w p50 | w p75 | w p90 | w p99 | w p99.9 | w max |
---|---|---|---|---|---|---|---|---|---|---|---|---|
with all dependencies Lambda Layer | 2824.33 | 2884.24 | 2963.14 | 3324.07 | 3622.44 | 3625.58 | 5.50 | 6.20 | 7.16 | 15.50 | 46.19 | 1278.41 |
with common Lambda Layer | 3497.91 | 3597.18 | 3695.58 | 3800.47 | 3908.33 | 4011.71 | 5.82 | 6.72 | 8.00 | 17.97 | 55.48 | 1709.13 |
w/o Lambda Layer | 3157.6 | 3213.85 | 3270.8 | 3428.2 | 3601.12 | 3725.02 | 5.77 | 6.50 | 7.81 | 20.65 | 90.20 | 1423.63 |
프라이밍 없이 SnapStart를 사용한 콜드(c) 및 웜(w) 시작 시간(ms):
Experiment | c p50 | c p75 | c p90 | c p99 | c p99.9 | c max | w p50 | w p75 | w p90 | w p99 | w p99.9 | w max |
---|---|---|---|---|---|---|---|---|---|---|---|---|
with all dependencies Lambda Layer | 1706.64 | 1767.40 | 1893.59 | 2314.91 | 2646.68 | 2647.33 | 5.59 | 6.25 | 7.21 | 15.75 | 48.06 | 1403.71 |
with common Lambda Layer | 2047.12 | 2124.24 | 2439.49 | 2705.52 | 2735.43 | 2831.59 | 5.68 | 6.40 | 7.45 | 17.06 | 48.45 | 2139.74 |
w/o Lambda Layer | 1626.69 | 1741.10 | 2040.99 | 2219.75 | 2319.54 | 2321.64 | 5.64 | 6.41 | 7.87 | 21.40 | 99.81 | 1355.09 |
SnapStart 및 DynamoDB 호출 프라이밍(ms)을 사용한 콜드(c) 및 웜(w) 시작 시간:
Experiment | c p50 | c p75 | c p90 | c p99 | c p99.9 | c max | w p50 | w p75 | w p90 | w p99 | w p99.9 | w max |
---|---|---|---|---|---|---|---|---|---|---|---|---|
with all dependencies Lambda Layer | 747.47 | 786.56 | 932.23 | 1099.38 | 1666.18 | 1666.62 | 5.42 | 5.91 | 7.39 | 16.39 | 45.09 | 574.61 |
with common Lambda Layer | 713.88 | 766.38 | 1141.94 | 1181.41 | 1214.94 | 1215.32 | 5.59 | 6.30 | 7.39 | 16.39 | 45.09 | 574.61 |
w/o Lambda Layer | 702.55 | 759.52 | 1038.50 | 1169.66 | 1179.05 | 1179.36 | 5.73 | 6.51 | 7.87 | 21.75 | 92.19 | 328.41 |
결론
이 기사에서는 모든 종속성이 포함된 Lambda 계층을 사용하여 애플리케이션을 생성한 다음 SnapStart를 활성화하지 않고 SnapStart를 활성화한 상태에서 콜드 및 웜 스타트 시간을 측정하고 DynamoDB 호출 프라이밍 최적화를 적용한 후 결과를 Lambda를 사용하지 않고 측정값과 비교했습니다. 다양한 Lambda 메모리 설정과 공통 Lambda 계층을 사용하여 Java 21의 콜드 및 웜 스타트 측정 문서에서 수행한 계층(및 POM 파일에 모든 종속성 제공)을 수행했습니다.
결과에 약간의 편차가 있었지만 모든 종속성을 포함하는 Lambda 레이어를 사용하여 여러 번 측정한 후에도 추세는 항상 동일했습니다.
- SnapStart를 활성화하지 않았을 때 이 Lambda 레이어를 사용한 콜드 스타트는 최대 p90의 백분위수에 대해 Lambda 레이어를 사용하지 않은 것보다 최대 수백 밀리초 더 낮았습니다(놀랐습니다).
- SnapStart를 활성화했지만 DynamoDB 요청의 프라이밍을 사용하지 않는 경우 콜드 스타트는 모든 종속성이 있는 Lambda 계층을 선호하거나 백분위수에 따라 Lambda 계층을 전혀 사용하지 않는 Lambda를 선호하도록 다양합니다.
- DynamoDB 요청 프라이밍과 함께 SnapStart를 사용할 때 콜드 스타트는 두 사용 사례 모두에서 최대 p99까지의 백분위수에 대해 종료되었고 그 다음에는 모든 종속성이 있는 Lambda 계층을 사용할 때 p99.9 이상에 대해 더 높았습니다. 따라서 각 사용 사례에 따라 결과가 많이 달라졌습니다. 제가 항상 관찰한 것은 모든 종속성을 포함하는 Lambda 레이어를 사용할 때 모든 측정에서 결과의 범위가 상당히 컸고(p50과 최대 값 사이의 800-900ms 차이), Lambda 레이어를 전혀 사용하지 않을 때 동일한 범위가 훨씬 더 낮았다는 것입니다.
- 이 문서의 측정값을 일반 Lambda 레이어의 측정값과 비교할 때 처음 2번의 실험에서 Lambda 레이어의 모든 종속성을 사용하여 콜드 스타트가 더 낮았다는 것을 확인했습니다(SnapStart가 활성화되지 않고 SnapStart가 활성화되었지만 프라이밍이 적용되지 않음). SnapStart가 활성화되고 DynamoDB 호출이 준비된 경우.
- Lambda 함수의 웜 스타트/실행 시간은 모든 사용 사례에서 매우 가까웠습니다.
따라서 Lambda 레이어를 사용하면(여기에 무엇을 입력하고 무엇을 애플리케이션에 종속성으로 제공하는지에 따라) 예측 불가능성이 추가되므로 항상 직접 측정해야 합니다!
위 내용은 AWS SnapStart - 부분 Lambda 계층을 사용하여 Java로 콜드 및 웜 스타트 측정(2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











일부 애플리케이션이 제대로 작동하지 않는 회사의 보안 소프트웨어에 대한 문제 해결 및 솔루션. 많은 회사들이 내부 네트워크 보안을 보장하기 위해 보안 소프트웨어를 배포 할 것입니다. ...

시스템 도킹의 필드 매핑 처리 시스템 도킹을 수행 할 때 어려운 문제가 발생합니다. 시스템의 인터페이스 필드를 효과적으로 매핑하는 방법 ...

데이터베이스 작업에 MyBatis-Plus 또는 기타 ORM 프레임 워크를 사용하는 경우 엔티티 클래스의 속성 이름을 기반으로 쿼리 조건을 구성해야합니다. 매번 수동으로 ...

많은 응용 프로그램 시나리오에서 정렬을 구현하기 위해 이름으로 이름을 변환하는 솔루션, 사용자는 그룹으로, 특히 하나로 분류해야 할 수도 있습니다.

IntellijideAultimate 버전을 사용하여 봄을 시작하십시오 ...

Java 객체 및 배열의 변환 : 캐스트 유형 변환의 위험과 올바른 방법에 대한 심층적 인 논의 많은 Java 초보자가 객체를 배열로 변환 할 것입니다 ...

전자 상거래 플랫폼에서 SKU 및 SPU 테이블의 디자인에 대한 자세한 설명이 기사는 전자 상거래 플랫폼에서 SKU 및 SPU의 데이터베이스 설계 문제, 특히 사용자 정의 판매를 처리하는 방법에 대해 논의 할 것입니다 ...

데이터베이스 쿼리에 tkmyBatis를 사용하는 경우 쿼리 조건을 구축하기 위해 엔티티 클래스 변수 이름을 우아하게 가져 오는 방법이 일반적인 문제입니다. 이 기사는 고정 될 것입니다 ...
