本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CloudWatch 解決方案:Amazon EC2 上的 JVM 工作負載
此解決方案可協助您透過 CloudWatch 代理程式,為在 EC2 執行個體上執行的 JVM 應用程式設定開箱即用的指標收集功能。除此之外,還可協助您設定預先設定的 CloudWatch 儀表板。如需所有 CloudWatch 可觀測性解決方案的一般資訊,請參閱CloudWatch 可觀測性解決方案。
要求
此解決方案適用於下列情況:
支援的版本:Java LTS 版本 8、11、17 和 21
運算:Amazon EC2
在特定的 JVM 工作負載中最多支援 500 個 EC2 執行個體 AWS 區域
CloudWatch 代理程式的最新版本
-
EC2 執行個體上安裝的 SSM 代理程式
注意
AWS Systems Manager (SSM 代理程式) 預先安裝在由 AWS 和信任的第三方提供的一些 Amazon Machine Image AMIs) 上。如果未安裝代理程式,您可以依循適用於您作業系統類型的程序手動安裝。
優勢
此解決方案提供 JVM 監控功能,針對下列使用案例提供寶貴洞察:
-
監控 JVM 堆積和非堆積記憶體用量。
-
分析執行緒和類別載入以偵測並行問題。
-
追蹤垃圾回收以識別記憶體洩漏問題。
-
在同一帳戶下,切換透過解決方案設定的不同 JVM 應用程式。
以下是此解決方案的主要優勢:
-
透過 CloudWatch 代理程式組態自動執行 JVM 指標收集,免除手動檢測需求。
-
提供預先設定的整合式 CloudWatch 儀表板,專門用於監控 JVM 指標。儀表板將自動處理透過此解決方案設定之新 JVM EC2 執行個體產生的指標,即使您第一次建立儀表板時這些指標不存在。透過它,您還可以將指標分組到邏輯應用程式中,以便於監控和管理。
下圖是此解決方案之儀表板的範例。
成本
此解決方案會在您的帳戶中建立並使用資源。您需要支付標準用量的費用,包括下列項目:
CloudWatch 代理程式收集的所有指標以自訂指標計費。此解決方案使用的指標數目取決於 EC2 主機的數目。
為解決方案設定的每個 JVM 主機總共會發布 18 個指標,外加一項指標 (
disk_used_percent),其指標數目取決於該主機的路徑數目。
一個自訂儀表板。
CloudWatch 代理程式請求的 API 操作,用於發布指標。在此解決方案的預設組態下,CloudWatch 代理程式每分鐘會針對每個 EC2 主機呼叫 PutMetricData 一次。這表示在一個 30 天的月份,針對每個 EC2 主機,系統將呼叫 PutMetricData API
30*24*60=43,200次。
如需 CloudWatch 定價的詳細資訊,請參閱 Amazon CloudWatch 定價
定價計算器可協助您估算使用此解決方案的每月大致費用。
使用定價計算器來估算解決方案的每月費用
-
對於選擇區域,選取您要將解決方案部署到的區域。
-
在指標區段中,對於指標數目,輸入
(18 + average number of disk paths per EC2 host) * number of EC2 instances configured for this solution。 -
在 API 區段中,對於 API 請求數目,輸入
43200 * number of EC2 instances configured for this solution。依預設,CloudWatch 代理程式每分鐘會為每個 EC2 主機執行 PutMetricData 操作一次。
在儀表板和警示區段中,對於儀表板數目,輸入
1。-
可以在定價計算器底部查看每月預估費用。
此解決方案的 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=falsepet-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 Management Extensions (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:使用 CloudFormation 堆疊在一或多個 EC2 執行個體上安裝 CloudWatch 代理程式。
步驟 4:確認已正確完成代理程式設定。
步驟 1:確定目標 EC2 執行個體具有所需的 IAM 許可
您必須授與 Systems Manager 安裝和設定 CloudWatch 代理程式的許可。還必須授與 CloudWatch 代理程式從 EC2 執行個體發布遙測到 CloudWatch 的許可。確定連結至執行個體的 IAM 角色已連結 CloudWatchAgentServerPolicy 和 AmazonSSMManagedInstanceCore IAM 政策。
-
建立角色之後,將角色連結至 EC2 執行個體。請依循使用 IAM 角色啟動執行個體中的步驟,在啟動新的 EC2 執行個體時連結角色。若要將角色連結至現有的 EC2 執行個體,請依循將 IAM 角色連結至執行個體中的步驟。
步驟 2:將建議的 CloudWatch 代理程式設定檔儲存在 Systems Manager 參數儲存區中
參數儲存區透過安全地儲存和管理組態參數,簡化在 EC2 執行個體上安裝 CloudWatch 代理程式的流程,無需使用硬式編碼值。這可確保部署程序更安全、更靈活,實現集中式管理,並能更輕鬆地更新多個執行個體的組態。
依循下列步驟,將建議的 CloudWatch 代理程式設定檔儲存為參數儲存區中的參數。
建立 CloudWatch 代理程式設定檔作為參數
在 https://https://console.aws.amazon.com/systems-manager/
開啟 AWS Systems Manager 主控台。 從導覽窗格中,選擇應用程式管理、參數儲存區。
依循下列步驟為組態建立新的參數。
-
選擇 Create parameter (建立參數)。
-
在名稱方塊中,輸入您將用於在後續步驟中引用 CloudWatch 代理程式設定檔的名稱。例如
AmazonCloudWatch-JVM-Configuration。 -
(選用) 在描述方塊中,輸入參數描述。
-
對於參數層,選擇標準。
-
在類型選擇字串。
對於資料類型,選擇文字。
-
在值方塊中,貼上 JVM 主機的代理程式組態中列示的對應 JSON 區塊。務必依循說明自訂分組維度值和連接埠號碼。
-
選擇 Create parameter (建立參數)。
-
步驟 3:安裝 CloudWatch 代理程式並使用 CloudFormation 範本套用組態
您可以使用 AWS CloudFormation 安裝代理程式,並將其設定為使用您在先前步驟中建立的 CloudWatch 代理程式組態。
為此解決方案安裝和設定 CloudWatch 代理程式
-
使用此連結開啟 CloudFormation 快速建立堆疊精靈:https://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。
-
確認主控台上選取的區域是執行 JVM 工作負載的區域。
-
對於堆疊名稱,輸入可識別此堆疊的名稱,例如
CWAgentInstallationStack。 -
在參數區段中,執行以下動作:
-
對於 CloudWatchAgentConfigSSM,輸入您先前建立之代理程式組態的 Systems Manager 參數名稱,例如
AmazonCloudWatch-JVM-Configuration。 -
若要選取目標執行個體,您有兩個選項。
-
對於 InstanceIds,指定以逗號分隔的執行個體 ID 清單,列出您想要使用此組態安裝 CloudWatch 代理程式的執行個體 ID。您可以列出一個或多個執行個體。
-
若要大規模部署,可以指定 TagKey 和對應的 TagValue,以鎖定使用此標籤和值的所有 EC2 執行個體。指定 TagKey 時,必須指定對應的 TagValue。(對於 Auto Scaling 群組,請為 TagKey 指定
aws:autoscaling:groupName,並為 TagValue 指定 Auto Scaling 群組名稱,以部署到 Auto Scaling 群組內的所有執行個體。)如果您同時指定 InstanceIds 和 TagKeys 參數,系統將以 InstanceIds 為準,並忽略標籤。
-
-
-
檢閱設定,然後選擇建立堆疊。
如果想要先編輯範本檔案以進行自訂,請選擇建立堆疊精靈下的上傳範本檔案選項,以上傳經編輯的範本。如需詳細資訊,請參閱在 CloudFormation 主控台上建立堆疊。可以使用以下連結下載範本: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 代理程式關聯。這表示:
-
如果刪除 Systems Manager 參數,代理程式將停止運作。
-
如果編輯 Systems Manager 參數,組態變更會自動套用至代理程式,排程頻率預設為 30 天。
-
如果想要即刻將變更套用至此 Systems Manager 參數,必須再次執行此步驟。如需關於關聯的更多資訊,請參閱在 Systems Manager 中使用關聯。
步驟 4:確認代理程式設定已正確設定
您可以依循確認 CloudWatch 代理程式正在執行中中的步驟,檢查 CloudWatch 代理程式是否已安裝。若 CloudWatch 代理程式未安裝且未執行,請確認您已正確完成所有設定。
-
請確定您已連結具有 EC2 執行個體正確許可的角色,如步驟 1:確定目標 EC2 執行個體具有所需的 IAM 許可中所述。
-
請確定您已正確設定 Systems Manager 參數的 JSON。請遵循 使用 安裝 CloudWatch 代理程式的故障診斷 CloudFormation 中的步驟。
若所有設定皆正確無誤,您應可看到 JVM 指標已發布至 CloudWatch。可以檢查 CloudWatch 主控台,以確認系統是否正在發布這些指標。
驗證 JVM 指標是否已發布至 CloudWatch
透過 https://console.aws.amazon.com/cloudwatch/
開啟 CloudWatch 主控台。 依序選擇指標、所有指標。
請確定您已選取部署解決方案的區域,然後選擇自訂命名空間、CWAgent。
搜尋 JVM 主機的代理程式組態 中提到的指標,例如
jvm.memory.heap.used。如果您看到這些指標的結果,則指標會發布至 CloudWatch。
建立 JVM 解決方案儀表板
此解決方案提供的儀表板會顯示伺服器底層 Java 虛擬機器 (JVM) 的指標。它透過彙總和呈現所有執行個體的指標來提供 JVM 的概觀,並提供整體運作狀態和操作狀態的高階摘要。此外,儀表板會顯示每個指標的主要貢獻因子 (每個指標小工具的前 10 個因子) 明細。這可協助您快速識別對觀測指標有重大貢獻的極端值或執行個體。
解決方案儀表板不會顯示 EC2 指標。若要檢視 EC2 指標,您需要使用 EC2 自動儀表板查看 EC2 代售指標,並使用 EC2 主控台儀表板查看 CloudWatch 代理程式收集的 EC2 指標。如需 AWS 服務自動儀表板的詳細資訊,請參閱 檢視單一 AWS 服務的 CloudWatch 儀表板。
若要建立儀表板,可以使用下列選項:
使用 CloudWatch 主控台建立儀表板。
使用 AWS CloudFormation 主控台部署儀表板。
下載 AWS CloudFormation 基礎設施做為程式碼,並將其整合為持續整合 (CI) 自動化的一部分。
透過使用 CloudWatch 主控台建立儀表板,您可以在實際建立和收費之前預覽儀表板。
注意
在此解決方案 CloudFormation 中使用 建立的儀表板會顯示部署解決方案的區域指標。請務必在發佈 JVM 指標的區域中建立 CloudFormation 堆疊。
若 CloudWatch 代理程式指標發布至 CWAgent 之外的命名空間 (例如您已提供自訂命名空間),您需要更改 CloudFormation 設定,將 CWAgent 替換為您使用的自訂命名空間。
透過 CloudWatch 主控台建立儀表板
注意
解決方案儀表板目前僅顯示 G1 垃圾回收器的垃圾回收相關指標,G1 垃圾回收器是最新 Java 版本的預設回收器。如果您採用其他垃圾回收演算法,則與垃圾回收相關的小工具將保持空白狀態。不過,您可以透過變更儀表板 CloudFormation 範本,並將適當的垃圾回收類型套用至垃圾回收相關指標的名稱維度,自訂這些小工具。例如,如果您使用的是平行垃圾回收機制,請將垃圾回收計數指標 jvm.gc.collections.count 的 name=\"G1 Young Generation\" 變更為 name=\"Parallel GC\"。
-
使用此連結開啟 CloudWatch 主控台建立儀表板: https://console.aws.amazon.com/cloudwatch/home?#dashboards?dashboardTemplate=JvmOnEc2&referrer=os-catalog
。 -
確認主控台上選取的區域是執行 JVM 工作負載的區域。
-
輸入儀表板的名稱,然後選擇建立儀表板。
為方便區分此儀表板與其他區域的類似儀表板,建議在儀表板名稱中包含區域名稱,例如
JVMDashboard-us-east-1。 -
預覽儀表板,然後選擇儲存以建立儀表板。
透過 建立儀表板 CloudFormation
-
使用此連結開啟 CloudFormation 快速建立堆疊精靈:https://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。
-
確認主控台上選取的區域是執行 JVM 工作負載的區域。
-
對於堆疊名稱,輸入可識別此堆疊的名稱,例如
JVMDashboardStack。 -
在參數區段的 DashboardName 參數下,指定儀表板名稱。
為方便區分此儀表板與其他區域的類似儀表板,建議在儀表板名稱中包含區域名稱,例如
JVMDashboard-us-east-1。 -
在功能和轉換下,確認轉換的存取功能。請注意,CloudFormation 不會新增任何 IAM 資源。
-
檢閱設定,然後選擇建立堆疊。
-
堆疊狀態變為 CREATE_COMPLETE 之後,請在所建立堆疊下方選擇資源索引標籤,然後選擇實體 ID 下方的連結以前往儀表板。也可以在 CloudWatch 主控台中存取儀表板,方法是選擇主控台左側導覽窗格中的儀表板,然後在自訂儀表板下尋找儀表板名稱。
如果想要編輯範本檔案以針對任何用途自訂範本檔案,可以使用建立堆疊精靈下的上傳範本檔案選項來上傳經編輯的範本。如需詳細資訊,請參閱在 CloudFormation 主控台上建立堆疊。可以使用此連結下載範本: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 範本,並將適當的垃圾回收類型套用至垃圾回收相關指標的名稱維度,自訂這些小工具。例如,如果您使用的是平行垃圾回收機制,請將垃圾回收計數指標 jvm.gc.collections.count 的 name=\"G1 Young Generation\" 變更為 name=\"Parallel GC\"。
開始使用 JVM 儀表板
以下是您可以嘗試使用新 JVM 儀表板處理的一些任務。這些任務可讓您驗證儀表板是否運作正常,並提供實際操作經驗,協助您運用儀表板監控 JVM 程序群組。當您嘗試這些功能時,可逐漸熟悉儀表板的操作介面,並學會解讀視覺化的指標資料。
選取程序群組
使用 JVM 程序群組名稱下拉式清單,選取要監控的程序群組。儀表板會自動更新,以顯示所選程序群組的指標。如果您有多個 Java 應用程式或環境,每個都可能被視為獨立的程序群組。選取適當的程序群組可確保您檢視的是特定於要分析之應用程式或環境的指標。
檢閱記憶體用量
在儀表板概觀區段中,尋找堆積記憶體用量百分比和非堆積記憶體用量百分比小工具。這些工具顯示所選程序群組中所有 JVM 正在使用之堆積和非堆積記憶體的百分比。高百分比表示可能導致效能問題或 OutOfMemoryError 例外狀況的潛在記憶體壓力。您亦可透過主機記憶體使用量下的主機堆疊使用量進行深入分析,以檢視使用量偏高的主機。
分析載入的執行緒和類別
在主機載入的執行緒和類別區段中,尋找前 10 個執行緒計數和前 10 個載入的類別小工具。尋找執行緒或類別數量異常高於其他執行個體的任何 JVM。執行緒太多可能表示執行緒洩漏或並行過多,而大量載入類別可能表示類別載入器可能存在洩漏或者動態類別產生效率低下。
識別垃圾回收問題
在垃圾回收區段中,尋找適用於不同垃圾回收器類型的每分鐘排名前 10 的垃圾回收調用和排名前 10 的垃圾回收持續時間小工具:年輕、並行、混合。尋找任何相較於其他執行個體,具有異常高次數垃圾回收或較長回收持續時間的 JVM。這可能表示存在組態問題或記憶體流失。