基于Linux时间样本的分析器

def*_*ode 12 c++ profiling popen oprofile

精简版:

是否有适合Linux的基于良好时间的采样分析器?

长版:

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

问题是紧密循环,产生c ++ filt来解码c ++名称.在追逐另一个瓶颈时,我偶然偶然发现了代码.OProfile没有显示代码的任何异常,所以我几乎忽略了它,但我的代码意识告诉我优化调用,看看发生了什么.我将popenc ++ filt 更改为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
Run Code Online (Sandbox Code Playgroud)

还有另一个Linux的分析器可能找到了瓶颈吗?

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

如果我无法修复此问题,OProfile仅在可执行文件接近100%CPU时才有用.它对于具有低效阻塞调用的可执行文件无能为力.

Mik*_*vey 6

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

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

  • ...我忘了提,**lsstack**是一种简单的方法来手动获取堆栈样本,就像**pstack**(但没有符号). (2认同)