Java 21 Lambda 함수용 레이어 생성, 게시 및 사용 방법 블로그 게시물에서 Java 21을 사용하여 첫 번째 Lambda 레이어를 게시하는 방법을 설명했습니다. 기사에서 Lambda 레이어를 사용하여 Java 21의 콜드 스타트 및 웜 스타트 측정(1) 이 Lambda 계층을 사용하여 애플리케이션을 생성한 다음 SnapStart를 활성화하지 않고 SnapStart를 활성화한 상태에서 콜드 및 웜 시작 시간을 측정하고 DynamoDB 호출 프라이밍 최적화를 적용하고 Lambda 계층을 사용하지 않고 POM 파일에 모든 종속성을 제공하지 않고 결과를 측정값과 비교합니다. 다양한 Lambda 메모리 설정을 사용하여 Java 21의 콜드 및 웜 스타트 측정 기사에서 이 작업을 수행했습니다. 이 기사에서는 모든 종속성을 포함하는 또 다른 Lambda 레이어를 생성하고 애플리케이션에서 이 레이어를 사용하여 동일한 측정을 수행하고 결과를 이전 실험과 비교할 것입니다.
탐색을 위해 샘플 Lambda 계층을 사용하여 모든 종속성을 계층에 패키징하는 Java 21 런타임으로 Lambda 계층을 생성합니다.
샘플 애플리케이션도 사용할 예정입니다. 기본적으로 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 레이어를 사용하여 여러 번 측정한 후에도 추세는 항상 동일했습니다.
따라서 Lambda 레이어를 사용하면(여기에 무엇을 입력하고 무엇을 애플리케이션에 종속성으로 제공하는지에 따라) 예측 불가능성이 추가되므로 항상 직접 측정해야 합니다!
위 내용은 AWS SnapStart - 부분 Lambda 계층을 사용하여 Java로 콜드 및 웜 스타트 측정(2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!