简短版本:
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时才有用。它无法帮助阻塞调用效率低下的可执行文件。
答案 0 :(得分:6)
如果您的时间从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定期中断目标过程并收集堆栈跟踪,然后在最后打印一份报告,指出最常见的堆栈跟踪。这些才是您真正的挂钟热点。它确实有效。