CloudWatch 解決方案:Amazon EC2 上的 JVM 工作負載 - Amazon CloudWatch

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CloudWatch 解決方案:Amazon EC2 上的 JVM 工作負載

此解決方案可協助您針對在 EC2 執行個體上執行的 JVM 應用程式,使用 CloudWatch 代理程式來設定out-of-the-box指標集合。此外,它可協助您設定預先設定的 CloudWatch 儀表板。如需所有 CloudWatch 可觀測性解決方案的一般資訊,請參閱 CloudWatch 可觀測性解決方案

要求

此解決方案與下列條件相關:

優勢

解決方案提供 JVM 監控,為下列使用案例提供寶貴的洞見:

  • 監控 JVM 堆積和非堆積記憶體用量。

  • 分析並行問題的執行緒和類別載入。

  • 追蹤垃圾收集以識別記憶體流失。

  • 在相同帳戶下透過 解決方案設定的不同 JVM 應用程式之間切換。

以下是解決方案的主要優點:

  • 使用 CloudWatch 代理程式組態自動化 JVM 的指標集合,消除手動檢測。

  • 為 JVM 指標提供預先設定的合併 CloudWatch 儀表板。儀表板會自動處理使用 解決方案設定之新 JVM EC2 執行個體的指標,即使您第一次建立儀表板時,這些指標不存在。它還允許您將指標分組到邏輯應用程式中,以便於集中和管理。

下圖是此解決方案的儀表板範例。

JVM 儀表板範例

成本

此解決方案會在您的帳戶中建立和使用 資源。您需要支付標準用量的費用,包括下列項目:

  • CloudWatch 代理程式收集的所有指標都會以自訂指標計費。此解決方案使用的指標數目取決於 EC2 主機數目。

    • 針對解決方案設定的每個 JVM 主機總共會發佈 18 個指標加上一個指標 (disk_used_percent),其指標計數取決於主機的路徑數目。

  • 一個自訂儀表板。

  • CloudWatch 代理程式請求發佈指標的 API 操作。透過此解決方案的預設組態,CloudWatch 代理程式每分鐘為每個 EC2 主機呼叫一次 PutMetricData。這表示在每個 EC2 主機的 30*24*60=43,200 30 天內會呼叫 PutMetricData API。

如需 CloudWatch 定價的詳細資訊,請參閱 Amazon CloudWatch 定價

定價計算器可協助您預估使用此解決方案的每月約略成本。

使用 定價計算器來估算每月解決方案成本
  1. 開啟 Amazon CloudWatch 定價計算器

  2. 針對選擇區域,選取您要部署解決方案的區域。

  3. 指標區段中,針對指標數量輸入 (18 + average number of disk paths per EC2 host) * number of EC2 instances configured for this solution

  4. APIs區段中,針對 API 請求數,輸入 43200 * number of EC2 instances configured for this solution

    根據預設,CloudWatch 代理程式每分鐘為每個 EC2 主機執行一次 PutMetricData 操作。

  5. 儀表板和警示區段中,針對儀表板數量,輸入 1

  6. 您可以在定價計算器底部查看每月預估成本。

此解決方案的 CloudWatch 代理程式組態

CloudWatch 代理程式是可在您的伺服器和容器化環境中持續自主執行的軟體。它會從您的基礎設施和應用程式收集指標、日誌和追蹤,並將其傳送至 CloudWatch 和 X-Ray。

如需 CloudWatch 代理程式的詳細資訊,請參閱 使用 CloudWatch 代理程式收集指標、日誌和追蹤

此解決方案中的代理程式組態會收集解決方案的基礎指標。CloudWatch 代理程式可設定為收集比儀表板預設顯示的更多 JVM 指標。如需您可以收集的所有 JVM 指標清單,請參閱 收集 JVM 指標。如需 CloudWatch 代理程式組態的一般資訊,請參閱 CloudWatch 代理程式收集的指標

公開 JVM 應用程式的 JMX 連接埠

CloudWatch 代理程式依賴 JMX 來收集與 JVM 程序相關的指標。若要實現此目的,您必須從 JVM 應用程式公開 JMX 連接埠。公開 JMX 連接埠的說明取決於您用於 JVM 應用程式的工作負載類型。請參閱您應用程式的文件,以尋找這些指示。

一般而言,若要啟用 JMX 連接埠以進行監控和管理,您可以為 JVM 應用程式設定下列系統屬性。請務必指定未使用的連接埠號碼。下列範例會設定未驗證的 JMX。如果您的安全政策/要求要求您使用密碼身分驗證或 SSL 啟用 JMX 以進行遠端存取,請參閱 JMX 文件以設定所需的屬性。

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=port-number -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

檢閱應用程式的啟動指令碼和組態檔案,尋找新增這些引數的最佳位置。當您從命令列執行.jar檔案時,此命令可能如下所示,其中 pet-search.jar 是應用程式 jar 的名稱。

$ java -jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false pet-search.jar

此解決方案的代理程式組態

代理程式收集的指標在代理程式組態中定義。解決方案提供代理程式組態,以收集適合解決方案儀表板維度的建議指標。

部署解決方案的步驟稍後會在 中說明部署解決方案的代理程式。以下資訊旨在協助您了解如何自訂您環境的代理程式組態。

您必須為您的環境自訂下列代理程式組態的某些部分:

  • JMX 連接埠號碼是您在本文件上一節中設定的連接埠號碼。其位於組態中的 endpoint行。

  • ProcessGroupName– 為ProcessGroupName維度提供有意義的名稱。這些名稱應代表執行相同應用程式或程序之 EC2 執行個體的叢集、應用程式或服務分組。這可協助您從屬於相同 JVM 程序群組的執行個體將指標分組,在解決方案儀表板中提供叢集、應用程式和服務效能的統一檢視。

例如,如果您有兩個 Java 應用程式在同一個帳戶中執行,一個用於order-processing應用程式,另一個用於inventory-management應用程式,您應該在每個執行個體的代理程式組態中相應地設定ProcessGroupName維度。

  • 針對order-processing應用程式執行個體,設定 ProcessGroupName=order-processing

  • 針對inventory-management應用程式執行個體,設定 ProcessGroupName=inventory-management

當您遵循這些準則時,解決方案儀表板會根據ProcessGroupName維度自動分組指標。儀表板將包含下拉式清單選項,以選取和檢視特定程序群組的指標,讓您分別監控個別程序群組的效能。

JVM 主機的代理程式組態

在部署 Java 應用程式的 EC2 執行個體上使用下列 CloudWatch 代理程式組態。組態將儲存為 SSM 參數存放區中的參數,如稍後 所述步驟 2:將建議的 CloudWatch 代理程式組態檔案存放在 Systems Manager 參數存放區

ProcessGroupName 取代為您的程序群組名稱。將 port-number 取代為您 Java 應用程式的 JMX 連接埠。如果使用密碼身分驗證或 SSL 啟用 JMX 以進行遠端存取,請參閱 收集 Java 管理延伸模組 (JMX) 指標 ,以取得有關視需要在代理程式組態中設定 TLS 或授權的資訊。

此組態中顯示的 EC2 指標 (在 JMX 區塊外部顯示的組態) 僅適用於 Linux 和 macOS 執行個體。如果您使用的是 Windows 執行個體,您可以選擇在組態中省略這些指標。如需在 Windows 執行個體上收集的指標資訊,請參閱 由 CloudWatch 代理程式在 Windows Server 執行個體上收集的指標

{ "metrics": { "namespace": "CWAgent", "append_dimensions": { "InstanceId": "${aws:InstanceId}" }, "metrics_collected": { "jmx": [ { "endpoint": "localhost:port-number", "jvm": { "measurement": [ "jvm.classes.loaded", "jvm.gc.collections.count", "jvm.gc.collections.elapsed", "jvm.memory.heap.committed", "jvm.memory.heap.max", "jvm.memory.heap.used", "jvm.memory.nonheap.committed", "jvm.memory.nonheap.max", "jvm.memory.nonheap.used", "jvm.threads.count" ] }, "append_dimensions": { "ProcessGroupName": "ProcessGroupName" } } ], "disk": { "measurement": [ "used_percent" ] }, "mem": { "measurement": [ "used_percent" ] }, "swap": { "measurement": [ "used_percent" ] }, "netstat": { "measurement": [ "tcp_established", "tcp_time_wait" ] } } } }

部署解決方案的代理程式

根據使用案例,安裝 CloudWatch 代理程式有數種方法。我們建議您使用此解決方案的 Systems Manager。它提供主控台體驗,並可讓您更輕鬆地管理單一 AWS 帳戶中的受管伺服器機群。本節中的指示使用 Systems Manager,當您沒有執行現有組態的 CloudWatch 代理程式時,適用於 。您可以依照中的步驟,檢查 CloudWatch 代理程式是否正在執行確認 CloudWatch 代理程式正在執行中

如果您已在部署工作負載和管理代理程式組態的 EC2 主機上執行 CloudWatch 代理程式,您可以略過本節中的指示,並遵循現有的部署機制來更新組態。請務必將 JVM 的代理程式組態與您現有的代理程式組態合併,然後部署合併的組態。如果您使用 Systems Manager 來存放和管理 CloudWatch 代理程式的組態,您可以將組態合併到現有的參數值。如需詳細資訊,請參閱管理 CloudWatch 代理程式組態檔案

注意

使用 Systems Manager 部署下列 CloudWatch 代理程式組態,將取代或覆寫 EC2 執行個體上任何現有的 CloudWatch 代理程式組態。您可以修改此組態,以符合您的唯一環境或使用案例。此解決方案中定義的指標是建議儀表板所需的最低值。

部署程序包含下列步驟:

  • 步驟 1:確保目標 EC2 執行個體具有所需的 IAM 許可。

  • 步驟 2:將建議的代理程式組態檔案儲存在 Systems Manager 參數存放區中。

  • 步驟 3:使用 AWS CloudFormation 堆疊在一或多個 EC2 執行個體上安裝 CloudWatch 代理程式。

  • 步驟 4:確認代理程式設定已正確設定。

步驟 1:確保目標 EC2 執行個體具有所需的 IAM 許可

您必須授予 Systems Manager 安裝和設定 CloudWatch 代理程式的許可。您還必須授予 CloudWatch 代理程式許可,才能將遙測從 EC2 執行個體發佈至 CloudWatch。確定連接至執行個體的 IAM 角色已連接 CloudWatchAgentServerPolicyAmazonSSMManagedInstanceCore IAM 政策。

步驟 2:將建議的 CloudWatch 代理程式組態檔案存放在 Systems Manager 參數存放區

參數存放區可安全地存放和管理組態參數,簡化在 EC2 執行個體上安裝 CloudWatch 代理程式,無需使用硬式編碼值。這可確保更安全且靈活的部署程序,實現集中式管理,並簡化跨多個執行個體的組態更新。

使用下列步驟,將建議的 CloudWatch 代理程式組態檔案儲存為參數存放區中的參數。

建立 CloudWatch 代理程式組態檔案做為參數
  1. 開啟 AWS Systems Manager 主控台,網址為 https://console.aws.amazon.com/systems-manager/://。

  2. 從導覽窗格中,選擇應用程式管理參數存放區

  3. 請依照下列步驟為組態建立新的參數。

    1. 選擇 Create parameter (建立參數)

    2. 名稱方塊中,輸入您將在後續步驟中用來參考 CloudWatch 代理程式組態檔案的名稱。例如 AmazonCloudWatch-JVM-Configuration

    3. (選用) 在描述方塊中,輸入 參數的描述。

    4. 針對參數層,選擇標準

    5. 類型選擇字串

    6. 針對資料類型,選擇文字

    7. 方塊中,貼上 中列出的對應 JSON 區塊JVM 主機的代理程式組態。請務必依照說明自訂分組維度值和連接埠號碼。

    8. 選擇 Create parameter (建立參數)

步驟 3:安裝 CloudWatch 代理程式並使用 AWS CloudFormation 範本套用組態

您可以使用 AWS CloudFormation 安裝代理程式,並將其設定為使用您在先前步驟中建立的 CloudWatch 代理程式組態。

安裝和設定此解決方案的 CloudWatch 代理程式
  1. 使用此連結開啟 AWS CloudFormation 快速建立堆疊精靈: https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json

  2. 確認主控台上選取的區域是執行 JVM 工作負載的區域。

  3. 針對堆疊名稱,輸入名稱來識別此堆疊,例如 CWAgentInstallationStack

  4. 參數區段中,指定下列項目:

    1. 針對 CloudWatchAgentConfigSSM,輸入您先前建立之代理程式組態的 Systems Manager 參數名稱,例如 AmazonCloudWatch-JVM-Configuration

    2. 若要選取目標執行個體,您有兩個選項。

      1. 針對 InstanceIds,指定執行個體 IDs清單的逗號分隔清單,列出您要使用此組態安裝 CloudWatch 代理程式IDs。您可以列出單一執行個體或數個執行個體。

      2. 如果您要大規模部署,您可以指定 TagKey 和對應的 TagValue,以使用此標籤和值鎖定所有 EC2 執行個體。如果您指定 TagKey,則必須指定對應的 TagValue。(對於 Auto Scaling 群組,aws:autoscaling:groupName請為 TagKey 指定 ,並為要部署到 Auto Scaling 群組內所有執行個體的 TagValue 指定 Auto Scaling 群組名稱。)

        如果您同時指定 InstanceIdsTagKeys 參數,InstanceIds 會優先,且標籤會遭到忽略。

  5. 檢閱設定,然後選擇建立堆疊

如果您想要先編輯範本檔案以進行自訂,請選擇建立堆疊精靈下的上傳範本檔案選項,以上傳編輯的範本。如需詳細資訊,請參閱在 AWS CloudFormation 主控台上建立堆疊。您可以使用以下連結來下載範本:https://https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json。

注意

此步驟完成後,此 Systems Manager 參數將與目標執行個體中執行的 CloudWatch 代理程式相關聯。這表示:

  1. 如果已刪除 Systems Manager 參數,代理程式將停止。

  2. 如果已編輯 Systems Manager 參數,組態變更會自動套用到代理程式,排程頻率預設為 30 天。

  3. 如果您想要立即套用變更至此 Systems Manager 參數,則必須再次執行此步驟。如需關聯的詳細資訊,請參閱在 Systems Manager 中使用關聯

步驟 4:確認代理程式設定已正確設定

您可以依照中的步驟來驗證 CloudWatch 代理程式是否已安裝確認 CloudWatch 代理程式正在執行中。如果 CloudWatch 代理程式未安裝並執行,請確定您已正確設定所有項目。

如果一切設定正確,則您應該會看到 JVM 指標發佈至 CloudWatch。您可以檢查 CloudWatch 主控台,以確認它們正在發佈。

驗證 JVM 指標是否已發佈至 CloudWatch
  1. 透過 https://console.aws.amazon.com/cloudwatch/ 開啟 CloudWatch 主控台。

  2. 選擇指標所有指標

  3. 請確定您已選取部署解決方案的區域,然後選擇自訂命名空間 CWAgent

  4. 搜尋 中提到的指標JVM 主機的代理程式組態,例如 jvm.memory.heap.used。如果您看到這些指標的結果,則會將指標發佈至 CloudWatch。

建立 JVM 解決方案儀表板

此解決方案提供的儀表板會顯示伺服器基礎 Java 虛擬機器 (JVM) 的指標。它透過彙總和呈現所有執行個體的指標來提供 JVM 的概觀,並提供整體運作狀態和操作狀態的高階摘要。此外,儀表板會顯示每個指標的前 10 個貢獻者 (每個指標前 10 個小工具) 的明細。這可協助您快速識別對觀察指標有重大貢獻的極端值或執行個體。

解決方案儀表板不會顯示 EC2 指標。若要檢視 EC2 指標,您需要使用 EC2 自動儀表板來查看 EC2 已發佈的指標,並使用 EC2 主控台儀表板來查看 CloudWatch 代理程式收集的 EC2 指標。如需 AWS 服務自動儀表板的詳細資訊,請參閱 檢視單一服務的 CloudWatch 儀表板 AWS

若要建立儀表板,您可以使用下列選項:

  • 使用 CloudWatch 主控台建立儀表板。

  • 使用 AWS CloudFormation 主控台部署儀表板。

  • 下載 AWS CloudFormation 基礎設施做為程式碼,並將其整合為持續整合 (CI) 自動化的一部分。

透過使用 CloudWatch 主控台建立儀表板,您可以在實際建立和收費之前預覽儀表板。

注意

在此解決方案 AWS CloudFormation 中使用 建立的儀表板會顯示部署解決方案的 區域的指標。請務必在發佈 JVM 指標的區域中建立 AWS CloudFormation 堆疊。

如果 CloudWatch 代理程式指標發佈到與 不同的命名空間 CWAgent(例如,如果您已提供自訂命名空間),您必須變更 CloudFormation 組態,CWAgent以使用自訂命名空間取代 。

透過 CloudWatch Console 建立儀表板
注意

解決方案儀表板目前僅顯示 G1 垃圾收集器的垃圾收集相關指標,G1 垃圾收集器是最新 Java 版本的預設收集器。如果您使用的是不同的垃圾回收演算法,則與垃圾回收相關的小工具是空的。不過,您可以變更儀表板 CloudFormation 範本,並將適當的垃圾收集類型套用至垃圾收集相關指標的名稱維度,來自訂這些小工具。例如,如果您使用的是平行垃圾回收,請將垃圾回收計數指標 name=\"G1 Young Generation\"name=\"Parallel GC\"的 變更為 jvm.gc.collections.count

  1. 使用此連結開啟 CloudWatch 主控台建立儀表板https://https://console.aws.amazon.com/cloudwatch/home?#dashboards?dashboardTemplate=JvmOnEc2&referrer=os-catalog。

  2. 確認主控台上選取的區域是執行 JVM 工作負載的區域。

  3. 輸入儀表板的名稱,然後選擇建立儀表板

    為了輕鬆區分此儀表板與其他區域中的類似儀表板,建議您在儀表板名稱中包含區域名稱,例如 JVMDashboard-us-east-1

  4. 預覽儀表板,然後選擇儲存以建立儀表板。

透過 建立儀表板 AWS CloudFormation
  1. 使用此連結開啟 AWS CloudFormation 快速建立堆疊精靈: https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/JVM_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json

  2. 確認主控台上選取的區域是執行 JVM 工作負載的區域。

  3. 針對堆疊名稱,輸入名稱來識別此堆疊,例如 JVMDashboardStack

  4. 參數區段中,指定 DashboardName 參數下的儀表板名稱。

    為了輕鬆區分此儀表板與其他區域中的類似儀表板,建議您在儀表板名稱中包含區域名稱,例如 JVMDashboard-us-east-1

  5. 在功能和轉換下確認轉換的存取功能。請注意,CloudFormation 不會新增任何 IAM 資源。

  6. 檢閱設定,然後選擇建立堆疊

  7. 在堆疊狀態為 CREATE_COMPLETE 之後,請選擇建立的堆疊下方的資源索引標籤,然後選擇實體 ID 下方的連結以前往儀表板。您也可以在 CloudWatch 主控台中存取儀表板,方法是選擇主控台左側導覽窗格中的儀表板,然後在自訂儀表板下尋找儀表板名稱。

如果您想要編輯範本檔案以針對任何用途自訂範本檔案,您可以使用建立堆疊精靈下的上傳範本檔案選項來上傳編輯的範本。如需詳細資訊,請參閱在 AWS CloudFormation 主控台上建立堆疊。您可以使用此連結來下載範本:https://https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/JVM_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json

注意

解決方案儀表板目前僅顯示 G1 垃圾收集器的垃圾收集相關指標,G1 垃圾收集器是最新 Java 版本的預設收集器。如果您使用的是不同的垃圾回收演算法,則與垃圾回收相關的小工具是空的。不過,您可以變更儀表板 CloudFormation 範本,並將適當的垃圾收集類型套用至垃圾收集相關指標的名稱維度,來自訂這些小工具。例如,如果您使用的是平行垃圾回收,請將垃圾回收計數指標 name=\"G1 Young Generation\"name=\"Parallel GC\"的 變更為 jvm.gc.collections.count

JVM 儀表板入門

以下是您可以使用新 JVM 儀表板嘗試的一些任務。這些任務可讓您驗證儀表板是否正常運作,並為您提供一些實際操作體驗,使用它來監控 JVM 程序群組。嘗試這些方法時,您將熟悉導覽儀表板和解譯視覺化指標。

選取程序群組

使用 JVM 程序群組名稱下拉式清單,選取要監控的程序群組。儀表板會自動更新以顯示所選程序群組的指標。如果您有多個 Java 應用程式或環境,則每個應用程式或環境都可能表示為個別的程序群組。選取適當的程序群組可確保您正在檢視要分析的應用程式或環境特定的指標。

檢閱記憶體用量

從儀表板概觀區段中,尋找堆積記憶體用量百分比和非堆積記憶體用量百分比小工具。這些顯示所選程序群組中所有 JVMs 正在使用的堆積和非堆積記憶體百分比。高百分比表示可能導致效能問題或OutOfMemoryError例外狀況的潛在記憶體壓力。您也可以在主機的記憶體用量下向下切入主機堆積用量,以檢查具有高用量的主機。

分析載入的執行緒和類別

主機載入的執行緒和類別區段中,尋找前 10 個執行緒計數前 10 個載入的類別小工具。尋找執行緒或類別數量異常多於其他類別的任何 JVMs。執行緒太多可能表示執行緒洩漏或並行過多,而大量載入的類別可能指向潛在的類別載入器洩漏或無效的動態類別產生。

識別垃圾回收問題

垃圾回收區段中,尋找適用於不同垃圾收集器類型的每分鐘前 10 個垃圾回收調用和前 10 個垃圾回收持續時間小工具:Longle並行混合。尋找集合數量異常高或集合持續時間長的任何 JVMs。這可能表示組態問題或記憶體流失。