精简版:
Linux 是否有一个好的基于时间的采样分析器?
长版:
我通常使用OProfile来优化我的应用程序。我最近发现了一个让我感到疑惑的缺点。
问题是一个紧密的循环,产生了 c++filt 来破坏 c++ 名称。我只是在寻找另一个瓶颈时偶然发现了代码。OProfile 没有显示代码有任何异常,所以我几乎忽略了它,但我的代码意识告诉我优化调用并查看发生了什么。我将popen
c++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 时才有用。对于阻塞调用效率低下的可执行文件,它无济于事。