衡量应用性能

本文档介绍如何设置和使用 Cloud Profiler。下载示例 Go 程序,在启用性能剖析功能后运行该程序,然后使用 Profiler 界面浏览捕获的数据。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  4. 启用所需的 API。

    启用 API

  5. 如需打开 Cloud Shell,请点击 Google Cloud 控制台工具栏中的激活 Cloud Shell

    激活 Cloud Shell。

    片刻之后,Google Cloud 控制台内会打开一个 Cloud Shell 会话:

    Cloud Shell 会话。

获取要执行性能剖析的程序

示例程序 main.go 位于 GitHub 上的 golang-samples 代码库中。如需获取该程序,请检索示例 Go 软件包:

git clone https://github.com/GoogleCloudPlatform/golang-samples.git

软件包检索需要一些时间才能完成。

剖析代码的性能

转到检索到的软件包中用于 Profiler 的示例代码目录:

cd golang-samples/profiler/profiler_quickstart

main.go 程序将创建一个 CPU 密集型工作负载,为 Profiler 提供数据。启动程序并使其保持运行状态:

 go run main.go

此程序设计为在运行时加载 CPU。它已配置为使用 Profiler,Profiler 会在程序运行时从中收集性能剖析数据,然后定期保存。

启动程序几秒钟后,您会看到消息 profiler has started。大约一分钟后,会显示另外两条消息:

 successfully created profile CPU
 start uploading profile

这些消息表示性能剖析文件已创建并上传到 Cloud Storage 项目。程序只要还在运行,就会持续发出上两条消息,大约每分钟一次。

如果在启动服务后收到没有权限错误消息,请参阅 Google Cloud 项目配置错误

Profiler 界面

您启动应用后,Profiler 很快就会显示初始性能剖析数据。该界面提供了一系列控件和一个火焰图,供您浏览性能剖析数据:

包含示例代码的 Profiler 界面。

除了时间控件之外,您还可以通过选项选择要使用的性能剖析数据集。在对多个应用进行性能剖析时,您可以使用服务来选择性能剖析数据的来源。性能剖析类型用于选择要显示的性能剖析数据的类型。借助地区名称版本,您可以只显示来自特定 Compute Engine 地区或特定应用版本的数据。借助权重,您可以选择资源使用高峰期捕获的性能剖析文件。

如需优化火焰图显示您选择分析的性能剖析文件的方式,请添加过滤条件。在上面的屏幕截图中,过滤栏 显示了一个过滤条件。此过滤条件选项是 Metric,过滤条件值是 CPU time

浏览数据

火焰图显示程序的调用堆栈。火焰图使用帧来表示每个函数。帧的宽度表示该函数的资源耗用比例。 顶层帧表示整个程序。这个帧始终显示所有资源耗用量,还会列出此图对多少性能剖析文件求取了平均值。

示例程序并未包含一组复杂的调用堆栈;上一屏幕截图中显示了 5 个帧:

  • 灰色帧表示整个可执行服务,包含所有被耗用的资源。
  • 绿色 main 帧是 Go runtime.main
  • 橙色 main 帧是示例程序的 main 例程。
  • 橙色 busyloop 帧是从示例的 main 中调用的例程。
  • 橙色 main.load 帧是从示例的 main 中调用的例程。

借助过滤条件选择器,您可以执行一些操作,如过滤掉与某个名称匹配的函数。例如,如果存在标准的实用函数库,则可以从图中移除它们。您还可以移除通过某种方法生成的调用堆栈或者使用其他方式简化火焰图。 main.go 应用很简单,因此可过滤掉的内容不多。

即使对于简单的应用,您也可以借助过滤条件隐藏不感兴趣的帧,以便更清楚地查看感兴趣的帧。例如,在示例代码的性能剖析屏幕截图中,灰色帧略大于其下方的第一个 main 帧。为什么?是不是发生了其他一些变化,但由于 main 调用堆栈耗用了绝大部分资源,这些变化未能立即显现出来?如需了解在应用的 main 例程外部发生的状况,请添加一个隐藏 main 例程的调用堆栈的过滤条件。只有 0.227% 的资源消耗是在 main 外部发生的:

示例程序中的隐藏堆栈。

如需详细了解过滤以及探索性能剖析数据的其他方法,请参阅选择要分析的性能剖析文件

后续步骤

如需了解性能剖析的一般信息,请参阅以下文档:

如需了解如何运行 Cloud Profiler 代理,请参阅: