シリーズの前の部分では、SnapStart を有効にしない場合と SnapStart を有効にした場合の Java 21 ランタイムで Lambda 関数のコールド スタートを測定し、さまざまな Lambda メモリ設定、Lambda デプロイメント アーティファクト サイズ、Java を使用した DynamoDB 呼び出しプライミングの最適化も適用しました。コンパイル オプション、(a) 同期 HTTP クライアント、およびさまざまな Lambda レイヤーの使用。 これらすべての測定では、デフォルトのガベージ コレクション アルゴリズム G1.
を使用しました。この記事では、Java 21 ランタイムでの Lambda 関数のパフォーマンスに対する Java ガベージ コレクション アルゴリズムの影響について調べていきたいと思います。また、すべてのガベージ コレクション アルゴリズムで使用されている同じマイナー Java 21 バージョンと同等の結果が得られるように、G1 のすべてを再測定します。
測定では、次の Java 収集アルゴリズムをデフォルト設定で使用します (各アルゴリズムの詳細については、リンク先のドキュメントを参照してください):
私たちの実験では、パート 9 で紹介したわずかに変更されたアプリケーションを使用します。アプリケーション コードはここで見つけることができます。基本的に 2 つの Lambda 関数があり、どちらも API ゲートウェイ リクエストに応答し、API ゲートウェイから受け取った ID によって DynamoDB から製品を取得します。 1 つの Lambda 関数 GetProductByIdWithPureJava21LambdaWithGCAlg は SnapStart の有無にかかわらず使用でき、2 番目の GetProductByIdWithPureJava21LambdaAndPrimingWithGCAlg は SnapStart と DynamoDB リクエスト呼び出しプライミングを使用します。
以下の実験の結果は、約 1 時間実行された実験で 100 回を超えるコールド スタートと約 100,000 回のウォーム スタートを再現したことに基づいています。そのために (および前回の記事の実験で) 負荷テスト ツールを使用しましたが、Serverless-artillery や Postman など、好きなツールを使用できます。 Lambda 関数に 1024 MB のメモリを与え、JAVA_TOOL_OPTIONS: "-XX: TieredCompilation -XX:TieredStopAtLevel=1" (プロファイリングなしの Java クライアント コンパイル) を使用して実験を実行します。これは、コールド スタート時間とウォーム スタート時間の間に非常に良いトレードオフがあります。
残念ながら、Z ガベージ コレクター (デフォルトと世代の両方を使用) で Lambda 関数を開始できず、エラーが発生しました:
Failed to commit memory (Operation not permitted) [error][gc] Forced to lower max Java heap size from 872M(100%) to 0M(0%) [error][gc] Failed to allocate initial Java heap (512M) Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
より大きなメモリ設定を 1024、2048 MB、さらにそれ以上の MB に設定してみましたが、やはり同じエラーが発生しました。
他の 3 つのガベージ コレクション アルゴリズムを使用した測定結果を見てみましょう。
略語 c はコールド スタート、w はウォーム スタートを表します。
SnapStart が有効になっていない場合のコールド (c) およびウォーム (w) のスタート時間 (ms:
)GC アルゴリズム | c p50 | c p75 | c p90 | c p99 | c p99.9 | 最大値 | w p50 | w p75 | w p90 | w p99 | w p99.9 | 最大値 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
G1 | 3655.17 | 3725.25 | 3811.88 | 4019.25 | 4027.30 | 4027.83 | 5.46 | 6.10 | 7.10 | 16.79 | 48.06 | 1929.79 |
パラレルコレクター | 3714.10 | 3789.09 | 3857.87 | 3959.44 | 4075.89 | 4078.25 | 5.55 | 6.20 | 7.10 | 15.38 | 130.13 | 2017.92 |
シェナンドア | 3963.40 | 4019.25 | 4096.30 | 4221.00 | 4388.78 | 4390.76 | 5.82 | 6.45 | 7.39 | 17.06 | 71.02 | 2159.21 |
プライミングなしでスナップスタートを有効にした場合のコールド (c) およびウォーム (w) スタート時間 (ミリ秒):
GC アルゴリズム | c p50 | c p75 | c p90 | c p99 | c p99.9 | 最大値 | w p50 | w p75 | w p90 | w p99 | w p99.9 | 最大値 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
G1 | 1867.27 | 1935.68 | 2152.02 | 2416.57 | 2426.25 | 2427.35 | 5.47 | 6.11 | 7.05 | 17.41 | 51.24 | 1522.04 |
パラレルコレクター | 1990.62 | 2047.12 | 2202.07 | 2402.12 | 2418.99 | 2419.32 | 5.68 | 6.35 | 7.45 | 18.04 | 147.83 | 1577.21 |
シェナンドア | 2195.47 | 2301.07 | 2563.37 | 3004.89 | 3029.01 | 3030.36 | 5.73 | 6.41 | 7.51 | 17.97 | 75.00 | 1843.34 |
SnapStart を有効にし、DynamoDB 呼び出しプライミングを使用した場合のコールド (c) およびウォーム (w) の開始時間 (ms:
)GC アルゴリズム | c p50 | c p75 | c p90 | c p99 | c p99.9 | 最大値 | w p50 | w p75 | w p90 | w p99 | w p99.9 | 最大値 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
G1 | 833.50 | 875.34 | 1089.53 | 1205.26 | 1269.56 | 1269.8 | 5.46 | 6.10 | 7.16 | 16.39 | 46.19 | 499.13 |
パラレルコレクター | 900.18 | 975.12 | 1058.41 | 1141.94 | 1253.17 | 1253.99 | 5.82 | 6.61 | 7.75 | 16.87 | 49.64 | 487.73 |
シェナンドア | 1065.84 | 1131.71 | 1331.96 | 1473.44 | 1553.59 | 1554.95 | 5.77 | 6.40 | 7.39 | 17.20 | 65.06 | 500.48 |
この記事では、Java 21 ランタイムでの Lambda 関数のパフォーマンスに対する Java ガベージ コレクション アルゴリズム (G1、Parallel Collector、および Shenandoah) の影響を調査しました。これらのアルゴリズムのパフォーマンスにはかなりの違いがあることがわかりました。 G1 (デフォルト) でデフォルト設定を使用すると、(場合によっては断然) コールド スタート時間とウォーム スタート時間が最も短くなります。 DynamoDB リクエストのプライミングで SnapStart を使用すると、パフォーマンス結果は予想通り相互にかなり近くなります。
各ガベージ コレクション アルゴリズムのドキュメントを参照して、ミックスや最大メモリなどの設定を調整してパフォーマンスを大幅に向上させたり、独自の測定を行ったりしてください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3