剖析 Java 应用的性能
本页面介绍如何修改 Java 应用以捕获 性能剖析数据,并将该数据发送到您的 Google Cloud 项目。如需了解性能剖析的常规信息,请参阅 性能剖析相关概念。
Java 的性能剖析文件类型:
- CPU 时间
- 堆(需要 Java 11 或 App Engine 标准环境,默认处于停用状态)
- 实际用时(不适用于 Java 8 App Engine 标准环境)
支持的 Java 语言版本:
- 基于热点的 JVM(包括 Oracle JDK 和一些 OpenJDK Build),适用于 Java 8、11 或更高版本。
支持的性能剖析代理版本:
- 支持代理的最新版本。通常,不支持发布超过一年的版本。我们建议您使用最近发布的代理版本。
支持的操作系统:
- Linux。只有使用
glibc或musl实现其标准 C 库的Linux 内核支持剖析 Java 应用的性能。如需了解针对 Linux Alpine 内核的特定配置信息,请参阅在 Linux Alpine 上运行。
支持的环境:
- Compute Engine
- Google Kubernetes Engine (GKE)
- App Engine 柔性环境
- App Engine 标准环境(需要 App Engine SDK 1.9.64 或更高版本)
- Managed Service for Apache Spark(如需了解相关信息,请参阅 为 Managed Service for Apache Spark Spark 和 Hadoop 作业配置 Cloud Profiler。)
- 外部 Google Cloud (如需了解其他 配置要求,请参阅 剖析在外部运行的应用的性能 Google Cloud。)
启用 Profiler API
在使用性能剖析代理之前,请确保已启用底层 Profiler API。您可以使用 Google Cloud CLI 或 控制台 Google Cloud 查看该 API 的状态以及在必要时启用 该 API:
gcloud CLI
如果您尚未在工作站上安装 Google Cloud CLI,请参阅 Google Cloud CLI 文档。
运行以下命令:
gcloud services enable cloudprofiler.googleapis.com
如需了解详情,请参阅 gcloud services。
Google Cloud 控制台
向服务帐号授予 IAM 角色
如果您在 Google Cloud 资源上部署应用,并且您 使用的是默认服务帐号,并且尚未修改对该服务帐号的角色授予 ,则可以跳过本部分。
如果您执行以下任一操作,则需要向服务帐号授予 Cloud Profiler Agent (roles/cloudprofiler.agent) 的 IAM 角色:
- 您使用的是默认服务帐号,但修改了其角色授予。
- 您使用的是用户创建的服务帐号。
- 您使用的是 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
为 Profiler 代理创建安装目录,例如
/opt/cprof:sudo mkdir -p /opt/cprof从
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/cprofLinux 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 柔性环境一起使用,您需要执行以下操作:
标准环境
如果您使用的是 Java 运行时环境,
那么系统已预装 Profiler 代理,因此您无需执行其他步骤来安装该代理。
对于 Java 11
及更高版本,它已预装在 /opt/cprof 中。
外部 Google Cloud
为 Profiler 代理创建安装目录,例如
/opt/cprof:sudo mkdir -p /opt/cprof从
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 是性能剖析代理的路径,而 OPTION1、OPTION2 和 OPTION3 是代理配置选项。例如,如果在前一个表达式中将 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 |