简短版:
Linux有好用的基于时间的采样分析器吗?
详细版:
通常我使用OProfile来优化我的应用程序。最近我发现了一个小问题,这让我想知道。
问题是一个紧密的循环,调用c++filt来还原C++名称。而我只是偶然发现了这段代码,当时我在追踪另一个瓶颈。OProfile并没有显示出这段代码有什么异常,所以我几乎忽略了它,但我的代码感觉告诉我要优化这个调用并查看结果。我将popen
调用更改为abi::__cxa_demangle
,运行时间从一分钟多减少到了一秒多。大约提高了60倍的速度。
我能否通过配置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使用率时才有用。它无法帮助具有低效阻塞调用的可执行文件。