「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java xvs arm を使用した AWS Lambda のパフォーマンス - 一部の初期測定

Java xvs arm を使用した AWS Lambda のパフォーマンス - 一部の初期測定

2024 年 8 月 2 日に公開
ブラウズ:768

AWS Lambda performance with Java  xvs arm- Part nitial measurements

導入

これまで、arm64 アーキテクチャの一部のユースケース (DynamoDB リクエストの作成など) で Java 21 ランタイムを使用した Lambda 関数のパフォーマンス (ウォーム スタート時間とコールド スタート時間) を測定していませんでした。これは、SnapStart がサポートされていなかったためです。 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 関数には、開始点として次の設定があります:

  • 1024 MB メモリ設定
  • DynamoDB データベースとの通信に使用されるデフォルトの HTTP Apache クライアント
  • Java コンパイル オプション「-XX: TieredCompilation -XX:TieredStopAtLevel=1」は、コールド スタート時間とウォーム スタート時間の間に非常に優れたトレードオフを提供することが証明されました

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) の開始時間 (ミリ秒):

アプローチ c p50 c p75 c p90 c p99 c p99.9 最大値 w p50 w p75 w p90 w p99 w p99.9 最大値
x86_64、SnapStart が有効になっていません 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、SnapStart が有効になっていません 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 が有効になりました 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、プライミングなしでスナップスタートが有効になりました 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、DynamoDB リクエスト プライミングで SnapStart が有効になっています 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、DynamoDB リクエストプライミングで SnapStart が有効になりました 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 関数のコールド スタート時間とウォーム スタート時間の測定値を比較しました。

  • Lambda 関数で SnapStart が有効になっていない
  • Lambda 関数で SnapStart が有効になっていますが、プライミング最適化は行われていません
  • Lambda 関数で SnapStart が有効になっており、DynamoDB リクエストがプライミングされています

x86_64 アーキテクチャを使用すると、arm64 アーキテクチャと比較してすべてのコールド スタート時間とウォーム スタート時間が短縮されることがわかりました。しかし、arm64 アーキテクチャの Lambda の価格は x86_64 アーキテクチャ より 25% 安いため、非常に興味深いコストパフォーマンスのトレードオフが生じます。

3 つのユースケースすべてに対する測定値:

  • arm64 アーキテクチャでの Lambda のコールド スタート時間は、x86_64 アーキテクチャと比較して、多くのパーセンタイルで 10 ~ 20% (非常にまれな場合にのみ 25 ~ 27%) 遅くなりました。
  • arm64 アーキテクチャでの Lambda ウォーム スタート時間は、多くのパーセンタイルで、x86_64 アーキテクチャと比較して 5 ~ 10% 遅いだけでした。

したがって、このサンプル アプリケーションにとって arm64 アーキテクチャの選択は非常に合理的です。 arm64 アーキテクチャの SnapStart サポートは最近導入されたばかりなので、将来的にはパフォーマンスが向上することも期待されています。ユースケースに応じて独自の測定を行ってください。

記事の次の部分では、同じパフォーマンス測定を行いますが、Lambda メモリを 256 MB から 2048 MB の間の異なる値に設定し、結果を比較します。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/aws-builders/aws-lambda-performance-with-java-21-x86-vs-arm64-part-1-initial-measurements-506?1侵害がある場合は、削除するには[email protected]までご連絡ください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3