如何在谷歌分析器中查找 CPU 使用率
Posted
技术标签:
【中文标题】如何在谷歌分析器中查找 CPU 使用率【英文标题】:How to find CPU Usage in google profiler 【发布时间】:2011-06-03 12:39:14 【问题描述】:我正在使用 Google CPU Profiling 工具。
http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html
在文档中给出了它
分析文本输出
文本模式的输出行如下所示:
14 2.1% 17.2% 58 8.7% std::_Rb_tree::find
下面是解释列的方法:
此文件中的分析样本数 功能 分析百分比 此函数中的示例 百分比 函数中的分析样本 打印到现在 分析次数 此函数中的样本及其 被调用者 分析百分比 此函数中的样本及其 被调用者 函数名称但我无法理解哪些列告诉我函数的确切 CPU 使用率或百分比?
如何获取使用 google profile 的函数的 CPU 使用情况?
【问题讨论】:
【参考方案1】:文本模式的输出行如下所示:
会有很多行,比如collect profile:
$ CPUPROFILE=a.pprof LD_PRELOAD=./libprofiler.so ./a.out
程序a.out
和这里一样:Kcachegrind/callgrind is inaccurate for dispatcher functions?
然后用 pprof top
命令分析:
$ pprof ./a.out a.pprof
Using local file ./a.out.
Using local file a.pprof.
Welcome to pprof! For help, type 'help'.
(pprof) top
Total: 185 samples
76 41.1% 41.1% 76 41.1% do_4
51 27.6% 68.6% 51 27.6% do_3
37 20.0% 88.6% 37 20.0% do_2
21 11.4% 100.0% 21 11.4% do_1
0 0.0% 100.0% 185 100.0% __libc_start_main
0 0.0% 100.0% 185 100.0% dispatcher
0 0.0% 100.0% 34 18.4% first2
0 0.0% 100.0% 42 22.7% inner2
0 0.0% 100.0% 68 36.8% last2
0 0.0% 100.0% 185 100.0% main
那么,这里是什么:总样本数是 185;频率是默认值(每 10 毫秒 1 个样本;或每秒 100 个样本)。那么总运行时间约为 1.85 秒。
第一列是样本数,当 a.out 在给定函数中工作时获取。如果我们将它除以频率,我们将得到给定函数的总时间估计,例如do_4
运行约 0.8 秒
第二列是给定函数中的样本计数除以总计数,或此函数在总程序运行时间中的百分比。所以do_4
是最慢的函数(占程序总时间的 41%),do_1
仅占程序运行时间的 11%。我想你对这个专栏很感兴趣。
第三列是当前行和前行的总和;所以我们可以知道 2 个最慢的函数,do_4
和 do_3
总共占总运行时间的 68% (41%+27%)
第 4 列和第 5 列类似于第 1 列和第 2 列;但是这些不仅会考虑给定函数本身的样本,还会考虑从给定直接和间接调用的所有函数的样本。您可以看到,main
和从它调用的所有内容占总运行时间的 100%(因为main
是程序本身;或程序调用树的根),last2
及其子项占运行时间的 36.8%(它在我的程序中的子项是:对do_4
的一半调用和对do_3
的一半调用 = 41.1 + 27.6 /2 = 69.7/2 ~= 34% + 函数本身的一些时间)
PS:还有一些其他有用的 pprof 命令,例如 callgrind
或 gv
,它们显示了添加了分析信息的调用树的图形表示。
【讨论】:
以上是关于如何在谷歌分析器中查找 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# 中的 Nuget 包在谷歌分析中创建自定义维度和自定义指标