问题标签 [google-perftools]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2411 浏览

profiling - 带有堆分析的 google-perftools/pprof 格式

google-perftools 包中有一个 pprof 实用程序。将配置文件从 google-perftools cpuprofiler 和 heapprofiler 转换为漂亮图像的实用工具:如https://github.com/gperftools/gperftools/tree/master/doc/pprof-test-big.gifhttps://github .com/gperftools/gperftools/tree/master/doc/heap-example1.png

pprof 输入文件的格式在此处针对 cpu 配置文件进行了描述:https ://github.com/gperftools/gperftools/tree/master/doc/cpuprofile-fileformat.html

但是heap profilesvn中没有描述输入文件的格式。

什么是“堆分析”格式以及如何从我的代码生成这样的文件?我已经可以生成 cpuprofiler 格式,所以我感兴趣的是两种格式之间的区别。

0 投票
1 回答
594 浏览

c++ - 替代适用于 64 位 Linux 的 googleperf 工具

你们中的一些人可能知道 Google 提供了许多免费的用于分析 c++ 代码的工具: http ://code.google.com/p/google-perftools/

问题是在 64 位上显然存在一些 libunwind 问题,作者无法做任何事情来解决它(

但我预计不会很快修复:这取决于 libc 人员和 libunwind 人员解决一些锁定问题。不幸的是,我们自己无能为力。

),所以我正在寻找替代品。是否有任何类似的工具可以提供分析数据的酷图形表示(例如在此处输入图像描述:)

)

编辑:从解释问题的自述文件中粘贴:

2) 在 x86-64 64 位系统上,虽然 tcmalloc 本身工作正常,但 cpu-profiler 工具并不可靠:它有时会工作,但有时会导致段错误。我将首先解释问题,然后是一些解决方法。

请注意,这只影响 cpu-profiler,这是一个 google-perftools 功能,您必须通过设置 CPUPROFILE 环境变量手动打开。如果您不打开 cpu-profiling,您应该不会看到任何由于 perftools 而导致的崩溃。

血淋淋的细节:根本问题出在 backtrace() 函数中,它是 libc 中的内置函数。回溯在正常情况下相当简单,但在必须回溯信号帧时可能会遇到问题。不幸的是,cpu-profiler 使用信号来注册分析事件,因此分析器所做的每个回溯都会跨越一个信号帧。

根据我们的经验,唯一出现问题的情况是信号在 pthread_mutex_lock 中间触发时。pthread_mutex_lock 从系统库中调用了很多,特别是在程序启动和创建新线程时。

解决方案:dwarf 调试格式支持“cfi annotations”,这使得识别信号帧变得容易。一些操作系统发行版,例如 Fedora 和 gentoo 2007.0,已经在它们的 libc 中添加了 cfi 注释。未来版本的 libunwind 应该能够识别这些注释;这些系统不应出现任何崩溃。

解决方法:如果您在运行 cpu-profiler 时发现崩溃问题,请考虑将 ProfilerStart()/ProfilerStop() 插入到您的代码中,而不是设置 CPUPROFILE。这将只分析代码库的那些部分。虽然我们没有做太多测试,但理论上这应该通过将信号生成限制在代码库的一小部分来减少崩溃的机会。理想情况下,您不会在生成新线程的代码周围使用 ProfilerStart()/ProfilerStop(),否则可能会导致调用 pthread_mutex_lock!

--- 2011 年 5 月 17 日

0 投票
2 回答
351 浏览

c++ - pprof 告诉我 getaliasbyname_r() 占用了 56% 的 cpu 时间?

google-perftools用来分析我用 C++ 编写并用 g++4.5.2 编译的程序。pprof告诉我getaliasbyname_r()占用了56%的cpu时间!到底是做什么的getaliasbyname_r()?为什么需要这么多cpu时间?有没有办法缓解这个问题?谢谢。编译标志是:-O3 -DNDEBUG -Wall -Wno-deprecated -Wno-sign-compare. 系统:ubuntu 11.04。

很抱歉没有把问题说清楚。我没有在我的代码中直接使用 getaliasbyname_r() 。在分析工具“pprof”生成的调用图中,我可以看到树“ start--> _libc_start_main-->main-->...”占 cputime 的大约 44%。除了这棵大树,调用图中还有另一棵孤立的单节点树——getaliasbyname_r。如图所示,它没有调用,也没有被任何其他函数调用。我用谷歌搜索了这个功能并被引导到http://linux.die.net/man/3/getaliasbyname_r。但这并没有太大帮助。我仍然不知道如何调用 getaliasbyname_r() 以及为什么需要这么多 cputime。这个问题现在有意义吗?

回复阿德里安:谢谢您的回复。总运行时间约为 28 秒。分析器以 100/秒的速率采样。所以总共有大约2800个样本。getaliasbyname_r() 中掉了大约 1500 个,想出了一个我写的函数(捕获了大约 450 个样本)。

0 投票
1 回答
1347 浏览

python - 使用 google-perftools 编译 Python 2.7.2

我有一个 debian 挤压操作系统(64 位)。我想将 python 与 google-perftools 一起使用。为此,我使用选项“-lctmalloc”编译了自己的 python 2.72。但我得到的错误很少。

  1. 我安装了 libuwind,因为 google-perftool 在使用 64 位时要求提供此软件包
  2. 我安装了所有需要的软件包:

脚步:

这就是我得到的:

当我在没有 CFLAGS='-ltcmalloc' 的情况下做同样的事情时,我真的不明白这个错误,我能够编译。谢谢您的帮助。

0 投票
1 回答
285 浏览

ruby-on-rails - 为什么 Kernel#require 占用了我 45% 的获取时间?

为了加快我的测试套件的速度,我对其进行了分析并得到了以下信息

从这个答案为什么 Kernel#require 占用了我的应用程序资源的这么大块?这似乎是意料之中的,但我对这里的巨大数字感到非常惊讶。这是真的吗?我们不能做点什么吗?

0 投票
1 回答
1985 浏览

ruby-on-rails - 如何使用 perftools 和 bundler 分析 RSpec?

我需要分析我通常运行的测试套件bundle exec rspec spec/并生成 GIF 图像。

运行perftools.rb以使其与捆绑程序正常工作的命令是什么?

0 投票
1 回答
778 浏览

ruby - 通过代理安装 perftools.rb

sudo gem install perftools.rb -p http://10.10.10.10:3128 ...

/usr/local/lib/ruby/1.9.1/net/http.rb:762:in "initialize": 连接被拒绝 - connect(2) (Errno::ECONNREFUSED)

...

请求http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p0.tar.gz

完整留言:

似乎从源代码编译需要 ruby​​ 源代码,它尝试直接从 ruby​​ 站点下载它。如何通过 http 代理安装 perftools.rb?

0 投票
1 回答
879 浏览

memory - 为什么会发生这个 tcmalloc 错误 SbrkSysAllocator failed ?

我在我的 c++ 程序中使用 google-perftools 的 tcmalloc_minimal 作为默认内存分配器。它打印出以下信息:

程序继续运行。有关系吗?

0 投票
2 回答
3126 浏览

c++ - MacOSX 上 Google Perftools CPU 分析器中的行号

我正在尝试在 MacOSX 上分析一些 C++ 程序。所以我构建google-perftools,编写了一个程序,使用 MacPorts g++ 4.7 编译,带有-g编译器标志,并链接到libprofiler. 然后我跑了:

然后我运行 pprof 来生成输出:

看起来 perftools 不会将地址转换为函数名称。

有谁知道我在这里想念什么?我应该怎么做才能让分析器生成正确的结果。

编辑:更多信息:这不是 pprof 或 google-perftools 的问题,而是更多类似 gcc 或 macosx 的问题,因为 Instrument.app 还显示地址而不是行号。我不熟悉调试符号在 Mac OS X 下是如何工作的,所以我宁愿认为它是我在这里遗漏的东西,而不是 gcc 或 Mac OS X 中的错误。我想知道是否有人可以提供一些关于调试信息如何工作的提示适用于 Mac OS X。

0 投票
0 回答
266 浏览

google-perftools - 谷歌 CPU 分析器错误:堆栈跟踪深度 >=2**32

我正在尝试使用 google CPU perf 工具分析我的程序,但是当我尝试分析 .prof 文件时,我收到如下错误:

一开始我想可能是它试图分析太多调用,所以我减少了程序运行的长度(基于时间步长,很容易缩短运行时间),但我仍然遇到同样的错误。任何解决此问题的帮助将不胜感激。