gperftools 不精确与 CPUPROFILE_FREQUENCY

Posted

技术标签:

【中文标题】gperftools 不精确与 CPUPROFILE_FREQUENCY【英文标题】:gperftools inexactitudes with CPUPROFILE_FREQUENCY 【发布时间】:2013-12-10 13:53:39 【问题描述】:

我有一个似乎无法使用gprof 的任务。 Callgrind 在这里帮了很多忙,但是当找到更多gprof-like 的解决方案时,我。例如,gperftools,潜入其中尝试一下。

所以我编写了一个虚拟程序并进行了几次类似这样的试验:

0:10:1386682334:user@host:~$ time gcc test.c -o test -lprofiler -Lgperftools-2.
1/.libs/ -g

real    0m0.085s
user    0m0.048s
sys     0m0.032s
0:11:1386682357:user@host:~$ time CPUPROFILE_FREQUENCY=50 CPUPROFILE=~
/test_profile LD_LIBRARY_PATH=~/gperftools-2.1/.libs/ ./test && ~/gperftools-2.
1/src/pprof test test_profile --text

PROFILE: interrupts/evictions/bytes = 14/0/216

real    0m7.157s
user    0m0.008s
sys     0m0.672s
Using local file test.
Using local file test_profile.
Removing killpg from all stack traces.
Removing do_system from all stack traces.
Total: 14 samples
      14 100.0% 100.0%       14 100.0% do_system
       0   0.0% 100.0%       14 100.0% __libc_start_main
       0   0.0% 100.0%       14 100.0% _start
       0   0.0% 100.0%        2  14.3% bar
       0   0.0% 100.0%       14 100.0% foo
       0   0.0% 100.0%       14 100.0% main
0:12:1386682465:user@host:~$ time CPUPROFILE_FREQUENCY=50000 CPUPROFIL
E=~/test_profile LD_LIBRARY_PATH=~/gperftools-2.1/.libs/ ./test && ~/gperftools
-2.1/src/pprof test test_profile --text

PROFILE: interrupts/evictions/bytes = 80/0/520

real    0m7.199s
user    0m0.016s
sys     0m0.704s
Using local file test.
Using local file test_profile.
Removing killpg from all stack traces.
Total: 80 samples
      78  97.5%  97.5%       79  98.8% do_system
       1   1.2%  98.8%        1   1.2% __find_specmb
       1   1.2% 100.0%        1   1.2% __libc_waitpid
       0   0.0% 100.0%        1   1.2% _IO_vfprintf_internal
       0   0.0% 100.0%       80 100.0% __libc_start_main
       0   0.0% 100.0%        1   1.2% __printf
       0   0.0% 100.0%       80 100.0% _start
       0   0.0% 100.0%       27  33.8% bar
       0   0.0% 100.0%       79  98.8% foo
       0   0.0% 100.0%       80 100.0% main

CPUPROFILE_FREQUENCY 记录 here 默认为 100,并且是 cpu-profiler 采样的每秒中断次数。在 7 秒的虚拟程序上将其设置为 50 时仅采样 14 次,而将其设置为 50000 时仅采样 80 次,我感到很陌生。

我想知道这个简单的环境更改是否可以在需要时获得更高的精度,以及 gperftools 中的 CPUPROFILE_FREQUENCY 是否损坏。

【问题讨论】:

【参考方案1】:

您的程序只有 0.008 秒到 0.048 秒的用户执行时间。分析器仅分析用户空间执行所花费的时间,因此我认为您的结果是预期的。

尝试运行一个花费 7 秒进行实际计算的虚拟程序。例如,计算阿克曼函数。

【讨论】:

我做到了,似乎具有该 git head 配置的主机每秒最多可以采样 250 次,这暂时节省了我。

以上是关于gperftools 不精确与 CPUPROFILE_FREQUENCY的主要内容,如果未能解决你的问题,请参考以下文章

让 gperftools 与 Rcpp 一起工作

gperftools尝试

cmake:无法链接到谷歌分析器(gperftools)

gperftools优化nginx(内存)

堆状态分析的利器——gperftools的Heap Profiler

使用带有排序的 gperftools 时分析计时器已过期