」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > AWS SnapStart - 使用 Lambda 層透過 Java 測量冷啟動和熱啟動部分 (1)

AWS SnapStart - 使用 Lambda 層透過 Java 測量冷啟動和熱啟動部分 (1)

發佈於2024-08-24
瀏覽:246

AWS SnapStart - Part Measuring cold and warm starts with Java using Lambda layer (1)

介绍

在博客文章如何为 Java 21 Lambda 函数创建、发布和使用层中,我们发布了第一个使用 Java 21 的 Lambda 层。在本文中,我们将使用此 Lambda 层创建应用程序,然后测量冷启动和热启动未启用 SnapStart 的时间、启用 SnapStart 并应用 DynamoDB 调用启动优化的时间。我们还将结果与我们的测量结果进行比较,而不使用 Lambda 层并在 POM 文件中提供所有依赖项,正如我们在使用不同 Lambda 内存设置测量 Java 21 的冷启动和热启动一文中所做的那样。

使用 Lambda 层通过 Java 21 测量冷启动和热启动

在我们的实验中,我们将使用示例应用程序。 AWS SAM 模板中基本上定义了 2 个 Lambda 函数,它们都响应 API 网关请求并通过从 DynamoDB 从 API 网关收到的 ID 检索产品。第一个 Lambda 函数 GetProductByIdWithPureJava21LambdaWithCommonLayer 可以在有或没有 SnapStart 的情况下使用,第二个 GetProductByIdWithPureJava21LambdaAndPrimingWithCommonLayer 使用 SnapStart 和 DynamoDB 请求调用启动。

通过 Lambda 层提供的依赖项具有我们应用程序的 pom.xml 文件中“提供”的范围。

为了附加在如何为 AWS SAM 模板中的 Lambda 函数创建 Java 21 Lambda 函数的发布和使用层一文中创建的 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(包括版本)替换为您自己的层 ARN,该 ARN 是发布层命令 (aws lambdapublish-layer-version) 的输出。

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

在下表中,我还将在不使用 Lambda 层的情况下提供测量结果,该 Lambda 层摘自《使用不同 Lambda 内存设置通过 Java 21 测量冷启动和热启动》一文,以直接对两者进行比较。
缩写 c 表示冷启动,w 表示热启动。

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

实验 c p50 c p75 c p90 c p99 c p99.9 c 最大 w p50 w p75 w p90 w p99 w p99.9 w 最大值
使用通用 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

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

实验 c p50 c p75 c p90 c p99 c p99.9 c 最大 w p50 w p75 w p90 w p99 w p99.9 w 最大值
使用通用 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) 启动时间(毫秒):

实验 c p50 c p75 c p90 c p99 c p99.9 c 最大 w p50 w p75 w p90 w p99 w p99.9 w 最大值
使用通用 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 层,该层不仅包含常见依赖项(如本文中所示),还包含运行此应用程序所需的所有依赖项,然后比较两个实验的结果。

版本聲明 本文轉載於:https://dev.to/aws-builders/aws-snapstart-part-24-measuring-cold-and-warm-starts-with-java-21-using-lambda-layer-1-4o8l? 1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在 Python 中使用 OpenSearch 掌握 CRUD 操作:實用指南
    在 Python 中使用 OpenSearch 掌握 CRUD 操作:實用指南
    OpenSearch, an open-source alternative to Elasticsearch, is a powerful search and analytics engine built to handle large datasets with ease. In this b...
    程式設計 發佈於2024-11-06
  • 冰沙框架的重要概念||如何精通冰沙
    冰沙框架的重要概念||如何精通冰沙
    要精通 Frappe,有几个关键概念和领域需要关注。以下是最重要的细分: 1. 文档类型 定义:DocTypes是Frappe中的核心数据模型。每个实体或记录都存储在 DocType 中,并且它们可以具有字段、权限和工作流程。 为什么它很重要:了解如何创建和自定义 DocType 至...
    程式設計 發佈於2024-11-06
  • 如何解決 JLabel 拖放的滑鼠事件衝突?
    如何解決 JLabel 拖放的滑鼠事件衝突?
    用於拖放的JLabel 滑鼠事件:解決滑鼠事件衝突為了在JLabel 上啟用拖放功能,滑鼠事件必須被覆蓋。然而,當嘗試使用 mousePressed 事件實作拖放時,會出現一個常見問題,因為 mouseReleased 事件對該 JLabel 無效。 提供的程式碼在 mousePressed 事件中...
    程式設計 發佈於2024-11-06
  • MySQL 中的資料庫分片:綜合指南
    MySQL 中的資料庫分片:綜合指南
    随着数据库变得越来越大、越来越复杂,有效地控制性能和扩展就出现了。数据库分片是用于克服这些障碍的一种方法。称为“分片”的数据库分区将大型数据库划分为更小、更易于管理的段(称为“分片”)。通过将每个分片分布在多个服务器上(每个服务器保存总数据的一小部分),可以提高可扩展性和吞吐量。 在本文中,我们将探...
    程式設計 發佈於2024-11-06
  • 如何將 Python 日期時間物件轉換為秒?
    如何將 Python 日期時間物件轉換為秒?
    在Python 中將日期時間物件轉換為秒在Python 中使用日期時間物件時,通常需要將它們轉換為秒以適應各種情況分析目的。但是,toordinal() 方法可能無法提供所需的輸出,因為它僅區分具有不同日期的日期。 要準確地將日期時間物件轉換為秒,特別是對於 1970 年 1 月 1 日的特定日期,...
    程式設計 發佈於2024-11-06
  • 如何使用 Laravel Eloquent 的 firstOrNew() 方法有效最佳化 CRUD 操作?
    如何使用 Laravel Eloquent 的 firstOrNew() 方法有效最佳化 CRUD 操作?
    使用 Laravel Eloquent 優化 CRUD 操作在 Laravel 中使用資料庫時,插入或更新記錄是很常見的。為了實現這一點,開發人員經常求助於條件語句,在決定執行插入或更新之前檢查記錄是否存在。 firstOrNew() 方法幸運的是, Eloquent 透過firstOrNew() ...
    程式設計 發佈於2024-11-06
  • 為什麼在 PHP 中重寫方法參數違反了嚴格的標準?
    為什麼在 PHP 中重寫方法參數違反了嚴格的標準?
    在PHP 中重寫方法參數:違反嚴格標準在物件導向程式設計中,里氏替換原則(LSP) 規定:子類型的物件可以替換其父對象,而不改變程式的行為。然而,在 PHP 中,用不同的參數簽名覆蓋方法被認為是違反嚴格標準的。 為什麼這是違規? PHP 是弱型別語言,這表示編譯器無法在編譯時確定變數的確切型別。這表...
    程式設計 發佈於2024-11-06
  • 哪個 PHP 函式庫提供卓越的 SQL 注入防護:PDO 還是 mysql_real_escape_string?
    哪個 PHP 函式庫提供卓越的 SQL 注入防護:PDO 還是 mysql_real_escape_string?
    PDO vs. mysql_real_escape_string:綜合指南查詢轉義對於防止 SQL 注入至關重要。雖然 mysql_real_escape_string 提供了轉義查詢的基本方法,但 PDO 成為了一種具有眾多優點的卓越解決方案。 什麼是 PDO? PHP 資料物件 (PDO) 是一...
    程式設計 發佈於2024-11-06
  • React 入門:初學者的路線圖
    React 入門:初學者的路線圖
    大家好! ? 我剛開始學習 React.js 的旅程。這是一次令人興奮(有時甚至具有挑戰性!)的冒險,我想分享一下幫助我開始的步驟,以防您也開始研究 React。這是我的處理方法: 1.掌握 JavaScript 基礎 在開始使用 React 之前,我確保溫習一下我的 JavaScript 技能,...
    程式設計 發佈於2024-11-06
  • 如何引用 JavaScript 物件中的內部值?
    如何引用 JavaScript 物件中的內部值?
    如何在JavaScript 物件中引用內部值在JavaScript 中,存取引用同一物件中其他值的物件中的值有時可能具有挑戰性。考慮以下程式碼片段:var obj = { key1: "it ", key2: key1 " works!" }; a...
    程式設計 發佈於2024-11-06
  • Python 列表方法快速指南及範例
    Python 列表方法快速指南及範例
    介紹 Python 清單用途廣泛,並附帶各種內建方法,有助於有效地操作和處理資料。以下是所有主要清單方法的快速參考以及簡短的範例。 1. 追加(項目) 將項目新增至清單末端。 lst = [1, 2, 3] lst.append(4) # [1, 2, 3, ...
    程式設計 發佈於2024-11-06
  • C++ 中何時需要使用者定義的複製建構函式?
    C++ 中何時需要使用者定義的複製建構函式?
    何時需要使用者定義的複製建構子? 複製建構子是 C 物件導向程式設計的組成部分,提供了一種基於現有實例初始化物件的方法。雖然編譯器通常會為類別產生預設的複製建構函數,但在某些情況下需要進行自訂。 需要使用者定義複製建構子的情況當預設複製建構子不夠時,程式設計師會選擇使用者定義的複製建構子來實作自訂複...
    程式設計 發佈於2024-11-06
  • 試...捕捉 V/s 安全分配 (?=):現代發展的福音還是詛咒?
    試...捕捉 V/s 安全分配 (?=):現代發展的福音還是詛咒?
    最近,我發現了 JavaScript 中引入的新安全賦值運算子 (?.=),我對它的簡單性著迷。 ? 安全賦值運算子 (SAO) 是傳統 try...catch 區塊的簡寫替代方案。它允許您內聯捕獲錯誤,而無需為每個操作編寫明確的錯誤處理程式碼。這是一個例子: const [error, resp...
    程式設計 發佈於2024-11-06
  • 如何在Python中優化固定寬度檔案解析?
    如何在Python中優化固定寬度檔案解析?
    優化固定寬度文件解析為了有效地解析固定寬度文件,可以考慮利用Python的struct模組。此方法利用 C 來提高速度,如下例所示:import struct fieldwidths = (2, -10, 24) fmtstring = ' '.join('{}{}'.format(abs(fw),...
    程式設計 發佈於2024-11-06

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

Copyright© 2022 湘ICP备2022001581号-3