这是一篇翻译文章,我选择翻译它,一方面是给有需要的人看,另一方面也是为了我强化理解它以及实践它。
在尝试使用 Google 翻译到一半的时候,我顺手 Google 了一下,又看到了 Linux.cn 的翻译,本文也有借鉴,再次表示感谢。
如果你在使用 Go 开发程序,并且你们又发布在 GCP 上的,那么本文将会对你分析程序是一个很好的补充。
Google 最有趣的部分之一就是我们规模庞大的持续分析服务。我们可以看到谁在使用 CPU 和内存,我们可以持续地监控我们的生产服务以争用和阻止 profile ,并且我们可以生成分析和报告,并轻松地告诉我们可以进行哪些有重要影响的优化。
我简单研究了 Stackdriver Profiler,这是我们的新产品,它填补了针对云端用户在云服务范围内分析服务的空白。请注意,你无需在 Google 云平台上运行你的代码即可使用它。实际上,我现在每天都在开发时使用它。它也支持 Java 和 Node.js。
生产环境中分析
pprof 可安全地用于生产。我们针对 CPU 和堆分配分析会额外增加 5% 的开销。一个实例中每分钟收集 10 秒。如果你有一个 Kubernetes Pod 的多个副本,我们确保进行分摊收集。例如,如果你拥有一个 pod 的 10 个副本,那么开销将变为 0.5%。这使用户可以持续保持分析。
我们目前支持 Go 程序的 CPU,堆,互斥和线程分析。
为什么?
在解释如何在生产中使用分析器之前,先解释为什么你想要在生产中进行分析将对你有所帮助。
一些非常常见的情况是:
- 调试仅在生产环境中可见的性能问题;
- 了解 CPU 使用率以减少费用;
- 了解争用的累积和优化的地方;
- 了解新版本的影响,例如看到灰度和线上之间的区别;
- 通过关联分析样本以了解延迟的根本原因来丰富你的分布式经验;
启用
Stackdriver Profiler 不能与 net/http/pprof 处理程序一起使用,并要求你在程序中安装和配置一个一行的代理。
go get cloud.google.com/go/profiler
在你的主函数中,启动分析器:
|
|
一旦你开始运行你的程序,profiler 软件包将每分钟报告给分析器 10 秒钟。
可视化
当分析被报告给后端后,你将在 https://console.cloud.google.com/profiler 上看到火焰图。你可以按标签过滤并更改时间范围,也可以按服务名称和版本进行细分。数据将会长达 30 天。
你可以选择其中一个可用的来分析,按服务,区域和版本分解,你可以在火焰中移动并通过标签进行过滤。
阅读火焰图
Brendan Gregg 非常全面地解释了火焰图可视化。Stackdriver Profiler 增加了一点它自己的特点。
我们将查看一个 CPU 分析,但这也适用于其他分析。
- 最上面的 x 轴表示整个程序。火焰上的每个框表示调用路径上的一帧。框的宽度与执行该函数花费的 CPU 时间成正比。
- 框从左到右排序,左边是花费最多的调用路径。
- 来自同一包的帧具有相同的颜色。这里所有运行时功能均以绿色表示。
- 你可以单击任何框进一步展开执行树。
你可以将鼠标悬停在任何框上查看任何帧的详细信息。
过滤
你可以显示、隐藏和高亮符号名称。如果你特别想了解某个特定调用或包的消耗,这些信息非常有用。
- 选择你的过滤器。你可以组合多个过滤器。在这里,我们将高亮显示 runtime.memmove 。
- 火焰将使用过滤器过滤帧并可视化过滤后的框。在这种情况下,它高亮显示所有 runtime.memmove 框。
参考资料
茶歇驿站
一个可以让你停下来看一看,在茶歇之余给你帮助的小站,这里的内容主要是后端技术,个人管理,团队管理,以及其他个人杂想。