Java 21 Lambda 함수용 레이어 생성, 게시 및 사용 방법 블로그 게시물에서 Java 21을 사용하여 첫 번째 Lambda 레이어를 게시했습니다. 이 기사에서는 이 Lambda 레이어를 사용하여 애플리케이션을 생성한 다음 콜드 스타트와 웜 스타트를 측정합니다. SnapStart를 활성화하지 않고 SnapStart를 활성화하고 DynamoDB 호출 프라이밍 최적화를 적용한 경우입니다. 또한 Lambda 레이어를 사용하지 않고 다양한 Lambda 메모리 설정을 사용하여 Java 21의 콜드 및 웜 스타트 측정 문서에서 수행한 POM 파일의 모든 종속성을 제공하지 않고 결과를 측정과 비교할 것입니다.
실험에서는 샘플 애플리케이션을 사용하겠습니다. 기본적으로 AWS SAM 템플릿에는 API 게이트웨이 요청에 응답하고 DynamoDB의 API 게이트웨이에서 받은 ID로 제품을 검색하는 2개의 Lambda 함수가 정의되어 있습니다. 하나의 Lambda 함수 GetProductByIdWithPureJava21LambdaWithCommonLayer는 SnapStart 유무에 관계없이 사용할 수 있으며 두 번째 GetProductByIdWithPureJava21LambdaAndPrimingWithCommonLayer 함수는 SnapStart 및 DynamoDB 요청 호출 프라이밍을 사용합니다.
Lambda 레이어를 통해 제공되는 종속성은 애플리케이션의 pom.xml 파일에 "제공"되는 범위를 갖습니다.
AWS SAM 템플릿의 Lambda 함수에 대한 Java 21 Lambda 함수용 게시 및 사용 레이어를 생성하는 방법 문서에서 생성된 Lambda 레이어를 연결하려면 다음과 같이 Lambda 함수에 Layers 매개변수를 추가해야 합니다.
Type: AWS::Serverless::Function Properties: FunctionName: GetProductByIdWithPureJava21LambdaWithCommonLayer 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으로 바꾸십시오.
아래 실험 결과는 약 1시간 동안 진행된 실험으로 100번 이상의 콜드 스타트와 약 100,000번의 웜 스타트를 재현한 결과입니다. 이를 위해(및 이전 기사의 실험) 부하 테스트 도구를 사용했지만 Serverless-artillery 또는 Postman과 같이 원하는 도구를 사용할 수 있습니다.
저는 Lambda 함수에 1024MB 메모리를 제공하고 환경 변수를 통해 다음 컴파일 옵션을 전달하여 이 모든 실험을 실행했습니다. JAVA_TOOL_OPTIONS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" (프로파일링 없는 클라이언트 컴파일) 추운 시작 시간과 따뜻한 시작 시간 사이의 좋은 균형.
아래 표에서는 두 가지를 직접 비교할 수 있도록 다양한 Lambda 메모리 설정을 사용하여 Java 21의 콜드 및 웜 스타트 측정 기사에서 가져온 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 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 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 |
Masa mula sejuk (c) dan hangat (w) dengan SnapStart dan dengan DynamoDB invocation Priming dalam 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 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 |
Dalam artikel ini, kami mencipta aplikasi menggunakan lapisan Lambda dengan kebergantungan biasa dan kemudian mengukur masa mula sejuk dan hangat tanpa SnapStart didayakan, dengan SnapStart didayakan dan turut menggunakan pengoptimuman penyebuan invokasi DynamoDB dan membandingkan hasilnya dengan ukuran kami tanpa menggunakan Lambda lapisan dan menyediakan semua kebergantungan dalam fail POM yang kami lakukan dalam artikel Mengukur sejuk dan hangat bermula dengan Java 21 menggunakan tetapan memori Lambda yang berbeza.
Saya telah melakukan pengukuran dengan penggunaan lapisan Lambda biasa beberapa kali untuk benar-benar mengesahkan hasil percubaan saya. Walaupun saya mempunyai beberapa penyimpangan dalam keputusan antara ukuran tersebut, alirannya sentiasa sama: Apabila tidak mendayakan SnapStart atau mendayakannya tetapi tidak menggunakan penyebuan seruan DynamoDB permulaan sejuk dengan penggunaan Lambda biasa lapisan adalah beberapa ratus milisaat lebih tinggi berbanding dengan membungkus semua kebergantungan hanya dalam fail POM. Hanya apabila SnapStart didayakan untuk fungsi Lambda dan penyebuan invokasi DynamoDB telah digunakan permulaan sejuk dengan kedua-dua pendekatan adalah sangat hampir, mungkin disebabkan fakta bahawa semuanya sudah ada dalam petikan yang dibuat.
permulaan hangat fungsi Lambda agak hampir untuk kedua-dua kes penggunaan (dengan dan tanpa penggunaan lapisan Lambda) dan untuk semua eksperimen (dengan dan tanpa SnapStart didayakan) untuk hampir semua persentil, tetapi saya sentiasa mendapat hasil yang lebih tinggi untuk nilai maksimum dengan penggunaan lapisan Lambda biasa.
Dalam artikel seterusnya saya akan meneruskan percubaan saya dengan lapisan Lambda. Kali ini saya akan mencipta, menerbitkan dan menggunakan lapisan Lambda yang mengandungi bukan sahaja kebergantungan biasa (seperti dalam artikel ini) tetapi semua kebergantungan yang diperlukan untuk menjalankan aplikasi ini dan kemudian membandingkan keputusan kedua-dua percubaan.
위 내용은 AWS SnapStart - 부분 Lambda 계층을 사용하여 Java로 콜드 및 웜 스타트 측정(1)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!