CloudWatch 解决方案:Amazon EC2 上的 JVM 工作负载 - Amazon CloudWatch

CloudWatch 解决方案:Amazon EC2 上的 JVM 工作负载

此解决方案可帮助您使用 CloudWatch 代理,为在 EC2 实例上运行的 JVM 应用程序配置开箱即用的指标收集。此外,它还可以帮助您设置预配置的 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 天(一个月)内调用 PutMetricData API 30*24*60=43,200 次。

有关 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. API 部分中,对于 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。如果您的安全策略/要求需要使用密码身份验证启用 JMX 或 SSL 进行远程访问,请参阅 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 的 Parameter Store 中,稍后将在步骤 2:在 Systems Manager Parameter Store 中存储建议的 CloudWatch 代理配置文件中详细介绍。

ProcessGroupName 替换为进程组的名称。将 port-number 替换为 Java 应用程序的 JMX 端口。如果 JMX 启用了密码身份验证或 SSL 以进行远程访问,请参阅 收集 Java 管理扩展(JMX)指标,了解有关根据需要在代理配置中设置 TLS 或授权的信息。

此配置(在 JMX 区块之外显示的配置)中显示的 EC2 指标仅适用于 Linux 和 macOS 实例。如果您使用的是 Windows 实例,则可以选择在配置中省略这些指标。有关在 Windows 实例上收集的指标的信息,请参阅 Windows Server 实例上的 CloudWatch 代理收集的指标

{ "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 代理的配置,则可以将配置合并到现有参数值。有关更多信息,请参阅 Managing CloudWatch agent configuration files

注意

使用 Systems Manager 部署以下 CloudWatch 代理配置,将替换或覆盖 EC2 实例上任何现有的 CloudWatch 代理配置。您可以修改此配置以适应您独有的环境或用例。此解决方案中定义的指标是建议控制面板所需的最低要求。

部署过程包括以下步骤:

  • 步骤 1:确保目标 EC2 实例具有所需的 IAM 权限。

  • 步骤 2:在 Systems Manager Parameter Store 中存储建议的代理配置文件。

  • 步骤 3:使用 AWS CloudFormation 堆栈在一个或多个 EC2 实例上安装 CloudWatch 代理。

  • 步骤 4:验证代理设置是否正确配置。

步骤 1:确保目标 EC2 实例具有所需的 IAM 权限

您必须授予 Systems Manager 安装和配置 CloudWatch 代理的权限。您还必须授予 CloudWatch 代理将遥测数据从 EC2 实例发布到 CloudWatch 的权限。确保附加到实例的 IAM 角色已附加 CloudWatchAgentServerPolicyAmazonSSMManagedInstanceCore IAM 策略。

步骤 2:在 Systems Manager Parameter Store 中存储建议的 CloudWatch 代理配置文件

Parameter Store 通过安全地存储和管理配置参数,简化了 CloudWatch 代理在 EC2 实例上的安装,而无需硬编码值。这可确保更加安全灵活的部署过程,从而实现集中管理,并且可以更轻松地跨多个实例更新配置。

使用以下步骤将建议的 CloudWatch 代理配置文件作为参数存储在 Parameter Store 中。

创建 CloudWatch 代理配置文件作为参数
  1. 访问 https://console.aws.amazon.com/systems-manager/,打开 AWS Systems Manager 控制台。

  2. 从导航窗格中,依次选择应用程序管理Parameter Store

  3. 按照以下步骤为配置创建新参数。

    1. 选择创建参数

    2. 名称框中,输入您将在后续步骤中用来引用 CloudWatch 代理配置文件的名称。例如,AmazonCloudWatch-JVM-Configuration

    3. (可选)在描述框中,键入参数的描述。

    4. 对于参数层,选择标准

    5. 对于类型,选择字符串

    6. 对于数据类型,选择文本

    7. 框中,粘贴 JVM 主机的代理配置中列出的相应 JSON 块。请务必按照所述自定义分组维度值和端口号。

    8. 选择创建参数

步骤 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.s3.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,请指定一个以逗号分隔的实例 ID 列表,其中包含希望使用此配置安装 CloudWatch 代理的实例 ID。您可以列出一个或多个实例。

      2. 如果要大规模部署,则可以指定 TagKey 和相应的 TagValue,以将具有此标签和值的所有 EC2 实例作为目标。如果指定 TagKey,则必须指定相应的 TagValue。(对于自动扩缩组,为 TagKey 指定 aws:autoscaling:groupName 并为 TagValue 指定自动扩缩组名称,以部署到自动扩缩组内的所有实例。)

        如果同时指定了 InstanceIdsTagKeys 参数,将优先采用 InstanceIds,而标签将被忽略。

  5. 检查设置,然后选择创建堆栈

如果要先编辑模板文件进行自定义,请选择创建堆栈向导下的上传模板文件选项,上传编辑后的模板。有关更多信息,请参阅在 AWS CloudFormation 控制台上创建堆栈。您可以使用以下链接下载模板:https://aws-observability-solutions.s3.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 名小部件)明细。这可以帮助您快速识别对观测指标有显著影响的异常值或实例。

解决方案控制面板不显示 EC2 指标。要查看 EC2 指标,您需要使用 EC2 自动控制面板查看 EC2 公开发布的指标,并使用 EC2 控制台控制面板查看 CloudWatch 代理收集的 EC2 指标。有关 AWS 服务自动控制面板的更多信息,请参阅查看单项 AWS 服务的 CloudWatch 控制面板

要创建控制面板的操作,可以使用以下选项:

  • 使用 CloudWatch 控制台创建控制面板。

  • 使用 AWS CloudFormation 控制台部署控制面板。

  • 以 AWS CloudFormation 基础设施即代码,并将其作为持续集成(CI)自动化的一部分进行集成。

通过使用 CloudWatch 控制台创建控制面板,您可以在实际创建和收费之前预览控制面板。

注意

此解决方案中使用 AWS CloudFormation 创建的控制面板显示解决方案部署区域的指标。请务必在发布 JVM 指标的区域创建 AWS CloudFormation 堆栈。

如果 CloudWatch 代理指标发布到与 CWAgent 不同的命名空间(例如,如果您提供了自定义命名空间),则必须更改 CloudFormation 配置,将 CWAgent 替换为您正在使用的自定义命名空间。

使用 CloudWatch 控制台创建控制面板
注意

解决方案控制面板目前仅显示 G1 Garbage Collector 的垃圾回收相关指标,G1 Garbage Collector 是最新 Java 版本的默认收集器。如果您使用的是不同的垃圾回收算法,则与垃圾回收相关的小部件为空。但是,您可以通过更改控制面板 CloudFormation 模板,并将相应的垃圾回收类型应用于垃圾回收相关指标的名称维度来自定义这些小部件。例如,如果您使用的是并行垃圾回收,请将垃圾回收计数指标 jvm.gc.collections.countname=\"G1 Young Generation\" 更改为 name=\"Parallel GC\"

  1. 使用以下链接打开 CloudWatch 控制台创建控制面板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.s3.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_COM PLETE 后,选择创建的堆栈下的资源选项卡,然后选择物理 ID 下的链接转至控制面板。您也可以通过在控制台左侧导航窗格中选择控制面板,然后在自定义控制面板下找到控制面板名称,在 CloudWatch 控制台中访问控制面板。

如果要编辑模板文件以出于任何目的对其进行自定义,则可以使用创建堆栈向导下的上传模板文件选项来上传编辑后的模板。有关更多信息,请参阅在 AWS CloudFormation 控制台上创建堆栈。您可以使用以下链接下载模板:https://aws-observability-solutions.s3.amazonaws.com/JVM_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json

注意

解决方案控制面板目前仅显示 G1 Garbage Collector 的垃圾回收相关指标,G1 Garbage Collector 是最新 Java 版本的默认收集器。如果您使用的是不同的垃圾回收算法,则与垃圾回收相关的小部件为空。但是,您可以通过更改控制面板 CloudFormation 模板,并将相应的垃圾回收类型应用于垃圾回收相关指标的名称维度来自定义这些小部件。例如,如果您使用的是并行垃圾回收,请将垃圾回收计数指标 jvm.gc.collections.countname=\"G1 Young Generation\" 更改为 name=\"Parallel GC\"

开始使用 JVM 控制面板

您可以使用新的 JVM 控制面板尝试以下几项任务。这些任务允许您验证控制面板是否正常运行,并为您提供使用它来监测 JVM 进程组的一些实践经验。在尝试这些任务的过程中,您将熟悉如何浏览控制面板和解读可视化指标。

选择进程组

使用 JVM 进程组名称下拉列表可选择要监测的进程组。控制面板会自动更新以显示所选进程组的指标。如果您有多个 Java 应用程序或环境,则每个应用程序或环境都可能表示为一个单独的进程组。选择相应的进程组可确保您查看的是要分析的应用程序或环境的特定指标。

查看内存使用情况

从控制面板概览部分中,找到堆内存使用百分比非堆内存使用百分比小部件。这些小部件显示所选进程组中所有 JVM 使用的堆内存和非堆内存的百分比。百分比高表示可能导致性能问题或 OutOfMemoryError 异常的潜在内存压力。您还可以在按主机分列的内存使用情况下深入查看按主机分列的堆使用情况,以检查使用率较高的主机。

分析已加载的线程和类

按主机分列的已加载线程和类部分中,找到线程数前 10 名加载的类前 10 名小部件。查找与其他 JVM 相比,线程或类数量异常多的 JVM。线程过多可能表示线程泄漏或并发量过大,而大量已加载的类可能表明潜在的类加载器泄漏或动态类生成效率低下。

确定垃圾回收问题

垃圾回收部分,找到以下不同垃圾回收器类型的每分钟垃圾回收调用次数前 10 名垃圾回收持续时间前 10 名小部件:较新并发混合。查找与其他 JVM 相比,回收次数异常多或回收持续时间较长的 JVM。这可能表示存在配置问题或内存泄漏。