使用 Cloud Profiler 监控流水线性能

Cloud Profiler 是一个低开销的统计性能剖析器,可从生产应用中持续收集有关 CPU 使用情况和内存分配情况的信息。如需了解详情,请参阅性能剖析相关概念。要排查或监控流水线性能的问题,请使用 Dataflow 与 Cloud Profiler 的集成来确定流水线代码中资源耗用量最大的部分。

如需了解构建或运行 Dataflow 流水线的问题排查提示和调试策略,请参阅排查和调试流水线

准备工作

了解性能剖析相关概念并熟悉性能分析器界面。如需了解如何开始使用性能分析器界面,请参阅选择要分析的性能剖析文件

在启动作业之前,必须为您的项目启用 Cloud Profiler API。您首次访问 Profiler 页面时,它会自动启用。或者,您可以使用 Google Cloud CLI gcloud 命令行工具或 Google Cloud 控制台启用 Cloud Profiler API。

如需使用 Cloud Profiler,您的项目必须具有足够的配额。此外,Dataflow 作业的工作器服务账号必须具有 Profiler 的适当权限。例如,如需创建配置文件,工作器服务账号必须具有 cloudprofiler.profiles.create 权限,Cloud Profiler Agent (roles/cloudprofiler.agent) IAM 角色可提供此权限。如需了解详情,请参阅使用 IAM 进行访问权限控制

为 Dataflow 流水线启用 Cloud Profiler

Cloud Profiler 可用于使用 Java 版和 Python 版 Apache Beam SDK 2.33.0 或更高版本编写的 Dataflow 流水线。Python 流水线必须使用 Dataflow Runner v2。可以在流水线启动时启用 Cloud Profiler。您的流水线分摊的 CPU 和内存开销预计小于 1%。

Java

如需启用 CPU 性能剖析,请使用以下选项启动流水线。

--dataflowServiceOptions=enable_google_cloud_profiler

如需启用堆性能剖析,请使用以下选项启动流水线。堆性能剖析需要使用 Java 11 或更高版本。

--dataflowServiceOptions=enable_google_cloud_profiler

--dataflowServiceOptions=enable_google_cloud_heap_sampling

Python

如需使用 Cloud Profiler,您的 Python 流水线必须使用 Dataflow Runner v2 运行。

如需启用 CPU 性能剖析,请使用以下选项启动流水线。堆性能剖析功能尚不支持用于 Python。

--dataflow_service_options=enable_google_cloud_profiler

Go

如需启用 CPU 和堆性能剖析,请使用以下选项启动流水线。

--dataflow_service_options=enable_google_cloud_profiler

如果您通过 Dataflow 模板部署流水线并希望启用 Cloud Profiler,请将 enable_google_cloud_profilerenable_google_cloud_heap_sampling 标志指定为额外的实验。

控制台

如果您使用 Google 提供的模板,则可以在 Dataflow 基于模板创建作业页面的额外实验字段中指定这些标志。

gcloud

如果您使用 Google Cloud CLI 运行模板(gcloud dataflow jobs rungcloud dataflow flex-template run,具体取决于模板类型),请使用 --additional-experiments 选项来指定这些标志。

API

如果您使用 REST API 运行模板,请使用运行时环境(RuntimeEnvironmentFlexTemplateRuntimeEnvironment,具体取决于模板类型)的 additionalExperiments 字段来指定这些标志。

查看性能分析数据

如果启用了 Cloud Profiler,则作业页面上将显示指向 Profiler 页面的链接。

包含 Profiler 页面链接的“作业”页面。

您可以在 Profiler 页面上找到 Dataflow 流水线的性能剖析数据。Service 是您的作业名称,Version 是您的作业 ID。

显示用于对 Dataflow 作业进行性能剖析的 Service 和 Version 值。

使用 Cloud Profiler

Profiler 页面包含一个火焰图,其中显示工作器上运行的每个帧的统计信息。 在水平方向上,您可以查看每个帧在 CPU 时间方面的执行时间。在垂直方向上,您可以看到堆栈轨迹和并行运行的代码。堆栈轨迹由运行程序基础架构代码主导。出于调试目的,我们通常关注用户代码执行,它通常位于图表底部提示附近。通过查找标记帧(表示已知仅调用用户代码的运行程序代码),可以识别用户代码。对于 Beam ParDo 运行程序,系统会创建一个动态适配器层来调用用户提供的 DoFn 方法签名。此层可以标识为具有 invokeProcessElement 后缀的帧。 下图展示了如何查找标记帧

Profiler 火焰图示例,显示了标记帧。

点击感兴趣的标记帧后,火焰图会聚焦于堆栈轨迹,从而充分显示长时间运行的用户代码。 最慢的操作可以指明形成瓶颈的位置,并提供优化机会。在以下示例中,您可以看到全局数据选取与 ByteArrayCoder 结合使用。 在这种情况下,编码器可能是很好的优化领域,因为它与 ArrayList 和 HashMap 操作相比,占用了大量 CPU 时间。

显示最慢运行操作的标记帧堆栈轨迹示例。

排查 Cloud Profiler 问题

如果您启用了 Cloud Profiler,但您的流水线并未生成性能剖析数据,则可能是由以下某个原因造成。

  • 您的流水线使用的是较旧的 Apache Beam SDK 版本。如需使用 Cloud Profiler,您需要使用 Apache Beam SDK 2.33.0 版或更高版本。您可以在作业页面上查看流水线的 Apache Beam SDK 版本。如果您的作业是通过 Dataflow 模板创建的,则这些模板必须使用受支持的 SDK 版本

  • 您的项目即将用尽 Cloud Profiler 配额。您可以在项目的配额页面中查看配额用量。如果超出 Cloud Profiler 配额,则可能会发生错误,例如 Failed to collect and upload profile whose profile type is WALL。如果已用尽配额,Cloud Profiler 服务将拒绝性能剖析数据。 如需详细了解 Cloud Profiler 配额,请参阅配额和限制

  • 您的作业运行时间过短,无法为 Cloud Profiler 生成数据。运行时间较短(例如不到 5 分钟)的作业可能无法提供足够的性能分析数据,无法让 Cloud Profiler 生成结果。

Cloud Profiler 代理在 Dataflow 工作器启动过程中安装。Cloud Profiler 生成的日志消息可在 dataflow.googleapis.com/worker-startup 类型的日志中获得。

显示 Cloud Profiler 日志的页面,其中带有突出显示的导航路径:dataflow.googleapis.com/worker-startup。

有时,存在性能剖析数据,但 Cloud Profiler 不显示任何输出。Profiler 会显示类似 There were profiles collected for the specified time range, but none match the current filters 的消息。

如需解决此问题,请尝试执行以下问题排查步骤。

  • 确保 Profiler 中的时间跨度和结束时间覆盖作业的运行时间。

  • 确认在 Profiler 中选择了正确的作业。服务是您的作业名称。

  • 确认 job_name 流水线选项的值与 Dataflow 作业页面上的作业名称相同。

  • 如果您在加载 Profiler 代理时指定了 service-name 参数,请确认服务名称已正确配置。