问题标签 [gperftools]
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.
c++ - 在 Boost.Python 中使用 gperftools
我正在尝试追踪我使用 Boost.Python 在 C++ 中编写的 Python 扩展中的内存泄漏。我试图使用gperftools。但是,它似乎根本不能很好地与 Python 配合使用。
这是一个简单的例子,我要公开std::vector<int>
:
如果我按照建议编译该模块-ltcmalloc
,那么即使是简单的迭代也会崩溃:
调用堆栈点在这里:
我怀疑这是因为 gperftools 没有处理在 python 中一直抛出异常的事实,这是意料之中的。有没有人有使用 gperftools 来追踪这样的泄漏的经验?
这甚至可能吗,还是我基本上只是卡住了?
google-perftools - gperftools 如何在后台工作?
我正在寻找gperftools如何工作的简单解释。到目前为止,这是我学到的:
- 它运行一个停止世界的采样器。换句话说,它会定期停止正在分析的程序以收集信息。
- Golang 的 pprof 库在下面使用 gperftools。
除了一般概述之外,还有一些我想回答的具体问题:
- gperftools 是“基于事件的分析器”还是“检测分析器”。据我了解,这些分析器通过这些修改修改程序运行和收集样本的方式
- gperftools 配置文件在操作系统的哪个“级别”?它是否像SystemTap或perf那样分析内核?
- gperftools 在高流量生产服务器上运行是否安全?
我问这个问题是为了解释在 Go 服务器上使用 pprof 引入的开销。
cpython - gperftools 无法识别文件
有没有办法避免 Google 性能工具将文件列为“??:?”,即无法找到包含它报告的功能的文件?如何确定哪个库包含被调用的函数?
我的目标是能够在具有许多已编译 C 扩展模块的 python 包中分析 C 代码。在上面的玩具示例中,我将如何追踪“dtrsm_”的定义位置?如果有多个加载的库包含具有相同名称的函数,有没有办法判断正在调用哪个版本?
c++ - tcmalloc 巨大的性能差异
我们的多线程服务器有数百个连接线程,负责处理 IO 并回复传入的请求。
还有另一个异步线程运行相对繁重的任务,不时分配很多(比如每隔几秒)。
一旦我将该线程转换为一个小线程池(即,这些任务现在每次都从不同的线程运行),我们的服务器通常具有相同的 CPU 使用率,但它可能会突然达到这样的状态,即所有操作的分配需要更多时间并且整体 CPU服务器的使用率几乎翻了一番,从 2 核增加到 3.7 核。
到目前为止,我的主要理论是我以某种方式更改了 tcmalloc 库的访问模式,这会导致随机 CPU 提升。为了证实这个理论,我应该在 tcmalloc stats 中查看什么?现在从不同线程(但不是同时)运行的相同代码是否会导致 tcmalloc 从中央缓存中分配比从线程缓存中分配更多?
r - 在 gperftools 中获取 R 包的调用层次结构
我可以使用 gperftools 来生成调用图,例如这个问题。
现在我想bind_rows()
在dplyr
R 包中获取一个调用图,以便追踪这个错误。
我编译了两者R
并dplyr
使用CPP/CXXFLAGS=-g -fvar-tracking-assignments
and LDFLAGS=-lprofiler -lunwind
。
当我运行以下命令时:
我得到的是:
如何获取调用层次结构,以便知道dplyr
绑定行文件中的哪个调用是瓶颈?
编辑:似乎该--focus
选项是我在这里需要的。但是如何将它连接到RecursiveRelease
?
编辑:用 重新编译 Rcpp 并-g
与 链接后-lprofiler
,我可以得到以下信息: flame.svg,其中 8% 获得了良好的堆栈跟踪,但大部分仍然没有。-lprofiler
这可能是因为某些库是在没有支持加载的
ubuntu - tcmalloc 不能在 ubuntu 上使用 -ltcmalloc_minimal
我使用 apt-get install libtcmalloc-minimal4 在 Ubuntu 14.0 上安装了 tcmalloc
我做了以下步骤:
ln -s libtcmalloc_minimal.so.4.1.2 libtcmalloc_minimal.so
将我的可执行文件与 -ltcmalloc_minimal 链接
运行代码后,我看不到任何性能差异。
我尝试使用 HEAPCHECK 运行以检查是否正在使用 tcmalloc,但没有发现任何与 HEAPCHECK 相关的警告。
我的程序包含 malloc 调用和 openMP。还有什么我需要做的吗?如何检查以确保我的程序正在使用 tcmalloc?
c++ - 我已经设置了 CPUPROFILE 环境变量并链接了 -lprofiler。为什么 gperftools 没有启动分析器?
根据gperftools 文档,可以使用以下任何方法启动分析器:
- 将
CPUPROFILE
环境变量设置为配置文件信息将保存到的文件名 - 执行上述操作,并设置
CPUPROFILESIGNAL
和发送适当的信号以启动或停止采样。 - 直接从您的
ProfilerStart(filename)
代码调用ProfileStop()
这三种方法也需要libprofiler.so
链接。
当我尝试这个时,第三种方法有效,但是当我只是 set 时CPUPROFILE
,没有生成分析信息。
不工作:
是否有效:
请注意,CPUPROFILE
正在读取它,因为它的值会覆盖传递给ProfileStart()
if 设置的文件名。
c++ - 取消定义对 tcmalloc 公共 API 的引用
我已经克隆了 google-perf git 树。
上述所有步骤均成功。我可以在 /usr/include/gperftools/tcmalloc.h 等中看到头文件
我的程序
汇编
如果我注释掉 GetStats 行,那么编译工作正常。所以我假设它与 tcmalloc 链接。但是,当我尝试访问 API 时,它给了我一个错误。
可能是什么问题呢?也许有什么想法?
c++ - 无法分析库中的线程
我正在尝试使用Google Performance Tools,特别是 64 位 Ubuntu 14.04 存储库中的官方版本,来调试应用程序及其相关.so
库。
以最小的更改运行,只需确保-g
已设置,即可获得跟踪信息,但主可执行文件中只有几个符号。按照相当少的文档中的建议添加ProfilerRegisterThread()
到库中的线程实际上会使事情变得更糟,输出的符号更少,只有十六进制地址。
如何正确地分析库中的线程?
c++ - 尝试与 tcmalloc 链接时出现 LNK2005 错误
我试图在 Visual Studio 2013 中使用 tcmalloc 编译一个项目。我已经从gperftools
包中编译了 libtcmalloc 的 .lib 文件,并将 libtcmalloc.lib 添加到链接器输入选项中。
当我尝试构建我的项目时,我收到以下错误:
如果我从链接器选项中删除 libtcmalloc.lib,项目编译得很好..