标签

然而,自从我们发布了我们的 之后,收到了很多工程师的反馈,发现许多工程师不知道如何去分析, 或者不知道分析能给他们带来什么好处。这篇文章主要剖析 pprof 标签,并会结合一些 Go 的示例代码去分析。

基础

pprof 标签只支持 Go 的 CPU 分析器。Go 的分析器是抽样分析,这意味着它只会根据特定的频率(默认是 1 秒钟 100 次)去获取执行中函数的调用栈并记录。简单来说,开发者如果使用标签,在分析器取样时就可以将函数的调用栈进行区分,然后只聚合具有相同标签的函数调用栈。

runtime/pprof

进阶

为了进行演示如何使用 pprof 标签,我们创建了一个包含许多示例的仓库,这个示例仓库代码作为这篇文章的内容指导。仓库地址:https://github.com/polarsignals/pprof-labels-example

tanantiteratetanant1tanant2./cpuprofile.pb.gz

为了演示如何在 pprof 的分析日志中展示 pprof 标签,用 来打印每次抽样函数调用栈以及样本值,还有收集到样本的标签。

如果我们注释掉 ,我们将无法进行标签检测,运行 代码,让我们看看没有标签的抽样分析结果:

CPU 分析数据的单位是 纳秒,所以这些抽样总共花费时间是 2.79 秒(2540000000ns + 250000000ns = 2790000000ns = 2.79s)。

iterate
iteratetenanttenant1

让我们看看抽样的原始日志(还有它们的元数据),去更深入理解一下它们的格式:

locationprintprofile.godefault_sample_type

最后,因为用标签去区分数据,我们可以让可视化界面更直观。

你可以在 Polar Signals 网站去更详细的了解上面的这次分析:https://share.polarsignals.com/2063c5c/。

结论

pprof 标签是帮助我们理解程序不同执行路径非常有用的方法,许多人喜欢在多租户系统中使用它们,目的就是为了能够定位在他们系统中出现的由某一个租户导致的性能问题。就像开头说的,只需要调用 就可以了。

Polar Signals 提供的持续分析工具也支持了 pprof 标签的可视化界面和报告,如果你想参与个人体验版请点击:。


本文由 原创编译, 荣誉推出