」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > AWS SnapStart - 使用不同的垃圾收集演算法透過 Java 測量冷啟動和熱啟動的部分

AWS SnapStart - 使用不同的垃圾收集演算法透過 Java 測量冷啟動和熱啟動的部分

發佈於2024-11-01
瀏覽:822

AWS SnapStart - Part Measuring cold and warm starts with Java using different garbage collection algorithms

介绍

在本系列的前几部分中,我们测量了在未启用 SnapStart 的情况下使用 Java 21 运行时、启用 SnapStart 的 Lambda 函数的冷启动,并使用不同的 Lambda 内存设置、Lambda 部署工件大小、Java 应用了 DynamoDB 调用启动优化编译选项、(a)同步 HTTP 客户端以及不同 Lambda 层的使用。 对于所有这些测量,我们使用默认的垃圾收集算法 G1。

在本文中,我们希望探讨 Java 垃圾收集算法对 Java 21 运行时的 Lambda 函数性能的影响。我们还将重新测量 G1 的所有内容,以便与所有垃圾收集算法使用的相同次要 Java 21 版本获得可比较的结果。

Java 垃圾收集算法

对于我们的测量,我们将使用以下 Java 收集算法及其默认设置(请参阅链接文档以获取有关每种算法的更多详细信息):

  • 垃圾优先 (G1) 垃圾收集器。这是默认使用的垃圾收集算法。您可以在 AWS SAM 模板中显式设置它,方法是将 -XX: UseG1GC 添加到 JAVA_TOOL_OPTIONS 环境变量。
  • 并行收集器。您可以在 AWS SAM 模板中显式设置它,方法是将 -XX: UseParallelGC 添加到 JAVA_TOOL_OPTIONS 环境变量。
  • 谢南多厄GC。 Oracle JDK 不提供它,但 Amazon Corretto 21 JDK 提供。您可以在 AWS SAM 模板中显式设置它,方法是将 -XX: UseShenandoahGC 添加到 JAVA_TOOL_OPTIONS 环境变量。
  • Z 垃圾收集器。有 2 种不同的 ZGC 算法:默认算法和较新的一代算法。您可以在 AWS SAM 模板中显式设置它,方法是将 -XX: UseZGC 或 -XX: UseZGC -XX: ZGenerational 添加到 JAVA_TOOL_OPTIONS 环境变量。

使用不同的垃圾收集算法测量 Java 21 的冷启动和热启动

在我们的实验中,我们将使用第 9 部分中介绍的稍作修改的应用程序。您可以在此处查找应用程序代码。基本上有 2 个 Lambda 函数,它们既响应 API 网关请求,又通过 DynamoDB 从 API 网关收到的 ID 检索产品。第一个 Lambda 函数 GetProductByIdWithPureJava21LambdaWithGCAlg 可以在有或没有 SnapStart 的情况下使用,第二个 GetProductByIdWithPureJava21LambdaAndPrimingWithGCAlg 使用 SnapStart 和 DynamoDB 请求调用启动。

下面的实验结果基于重现超过 100 次冷启动和大约 100,000 次热启动,实验运行时间约为 1 小时。为此(以及我上一篇文章中的实验),我使用了负载测试工具嘿,但是您可以使用任何您想要的工具,例如 Serverless-artillery 或 Postman。我们通过为 Lambda 函数提供 1024 MB 内存并使用 JAVA_TOOL_OPTIONS 来运行实验:“-XX: TieredCompilation -XX:TieredStopAtLevel=1”(不进行分析的 Java 客户端编译),这在冷启动时间和热启动时间之间具有非常好的权衡。

不幸的是,我无法使 Lambda 函数以 Z 垃圾收集器(默认的和一代的)启动,并遇到错误:

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) 启动时间(以毫秒为单位):

GC算法 c p50 c p75 c p90 c p99 c p99.9 c 最大值 w p50 w p75 w p90 w p99 w p99.9 w 最大值
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

启用 SnapStart 且未启动的冷 (c) 和热 (w) 启动时间(以毫秒为单位):

GC算法 c p50 c p75 c p90 c p99 c p99.9 c 最大值 w p50 w p75 w p90 w p99 w p99.9 w 最大值
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) 启动时间(以毫秒为单位):

GC算法 c p50 c p75 c p90 c p99 c p99.9 c 最大值 w p50 w p75 w p90 w p99 w p99.9 w 最大值
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 垃圾收集算法(G1、Parallel Collector 和 Shenandoah)对 Java 21 运行时的 Lambda 函数性能的影响。我们发现这些算法的性能存在很大差异。使用 G1(默认设置)的默认设置,我们会经历(有时是迄今为止)最低的冷启动和热启动时间。通过使用 SnapStart 启动 DynamoDB 请求,性能结果与预期更加接近。

请参阅每种垃圾收集算法的文档来调整混合和最大内存等设置,这可以显着提高性能并进行您自己的测量。

版本聲明 本文轉載於:https://dev.to/aws-builders/aws-snapstart-part-26-measuring-cold-and-warm-starts-with-java-21-using-different-garbage-collection-algorithms- 8h3?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在 HTML 中使用 PHP?
    如何在 HTML 中使用 PHP?
    要在HTML 中使用PHP,必須用PHP 開始標記. 在本文中,我們將透過範例學習如何在HTML 中使用PHP。 PHP(超文本預處理器) 是用於 Web 開發的流行伺服器端腳本語言。它允許您將動態內容嵌入到您的HTML。 在 HTML 中使用 PHP 的方法 要在 HTML 中有效使用 PHP...
    程式設計 發佈於2024-11-08
  • 使用 LangSmith Hub 改變您的工作流程:JavaScript 工程師的遊戲規則改變者
    使用 LangSmith Hub 改變您的工作流程:JavaScript 工程師的遊戲規則改變者
    分散的人工智能提示是否会减慢您的开发进程?了解 LangChain Hub 如何彻底改变您的工作流程,为 JavaScript 工程师提供无缝且高效的即时管理。 介绍 想象一下管理一个项目,其中关键信息分散在文件中。令人沮丧,对吧?这就是处理 AI 提示的开发人员面临的现实。 Lan...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中將數值轉換為字串表示形式?
    如何在 PHP 中將數值轉換為字串表示形式?
    將數值轉換為PHP 中的字串表示形式將數值轉換為PHP 中對應的字串版本是一項常見任務,尤其是在工作時與文字處理或面向使用者的應用程式。當處理特定範圍內的值時,這種轉換變得尤其重要,例如將數字從 1 到 99 轉換為其等效文字。 要執行此轉換,我們可以利用 PEAR 套件 Numbers_Words...
    程式設計 發佈於2024-11-08
  • 如何在 Bigquery 參數化查詢中傳遞結構數組
    如何在 Bigquery 參數化查詢中傳遞結構數組
    在Google的Bigquery中,SQL查詢可以參數化。如果您不熟悉這個概念,它基本上意味著您可以將 SQL 查詢編寫為參數化模板,如下所示: INSERT INTO mydataset.mytable(columnA, columnB) VALUES (@valueA, @valueB)...
    程式設計 發佈於2024-11-08
  • 如何使用 Python“for”循環實現 C/C++ 風格循環?
    如何使用 Python“for”循環實現 C/C++ 風格循環?
    在Python 中實現C/C 風格循環:“for”循環在Python 中,循環提供了一種用於迭代序列的通用機制。雖然 Python 的「for」循環語法與其 C/C 對應部分不同,但實現類似的功能仍然是可行的。 考慮C/C 中的以下循環:for(int k = 1; k <= c; k = ...
    程式設計 發佈於2024-11-08
  • Laravel 入門:查詢產生器初學者指南
    Laravel 入門:查詢產生器初學者指南
    Laravel 的 查询生成器 提供了一个强大、流畅的界面,用于在 PHP 中构建 SQL 查询。它允许您以富有表现力的、类似 SQL 的语法与数据库交互,同时抽象出大部分复杂性。 我们将演练 Laravel 应用程序中的典型用例,使用查询生成器执行各种任务,例如选择、插入、更新和删除数据。 ...
    程式設計 發佈於2024-11-08
  • 如何截斷長分頁清單以增強使用者體驗?
    如何截斷長分頁清單以增強使用者體驗?
    截斷長頁面清單以實現高效分頁分頁是任何顯示大量資料的網站或應用程式的重要組成部分,因為它允許用戶以可管理的區塊的方式瀏覽它。但是,如果以簡單的方式實現,分頁可能會導致頁面清單過長,特別是當應用於具有大量頁面的資料集時。 為了緩解此問題,有必要截斷這些頁面清單為使用者提供更簡潔的導航選項。在本文中,我...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中展平數組
    如何在 JavaScript 中展平數組
    使用遞歸和 while 循環是更簡單的方法之一 export default function flatten(value) { const arr = [] const flat = (a) => { let counter = 0 console.log(a) ...
    程式設計 發佈於2024-11-08
  • 為什麼我無法在 Powershell 中執行複雜的 ImageMagick 命令,但它們可以在 CMD 中運行?
    為什麼我無法在 Powershell 中執行複雜的 ImageMagick 命令,但它們可以在 CMD 中運行?
    ImageMagick 指令無法在Powershell 中運行,但在cmd 視窗中執行沒有問題在嘗試使用ImageMagick 指令時,使用者在Powershell 視窗中執行它們時遇到了挑戰。這些命令在 cmd 視窗中無縫運行。嘗試在括號前添加反斜線來解決該問題也沒有成功。調查顯示,magick指...
    程式設計 發佈於2024-11-08
  • 什麼時候可以從 C++ 標準函式庫類別繼承?
    什麼時候可以從 C++ 標準函式庫類別繼承?
    透過繼承擴展 C 標準庫雖然人們通常認為從 C標準庫類別繼承是不可取的,但也有一些值得注意的例外.用於繼承的可識別類別確定標準庫類別是否用於繼承可能具有挑戰性。但是,以下準則可以提供一些見解:如果類別具有虛方法,則它可能是繼承的候選者。 過多的「friend」聲明表明存在封裝問題,從而導致繼承不太合...
    程式設計 發佈於2024-11-08
  • 利用 AI 快速學習 Node.js - 第 2 天
    利用 AI 快速學習 Node.js - 第 2 天
    今天,我借助AI繼續我的Node.js學習之旅,第2天的主題是Node.js中的模組系統。由於我已經熟悉 JavaScript,因此了解這種語言如何將程式碼組織成模組,使其更易於建置和重複使用是很有趣的。 理論部分:Node.js 中的模組基礎知識 首先,我完成了理論部分,其中解釋...
    程式設計 發佈於2024-11-08
  • 優化 Next.js 應用效能的經過驗證的技巧 ⚡️
    優化 Next.js 應用效能的經過驗證的技巧 ⚡️
    优化 Web 应用程序的性能对于提供快速、流畅的用户体验至关重要。 借助 Next.js 这个强大的 React 框架,您可以利用许多内置功能来提高应用程序的速度和效率。 以下是让 Next.js 应用获得最佳性能的十个关键策略: 1. 仅加载您需要的 JavaScript 和 ...
    程式設計 發佈於2024-11-08
  • 為什麼 Python 和 Golang Zlib 會產生不同的壓縮輸出?
    為什麼 Python 和 Golang Zlib 會產生不同的壓縮輸出?
    了解Golang 和Python Zlib 輸出的差異使用Zlib 壓縮來壓縮字串時,Python 的zlib 函式庫會產生與Golang 的zlib 實作。具體來說,第五個位元組不同,Python 的值為 0,而 Golang 的值為 4。 差異原因輸出的差異源自於來自 Python 和 Go 函...
    程式設計 發佈於2024-11-08
  • 如何使用 ESLint 規則讓 JavaScript 錯誤處理更具可讀性
    如何使用 ESLint 規則讓 JavaScript 錯誤處理更具可讀性
    简介:掌握 JavaScript 中的错误处理 有效的错误处理对于任何健壮的 JavaScript 应用程序都至关重要。它有助于快速识别问题、简化调试并增强软件可靠性。本指南深入探讨通过 ESLint 改进 JavaScript 错误处理,ESLint 是一种增强代码质量并标准化错...
    程式設計 發佈於2024-11-08
  • 如何在PHP中按副檔名高效過濾檔案?
    如何在PHP中按副檔名高效過濾檔案?
    在PHP 中按擴展名高效過濾文件您希望根據文件擴展名過濾目錄中的文件,特別是. ini 文件。雖然 scandir() 提供目錄中所有文件的列表,但它並不是過濾檢索最有效的方法。 利用 PHP 的 glob() 函數高效取得具有特定副檔名的文件,利用 PHP 的 glob() 函式。此函數採用模式匹...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3