12

精简版:

Linux 是否有一个好的基于时间的采样分析器?

长版:

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

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

有没有办法我可以配置 OProfile 来标记popen呼叫?由于配置文件数据现在存在,OProfile 认为瓶颈是堆和std::string调用(顺便说一句,它曾经优化过将运行时间降低到不到一秒,超过 2 倍加速)。

这是我的 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 时才有用。对于阻塞调用效率低下的可执行文件,它无济于事。

4

5 回答 5

6

很高兴你问。我相信 OProfile 可以做我认为正确的事情,即在程序运行缓慢时在挂钟时间获取堆栈样本,如果它不允许您检查单个堆栈样本,至少总结一下出现在样本上的每一行代码,该行出现在样本上的百分比。这是一个直接衡量如果没有那条线会保存什么。这是一个讨论。 这是另一个另一个。而且,正如保罗所说,Zoom 应该这样做。

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

于 2010-03-15T18:55:42.043 回答
3

试试Zoom——我相信它可以让你分析所有流程——在这种情况下它是否能突出你的问题会很有趣。

于 2010-03-15T18:57:16.870 回答
2

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

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

于 2014-04-04T22:29:34.943 回答
1

快速破解 linux 的简单采样分析器:http: //vi-server.org/vi/simple_sampling_profiler.html

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

于 2010-10-22T02:24:03.303 回答
1

在尝试了这里建议的所有内容后(除了现已失效的 Zoom,它仍然可以从保管箱中以大文件的形式使用),我发现没有任何东西符合邓拉维先生的建议。上面列出的一些答案中的“快速技巧”对我没有用,或者对我也不起作用。花了一整天的时间尝试一些东西……在一个受 I/O 限制的简单测试程序中,没有什么可以找到 fseek 作为热点。

所以我编写了另一个分析器,这一次没有构建依赖项,基于 GDB,所以它应该对几乎所有可调试代码都“正常工作”。单个 CPP 文件。

https://github.com/jasonrohrer/wallClockProfiler

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

于 2019-01-22T06:17:50.020 回答