衡量应用性能
本文档介绍如何设置和使用 Cloud Profiler。您使用 Cloud Shell 下载示例 Go 程序,在启用性能分析功能后运行该程序,然后使用 Profiler 界面浏览捕获的数据。
如果您计划对在 Google Cloud 外部运行的应用进行性能分析,则需要执行本文档中未提及的一些配置步骤。如需了解这些步骤,请参阅剖析在 Google Cloud 外部运行的应用的性能。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the required API.
- 如需打开 Cloud Shell,请点击 Google Cloud 控制台工具栏中的激活 Cloud Shell:
片刻之后,Google Cloud 控制台内会打开一个 Cloud Shell 会话:
获取要执行性能剖析的程序
示例程序 main.go
位于 GitHub 上的 golang-samples
代码库中。如需获取该程序,请在 Cloud Shell 中运行以下命令以检索示例 Go 软件包:
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
软件包检索需要一些时间才能完成。
剖析代码的性能
在 Cloud Shell 中,前往检索到的软件包中用于 Profiler 的示例代码目录:
cd golang-samples/profiler/profiler_quickstart
main.go
程序将创建一个 CPU 密集型工作负载,为 Profiler 提供数据。在 Cloud Shell 中,运行以下命令启动程序并让其保持运行状态:
go run main.go
此程序设计为在运行时加载 CPU。它已配置为使用 Profiler,Profiler 会在程序运行时从中收集性能剖析数据,然后定期保存。
启动程序几秒钟后,您会看到消息 profiler has started
。大约一分钟后,会显示另外两条消息:
successfully created profile CPU
start uploading profile
这些消息表示性能剖析文件已创建并上传到 Cloud Storage 项目。程序只要还在运行,就会持续发出上两条消息,大约每分钟一次。
如果在启动服务后收到没有权限错误消息,请参阅 Google Cloud 项目配置错误。
Profiler 界面
您启动应用后,Profiler 很快就会显示初始性能剖析数据。该界面提供了一系列控件和一个火焰图,供您浏览性能剖析数据:
除了时间控件之外,您还可以通过选项选择要使用的性能剖析数据集。在对多个应用进行性能剖析时,您可以使用服务来选择性能剖析数据的来源。性能剖析类型用于选择要显示的性能剖析数据的类型。借助地区名称和版本,您可以只显示来自特定 Compute Engine 地区或特定应用版本的数据。借助权重,您可以选择资源使用高峰期捕获的性能剖析文件。
如需优化火焰图显示您选择分析的性能剖析文件的方式,请添加过滤条件。在上面的屏幕截图中,过滤栏 filter_list 显示了一个过滤条件。此过滤条件选项是 Metric
,过滤条件值是 CPU time
。
浏览数据
火焰图显示程序的调用堆栈。火焰图使用帧来表示每个函数。帧的宽度表示该函数的资源耗用比例。 顶层帧表示整个程序。这个帧始终显示所有资源耗用量,还会列出此图对多少性能剖析文件求取了平均值。
示例程序并未包含一组复杂的调用堆栈;上一屏幕截图中显示了 5 个帧:
- 灰色帧表示整个可执行服务,包含所有被耗用的资源。
- 绿色
main
帧是 Goruntime.main
。 - 橙色
main
帧是示例程序的main
例程。 - 橙色
busyloop
帧是从示例的main
中调用的例程。 - 橙色
main.load
帧是从示例的main
中调用的例程。
借助过滤条件选择器,您可以执行一些操作,如过滤掉与某个名称匹配的函数。例如,如果存在标准的实用函数库,则可以从图中移除它们。您还可以移除通过某种方法生成的调用堆栈或者使用其他方式简化火焰图。
main.go
应用很简单,因此可过滤掉的内容不多。
即使对于简单的应用,您也可以借助过滤条件隐藏不感兴趣的帧,以便更清楚地查看感兴趣的帧。例如,在示例代码的性能剖析屏幕截图中,灰色帧略大于其下方的第一个 main
帧。为什么?是不是发生了其他一些变化,但由于 main
调用堆栈耗用了绝大部分资源,这些变化未能立即显现出来?如需了解在应用的 main
例程外部发生的状况,请添加一个隐藏 main
例程的调用堆栈的过滤条件。只有 0.227% 的资源消耗是在 main
外部发生的:
如需详细了解过滤功能以及浏览性能剖析数据的其他方法,请参阅选择要分析的性能剖析文件。
后续步骤
如需了解性能分析的常规信息,请参阅以下文档:
- Cloud Profiler 概览
- 性能剖析相关概念
- 阅读我们关于 DevOps 的资源,并了解 DORA 的研究项目。