随着运行时提供更多功能,我们经常观察到程序的性能分析主要由运行时函数组成。例如,这是来自blog.google.com/profiling-go-programs文章(但使用go1.9编译)的程序的CPU性能分析。我用紫色高亮显示了运行时函数帧。即使对于更复杂的程序,我们也期望至少四分之一的性能分析CPU时间与运行时相关。
这对于分析与运行时相关的性能问题非常有用。然而,通常情况下,它会分散用户关注应用程序逻辑的注意力。另一方面,Go运行时提供了各种功能(调度、GC、Map、同步等),在不了解运行时实现的情况下,仍然很难回答诸如以下问题:
- GC花费了多少CPU时间?
- map操作花费了多少CPU时间?
Go 1.9引入了profiler标签,允许用户为性能样本添加标签。
(http://tip.golang.org/doc/go1.9#pprof-labels)
用户可以根据标签对样本进行聚合或过滤(例如RPC方法、用户、操作模式等)。
同样,我建议根据函数的角色为运行时函数添加标签,以便更方便地进行聚合和分析涉及运行时的成本。标签是运行时开发人员整理的运行时函数分组。从实现的Angular 来看,它不一定必须使用与profiler标签类似的机制。相反,当构建pprof proto时,它可以检查运行时函数的存在并基于它们进行标记。
注意1:讨论的替代方法是根据提供的特性命名运行时函数(例如,所有与GC相关的函数都应该以GC或gc为前缀等),用户使用它们来过滤或隐藏使用pprof选项。这不如标签好,并且需要用户付出更多的努力才能正确使用。另一种提到的方法是在发布或可视化性能分析时过滤掉不感兴趣的帧。这并不理想,因为有时我们希望看到详细信息,而且“不感兴趣”的函数列表可能会随着时间的推移而改变。
注意2:我们可以设想pprof识别运行时标签,并为每个组呈现聚合框,而不是详细的运行时调用图,除非要求显示详细的运行时调用图。
3条答案
按热度按时间af7jpaap1#
太棒了。希望Go团队的某人能尽快回复。
7eumitmz2#
@AlekSi, @hyangah在Go团队。
dkqlctbz3#
Github应该添加🤦♂️表情,这样我就可以不用写另一条评论来添加它了。