これまで、arm64 アーキテクチャの一部のユースケース (DynamoDB リクエストの実行など) では、SnapStart がサポートされていなかったため、Java 21 ランタイムを使用した Lambda 関数のパフォーマンス (ウォーム スタート時間とコールド スタート時間) を測定していませんでした。 SnapStart が有効になっている x86_64 アーキテクチャの Java 21 ランタイムを備えた Lambda は、arm64 アーキテクチャを備えた Lambda よりも優れたパフォーマンスを発揮します (追加のプライミング最適化によりさらに優れています)。しかし、2024 年 7 月 18 日、AWS は、AWS Lambda が ARM64 アーキテクチャを使用する SnapStart for Java 関数をサポートするようになったと発表しました。したがって、Lambda 関数のアーキテクチャの選択も考慮して、コールド スタート時間とウォーム スタート時間の測定を開始することは理にかなっています。現在の AWS Lambda のメモリ設定と実行期間の価格設定では、arm64 アーキテクチャの Lambda は約 100 時間かかることが知られています。 x86_64 アーキテクチャの Lambda より 25% 安価です。
私は、このトピックについては別の記事シリーズを作成し、増え続ける AWS Lambda SnapStart シリーズに追加しないことにしました。
私たちの実験では、記事「AWS Lambda SnapStart - Java 21 Lambda コールド スタートの測定」で紹介されたアプリケーションを再利用します。サンプル アプリケーションのコードは次のとおりです。基本的に 2 つの主要な Lambda 関数があり、どちらも API Gateway リクエストに応答して、指定された ID で製品を作成し (PutProductFunction Lambda 関数を参照)、指定された ID で製品を取得します (GetProductByIdFunction Lambda 関数を参照)。 SnapStart を有効にしても無効にしても、両方の Lambda 関数を使用できます。追加の Lambda 関数 GetProductByIdWithPrimingFunction があり、SnapStart 対応 Lambda 関数の DynamoDB リクエスト プライミングの効果を個別に測定するために作成しました。プライミングの効果について詳しくは、私の記事「AWS Lambda SnapStart - プライミング、エンドツーエンドのレイテンシー、デプロイメント時間の測定」をご覧ください。
すべての Lambda 関数で SnapStart を有効にするには、SAM テンプレート内の次のコメントを解除してください:
Globals: Function: CodeUri: target/aws-pure-lambda-snap-start-21-1.0.0-SNAPSHOT.jar ... SnapStart: ApplyOn: PublishedVersions ...
すべての Lambda 関数ではなく、個々の Lambda 関数に対してのみ SnapStart を使用したい場合は、グローバル関数レベルではなく Lambda 関数レベルでこの SnapStart 定義を適用する必要があります。
すべての Lambda 関数には、開始点として次の設定があります。
SAM テンプレートでは、次のようにグローバル Lambda 関数セクションで Lambda アーキテクチャを定義できる機能を追加しました。
Globals: Function: CodeUri: target/aws-pure-lambda-snap-start-21-1.0.0-SNAPSHOT.jar ... Architectures: #- arm64 - x86_64
Lambda 関数に使用したいアーキテクチャのコメントを解除するだけです。
Java が「一度書けば、どこでも実行できる」としても、事前にインストールしておいた Graviton プロセッサ (arm64/aarch64 アーキテクチャに基づく) を備えた t4g AWS EC2 インスタンス上で arm64 測定用のアプリケーション jar ファイルをコンパイルして構築しました。 Linux aarch64 用 Amazon Corretto 21。この瓶はここで見つけることができます。
また、同じ Corretto Java 21 の最新ランタイム バージョン (測定時点では Java 21.v17 ) を使用して、同等の結果を得るため、x86_64 アーキテクチャのすべてを再度測定しました。
以下の実験の結果は、100 回を超えるコールド スタートと約 100,000 回のウォーム スタートの再現に基づいています。そのために (および前回の記事の実験で) 負荷テスト ツールを使用しましたが、Serverless-artillery や Postman など、好きなツールを使用できます。 また、アプリケーションの新しいソース コード (再) デプロイメントの直後に測定を開始したことに注意することも重要です。コールド スタートではスナップショット階層型キャッシュの影響もあることにも注意してください。通常、最初の呼び出しは遅くなり、特定の呼び出し数に達するまで後続の呼び出しは速くなります。
次に、「既存の ID による製品の取得」のすべての測定 (SnapStart が有効でプライミング測定の場合は Lambda 関数 GetProductByIdFunction および GetProductByIdWithPrimingFunction) のケースをまとめてみましょう。
コールド (c) およびウォーム (m) の開始時間 (ミリ秒):
Approach | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
x86_64, no SnapStart enabled | 3554.30 | 3615.21 | 3666.15 | 3800.47 | 4108.61 | 4111.78 | 5.42 | 6.01 | 6.88 | 14.09 | 40.98 | 1654.59 |
arm64, no SnapStart enabled | 3834.81 | 3904.42 | 3983.26 | 4047.47 | 4332.13 | 4335.74 | 5.96 | 6.66 | 7.69 | 16.01 | 43.68 | 1844.54 |
x86_64, SnapStart enabled without priming | 1794.09 | 1846.86 | 2090.54 | 2204.27 | 2239.80 | 2240.08 | 5.37 | 5.96 | 6.93 | 15.88 | 51.64 | 1578.34 |
arm64, SnapStart enabled without priming | 1845.01 | 1953.18 | 2591.70 | 2762.91 | 2793.45 | 2795.8 | 5.91 | 6.56 | 7.63 | 16.75 | 63.52 | 1779.14 |
x86_64, SnapStart enabled with DynamoDB request priming | 803.18 | 870.18 | 1103.78 | 1258.19 | 1439.95 | 1440.67 | 5.55 | 6.25 | 7.45 | 15.50 | 63.52 | 448.85 |
arm64, SnapStart enabled with DynamoDB request priming | 910.14 | 1001.79 | 1376.62 | 1623.44 | 1684.60 | 1686.19 | 6.05 | 6.72 | 7.81 | 16.66 | 74.68 | 550.59 |
この記事では、3 つのユースケースについて、DynamoDB データベースに接続する Lambda 関数のコールド スタート時間とウォーム スタート時間の測定値を比較しました。
x86_64 アーキテクチャを使用すると、arm64 アーキテクチャと比較してすべてのコールド スタート時間とウォーム スタート時間が短縮されることがわかりました。ただし、 arm64 アーキテクチャの Lambda の価格は x86_64 アーキテクチャ より 25% 安いため、非常に興味深いコストパフォーマンスのトレードオフが生じます。
3 つのユースケースすべてに対する測定値:
したがって、このサンプル アプリケーションにとって arm64 アーキテクチャの選択は非常に合理的です。 arm64 アーキテクチャの SnapStart サポートは最近導入されたばかりなので、将来的にはパフォーマンスが向上することも期待されています。ユースケースに応じて独自の測定を行ってください。
記事の次の部分では、Lambda メモリを 256 MB と 2048 MB の間の異なる値に設定して同じパフォーマンス測定を実行し、結果を比較します。
以上がJava xvs arm を使用した AWS Lambda のパフォーマンス - 一部の初期測定の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。