剖析 Java 应用的性能

本页面介绍如何修改 Java 应用以捕获 性能剖析数据,并将该数据发送到您的 Google Cloud 项目。如需了解性能剖析的常规信息,请参阅 性能剖析相关概念

Java 的性能剖析文件类型:

  • CPU 时间
  • 堆(需要 Java 11 或 App Engine 标准环境,默认处于停用状态)
  • 实际用时(不适用于 Java 8 App Engine 标准环境)

支持的 Java 语言版本:

  • 基于热点的 JVM(包括 Oracle JDK 和一些 OpenJDK Build),适用于 Java 8、11 或更高版本。

支持的性能剖析代理版本:

  • 支持代理的最新版本。通常,不支持发布超过一年的版本。我们建议您使用最近发布的代理版本。

支持的操作系统:

  • Linux。只有使用 glibcmusl 实现其标准 C 库的Linux 内核支持剖析 Java 应用的性能。如需了解针对 Linux Alpine 内核的特定配置信息,请参阅在 Linux Alpine 上运行

支持的环境:

启用 Profiler API

在使用性能剖析代理之前,请确保已启用底层 Profiler API。您可以使用 Google Cloud CLI 或 控制台 Google Cloud 查看该 API 的状态以及在必要时启用 该 API:

gcloud CLI

  1. 如果您尚未在工作站上安装 Google Cloud CLI,请参阅 Google Cloud CLI 文档

  2. 运行以下命令:

    gcloud services enable cloudprofiler.googleapis.com
    

如需了解详情,请参阅 gcloud services

Google Cloud 控制台

  1. 启用 Cloud Profiler API。

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予角色

    启用 API

  2. 如果系统显示 API 已启用 ,则表示此 API 已经启用。如未显示,请点击启用 按钮。

向服务帐号授予 IAM 角色

如果您在 Google Cloud 资源上部署应用,并且您 使用的是默认服务帐号,并且尚未修改对该服务帐号的角色授予 ,则可以跳过本部分。

如果您执行以下任一操作,则需要向服务帐号授予 Cloud Profiler Agent (roles/cloudprofiler.agent) 的 IAM 角色:

  1. 您使用的是默认服务帐号,但修改了其角色授予。
  2. 您使用的是用户创建的服务帐号。
  3. 您使用的是 Workload Identity, 请向 Kubernetes 服务帐号授予 Cloud Profiler Agent 角色。

您可以使用 Google Cloud 控制台或 Google Cloud CLI 向服务帐号授予 IAM 角色。例如,您可以使用 gcloud projects add-iam-policy-binding 命令:

gcloud projects add-iam-policy-binding GCP_PROJECT_ID \
    --member serviceAccount:MY_SVC_ACCT_ID@GCP_PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudprofiler.agent

在使用上述命令之前,请替换以下内容:

  • GCP_PROJECT_ID:您的项目 ID。
  • MY_SVC_ACCT_ID:您的服务帐号的名称。

如需了解详情,请参阅 管理对项目、文件夹和组织的访问权限

安装 Profiler 代理

Compute Engine

  1. 为 Profiler 代理创建安装目录,例如 /opt/cprof

     sudo mkdir -p /opt/cprof

  2. storage.googleapis.com 代码库下载代理归档文件,然后将其解压缩至安装目录:

    wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
    | sudo tar xzv -C /opt/cprof

GKE

修改 Dockerfile 以便为 Profiler 代理创建安装目录,下载代理归档文件并将其解压缩到安装目录中。

Linux(基于 glibc 的 C 库)

使用以下安装命令:

RUN mkdir -p /opt/cprof && \
  wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
  | tar xzv -C /opt/cprof

Linux Alpine(基于 musl 的 C 库)

使用以下安装命令:

wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent_alpine.tar.gz \
| tar xzv -C /opt/cprof

柔性环境

如果您使用的是 Google Java 8 运行时基础映像或 Java 9 / Jetty 9 运行时 基础映像,那么系统已预装 Profiler 代理,因此您无需执行其他步骤来安装该代理。

对于所有其他基础映像,您需要安装该代理。例如,以下 Dockerfile 包含使用 openjdk:11-slim 映像安装 Profiler 代理的说明,它定义了启动应用时要使用的默认参数:

FROM openjdk:11-slim

COPY . .
RUN  apt-get update \
     && apt-get install wget \
     && rm -rf /var/lib/apt/lists/*

RUN mkdir -p /opt/cprof && \
    wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
    | tar xzv -C /opt/cprof

CMD ["java", "-agentpath:/opt/cprof/profiler_java_agent.so=OPTION1,OPTION2", "-jar", "PATH_TO_YOUR_JAR_FILE"]

如需将此 Dockerfile 与 App Engine 柔性环境一起使用,您需要执行以下操作:

  • OPTION1OPTION2 替换为应用所需的代理配置值,并将 PATH_TO_YOUR_JAR_FILE 替换为 jar 文件的路径。
  • Dockerfile 放在 app.yaml 文件所在的目录中。
  • 修改 app.yaml 文件以指定自定义运行时。如需了解详情,请参阅构建自定义运行时

标准环境

如果您使用的是 Java 运行时环境, 那么系统已预装 Profiler 代理,因此您无需执行其他步骤来安装该代理。 对于 Java 11 及更高版本,它已预装在 /opt/cprof 中。

外部 Google Cloud

  1. 为 Profiler 代理创建安装目录,例如 /opt/cprof

     sudo mkdir -p /opt/cprof

  2. storage.googleapis.com 代码库下载代理归档文件,然后将其解压缩至安装目录:

    wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
    | sudo tar xzv -C /opt/cprof

如需列出所有可供下载的代理版本,请运行以下命令:

gcloud storage ls gs://cloud-profiler/java/cloud-profiler-*

命令响应如下所示:

gs://cloud-profiler/java/cloud-profiler-java-agent_20191014_RC00.tar.gz
gs://cloud-profiler/java/cloud-profiler-java-agent_20191021_RC00.tar.gz
gs://cloud-profiler/java/cloud-profiler-java-agent_20191028_RC00.tar.gz

如需下载特定版本的代理,请将其网址传递给下载命令。例如,如需下载 2019 年 10 月 28 日构建的代理,您可以使用以下语句:

wget -q -O- https://storage.googleapis.com/cloud-profiler/java/cloud-profiler-java-agent_20191028_RC00.tar.gz \
  | sudo tar xzv -C /opt/cprof

在初始化代理期间会记录代理的版本。

加载 Profiler 代理

如需剖析应用的性能,请像往常运行程序一样启动 Java,但要指定代理配置选项。请指定指向代理库的路径,然后您可以将选项传递到该库。

对于 App Engine 标准环境,系统会自动加载和配置该代理。如需详细了解如何配置和启动您的程序,请直接跳到启动程序

代理配置

如需配置性能剖析代理,请在启动应用时包含 -agentpath 标志:

 -agentpath:INSTALL_DIR/profiler_java_agent.so=OPTION1,OPTION2,OPTION3

在此表达式中,INSTALL_DIR 是性能剖析代理的路径,而 OPTION1OPTION2OPTION3 是代理配置选项。例如,如果在前一个表达式中将 OPTION1 替换为 --cprof_service=myapp,那么您可以将服务名称设置为 myapp。对于选项数量或其排序方式,没有任何限制。下表列出了支持的配置选项:

代理选项 说明
-cprof_service 如果应用不在 App Engine 中运行,您必须使用此配置选项来设置服务名称。 如需了解服务名称限制,请参阅服务名称和版本参数
-cprof_service_version 如果希望能够使用 Profiler 界面按服务版本分析性能剖析数据,请使用此选项设置版本。如需了解版本限制,请参阅 服务名称和版本参数
-cprof_project_id 如果您在外部运行 Google Cloud,请使用此选项来 指定您的 Google Cloud 项目 ID。如需了解详情, 请参阅剖析在外部运行的应用的性能 Google Cloud
-cprof_zone_name 应用在运行时 Google Cloud,性能剖析代理 通过与 Compute Engine 元数据服务通信来确定相应地区。 如果性能剖析代理无法与该元数据服务通信,您 需要使用此选项。
-cprof_gce_metadata_server_retry_count