我今天试用了linux'perf实用程序,但在解释其结果时遇到了困难.我习惯了valgrind的callgrind,这当然是一种与基于采样的性能测试方法完全不同的方法.

我所做的:

perf record -g -p $(pidof someapp)
perf report -g -n

现在我看到这样的情况:

+     16.92%  kdevelop  libsqlite3.so.0.8.6               [.] 0x3fe57                                                                                                              ↑
+     10.61%  kdevelop  libQtGui.so.4.7.3                 [.] 0x81e344                                                                                                             ▮
+      7.09%  kdevelop  libc-2.14.so                      [.] 0x85804                                                                                                              ▒
+      4.96%  kdevelop  libQtGui.so.4.7.3                 [.] 0x265b69                                                                                                             ▒
+      3.50%  kdevelop  libQtCore.so.4.7.3                [.] 0x18608d                                                                                                             ▒
+      2.68%  kdevelop  libc-2.14.so                      [.] memcpy                                                                                                               ▒
+      1.15%  kdevelop  [kernel.kallsyms]                 [k] copy_user_generic_string                                                                                             ▒
+      0.90%  kdevelop  libQtGui.so.4.7.3                 [.] QTransform::translate(double, double)                                                                                ▒
+      0.88%  kdevelop  libc-2.14.so                      [.] __libc_malloc                                                                                                        ▒
+      0.85%  kdevelop  libc-2.14.so                      [.] memcpy 
...

好的,这些函数可能很慢,但是我如何找出它们是从哪里被调用的呢?由于所有这些热点都位于外部库中,我认为没有办法优化我的代码.

基本上,我在寻找某种带有累计成本注释的调用图,其中我的函数比我调用的库函数具有更高的包容性采样成本.

这在perf中是可能的吗?如果是,怎么做?

注意:我发现"E"打开调用图并提供更多信息.但是调用图通常不够深入,并且/或者随机终止,而没有给出在哪里花费了多少信息的信息.例子:

-     10.26%  kate  libkatepartinterfaces.so.4.6.0  [.] Kate::TextLoader::readLine(int&...
     Kate::TextLoader::readLine(int&, int&)                                            
     Kate::TextBuffer::load(QString const&, bool&, bool&)                              
     KateBuffer::openFile(QString const&)                                              
     KateDocument::openFile()                                                          
     0x7fe37a81121c

这可能是我在64位上运行的问题吗?另请参见:http://lists.fedoraproject.org/pipermail/devel/2010-November/144952.html(我没有使用fedora,但似乎适用于所有64位系统).

推荐答案

你应该try 一下:

可在github上获得:https://github.com/KDAB/hotspot

例如,它可以为您生成火焰图.

flamegraph

Linux相关问答推荐

无法分析nasm中的单词

Shell 脚本程序 - 从日志(log)文件中过滤磁盘空间利用率超过 80% 的行

在 bash 中使用 tee 时如何返回错误代码

如何将一个变量的 2 行添加到另一个变量的特定行?

如何拆分和计算 Bash 中单词的出现次数?

使用 grep 时如何跳过第一行和最后一行?

递归/详尽地将点插入字符串

命令应在终端关闭后继续运行

Bash 更新 yaml 文件中的图像值

如何在linux中将2个不同大小的图像(边框,实际图像)合并为1个

并行制作:将 -j8 设置为默认选项

如何找出哪个进程正在消耗等待 CPU(即 I/O 阻塞)

我需要 -D_REENTRANT 和 -pthreads 吗?

Linux 和 I/O 完成端口?

在 Linux 上用 C 语言读写串口

判断 VT-x 是否已激活而无需在 Linux 中重新启动?

比较文件的日期 bash

如何运行我所有的 PHPUnit 测试?

linux perf:如何解释和查找热点

如何限制我网站的 API 用户?