基于Linux时间样本的分析器

时间:2010-03-15 17:34:28

标签: c++ profiling popen oprofile

简短版本:

Linux的采样分析器是否适合使用?

长版:

我通常使用OProfile来优化我的应用程序。我最近发现了一个让我感到疑惑的缺点。

问题是紧密循环,产生c ++ filt来解码c ++名称。在追逐另一个瓶颈时,我偶然偶然发现了代码。 OProfile没有显示代码的任何异常,所以我几乎忽略了它,但我的代码意识告诉我优化调用,看看发生了什么。我将c ++ filt的popen更改为abi::__cxa_demangle。运行时间从一分多钟到一秒多一点。大约x60加速。

我有没有办法配置OProfile来标记popen来电?现在,OProfile认为瓶颈是堆和std::string调用(BTW曾经优化后将运行时间降低到不到一秒,超过x2加速)。

这是我的OProfile配置:

$ sudo opcontrol --status
Daemon not running
Event 0: CPU_CLK_UNHALTED:90000:0:1:1
Separate options: library
vmlinux file: none
Image filter: /path/to/executable
Call-graph depth: 7
Buffer size: 65536

是否有另一个可以找到瓶颈的Linux探查器?

我怀疑问题是OProfile只将其样本记录到当前正在运行的进程中。我希望它始终将其样本记录到我正在分析的过程中。因此,如果当前流程已被切换(阻止IO或popen调用),OProfile只会将其样本置于阻塞的调用中。

如果我无法修复此问题,OProfile仅在可执行文件接近100%CPU时才有用。它无法帮助阻塞调用效率低下的可执行文件。

5 个答案:

答案 0 :(得分:6)

很高兴你问道。我相信OProfile可以做我认为正确的事情,即在程序缓慢时将挂起时间上的堆栈样本,如果它不会让你检查个体堆栈样本,至少汇总出现在样本上的每行代码,该行出现的样本百分比。这是一个直接衡量,如果那条线不存在,将会保存什么。 Here's one discussion. Here's another,another。并且,正如保罗所说,Zoom应该这样做。

如果您的时间从60秒增加到1秒,这意味着每个堆栈样本都有59/60的概率向您显示问题。

答案 1 :(得分:3)

尝试Zoom - 我相信它会让您对所有流程进行分析 - 在这种情况下,知道它是否突出显示您的问题会很有趣。

答案 2 :(得分:2)

我很久以前写过这篇文章,只是因为我找不到更好的东西:https://github.com/dicej/profile

我也发现了这一点,虽然我还没有尝试过:https://github.com/oliver/ptrace-sampler

答案 3 :(得分:1)

快速攻击Linux的简单采样分析器:http://vi-server.org/vi/simple_sampling_profiler.html

它将backtrace(3)附加到SIGUSR1上的文件,然后将其转换为带注释的来源。

答案 4 :(得分:0)

尝试了这里建议的所有内容之后(除了现已失效的Zoom,它仍然可以从Dropbox中以大文件形式获取),我发现NOTHING可以执行Dunlavey先生的建议。上面在某些答案中列出的“快速黑客”对我来说不会建立,或者对我也不起作用。花了整整一天的时间尝试...在以其他方式受I / O约束的简单测试程序中,没有什么可以找到fseek作为热点的。

因此,我这次基于GDB编写了另一个没有构建依赖项的探查器,因此它几乎可以对所有可调试代码“起作用”。一个CPP文件。

https://github.com/jasonrohrer/wallClockProfiler

它使Dunlavey先生建议的手动过程自动化,使用GDB定期中断目标过程并收集堆栈跟踪,然后在最后打印一份报告,指出最常见的堆栈跟踪。这些才是您真正的挂钟热点。它确实有效。