ブログ投稿「Java 21 Lambda 関数のレイヤーを作成、公開、使用する方法」で、Java 21 を使用した最初の Lambda レイヤーを公開しました。この記事では、この Lambda レイヤーを使用してアプリケーションを作成し、コールド スタートとウォーム スタートを測定します。 SnapStart を有効にしない場合と、SnapStart を有効にして DynamoDB 呼び出しプライミング最適化も適用した場合の 2 回です。また、Lambda レイヤーを使用せず、記事「異なる Lambda メモリ設定を使用した Java 21 でのコールド スタートとウォーム スタートの測定」で行ったすべての依存関係を POM ファイルに提供せずに、結果を測定結果と比較します。
実験ではサンプル アプリケーションを使用します。 AWS SAM テンプレートには基本的に 2 つの Lambda 関数が定義されており、どちらも API Gateway リクエストに応答し、API Gateway から受け取った ID によって DynamoDB から製品を取得します。 1 つの Lambda 関数 GetProductByIdWithPureJava21LambdaWithCommonLayer は SnapStart の有無にかかわらず使用でき、2 つ目の GetProductByIdWithPureJava21LambdaAndPrimingWithCommonLayer は SnapStart と DynamoDB リクエスト呼び出しプライミングを使用します。
Lambda レイヤー経由で提供される依存関係のスコープは、アプリケーションの pom.xml ファイル内で「provided」されます。
記事「Java 21 Lambda 関数の公開レイヤーを作成して使用する方法」で作成した Lambda レイヤーを AWS SAM テンプレートの 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 (バージョンを含む) を、レイヤーの公開コマンド (aws lambda public-layer-version) の出力である独自の ARN に置き換えてください。
以下の実験の結果は、約 1 時間実行された実験で 100 回を超えるコールド スタートと約 100,000 回のウォーム スタートを再現したことに基づいています。そのために (および前回の記事の実験で) 負荷テスト ツールを使用しましたが、Serverless-artillery や Postman など、好きなツールを使用できます。
これらすべての実験は、Lambda 関数に 1024 MB のメモリを与え、環境変数 JAVA_TOOL_OPTIONS: "-XX: TieredCompilation -XX:TieredStopAtLevel=1" (プロファイリングなしのクライアント コンパイル) を介して次のコンパイル オプションを渡すことによって実行しました。これにより、非常に優れた結果が得られます。コールド スタート時間とウォーム スタート時間のトレードオフ。
以下の表では、記事「Java 21 でコールド スタートとウォーム スタートを測定する。異なる Lambda メモリ設定を使用して、両方を直接比較する」の記事から取得した、Lambda レイヤーを使用せずに測定した結果も提供します。
略語 c はコールド スタート、w はウォーム スタートを表します。
スナップスタートなしのコールド (c) およびウォーム (w) スタート時間 (ms):
実験 | c p50 | c p75 | c p90 | c p99 | c p99.9 | 最大値 | w p50 | w p75 | w p90 | w p99 | w p99.9 | 最大値 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
共通の Lambda レイヤーを使用 | 3497.91 | 3597.18 | 3695.58 | 3800.47 | 3908.33 | 4011.71 | 5.82 | 6.72 | 8.00 | 17.97 | 55.48 | 1709.13 |
Lambda レイヤーなし | 3157.6 | 3213.85 | 3270.8 | 3428.2 | 3601.12 | 3725.02 | 5.77 | 6.50 | 7.81 | 20.65 | 90.20 | 1423.63 |
プライミングなしのスナップスタートによるコールド (c) およびウォーム (w) スタート時間 (ms):
実験 | c p50 | c p75 | c p90 | c p99 | c p99.9 | 最大値 | w p50 | w p75 | w p90 | w p99 | w p99.9 | 最大値 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
共通の Lambda レイヤーを使用 | 2047.12 | 2124.24 | 2439.49 | 2705.52 | 2735.43 | 2831.59 | 5.68 | 6.40 | 7.45 | 17.06 | 48.45 | 2139.74 |
Lambda レイヤーなし | 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 呼び出しプライミングを使用したコールド (c) およびウォーム (w) スタート時間 (ms:
)実験 | c p50 | c p75 | c p90 | c p99 | c p99.9 | 最大値 | w p50 | w p75 | w p90 | w p99 | w p99.9 | 最大値 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
共通の Lambda レイヤーを使用 | 713.88 | 766.38 | 1141.94 | 1181.41 | 1214.94 | 1215.32 | 5.59 | 6.30 | 7.39 | 16.39 | 45.09 | 574.61 |
Lambda レイヤーなし | 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 を使用しない測定結果と比較しました。レイヤーを作成し、POM ファイル内のすべての依存関係を提供します。これは、「異なる Lambda メモリ設定を使用した Java 21 でのコールド スタートとウォーム スタートの測定」の記事で実行しました。
実験結果を実際に確認するために、一般的な Lambda レイヤーを使用して測定を複数回実行しました。これらの測定間の結果に多少の差異があったとしても、傾向は常に同じでした。SnapStart を有効にしていない場合、または有効にして DynamoDB 呼び出しのプライミングを使用していない場合、共通の Lambda を使用して コールド スタート が発生します。すべての依存関係を POM ファイルのみにパッケージ化する場合と比較して、レイヤーは数百ミリ秒高かったです。 Lambda 関数に対して SnapStart が有効になっていて、DynamoDB 呼び出しプライミングが適用されている場合にのみ、両方のアプローチで コールド スタート が非常に近くなりました。これはおそらく、作成されたスナップショットにすべてがすでに存在していたという事実によるものです。
Lambda 関数の ウォーム スタート は、両方のユースケース (Lambda レイヤーを使用する場合と使用しない場合) およびすべての実験 (SnapStart を有効にする場合と使用しない場合) のほぼすべてのパーセンタイルで非常に近かったです。ただし、共通の Lambda レイヤーを使用すると、常に最大値のより高い結果が得られます。
次の記事では、Lambda レイヤーの実験を続けます。今回は、一般的な依存関係 (この記事のような) だけでなく、このアプリケーションの実行に必要なすべての依存関係を含む Lambda レイヤーを作成、公開、使用し、両方の実験の結果を比較します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3