Sysprof¶
Sysprof 是 Linux 系统范围内的统计分析器。您可以使用 Sysprof 测量应用程序中每个函数花费的时间,直到 Linux 内核中的系统调用。
Sysprof 的初始配置和捕获源¶
查找系统中经常运行的代码¶
Sysprof 的核心是一个“全系统”分析器。这意味着它不是设计用来只分析您的单个程序,而是分析系统上的所有进程。这在桌面场景中非常有用,因为我们有很多相互连接的组件。
重要提示
您必须确保使用允许我们获得足够信息来展开堆栈帧的标志进行编译。Sysprof 在某些情况下会使用 libunwind,但我们的大部分堆栈展开都是由 Linux 内核完成的,目前它只能跟踪 eh_frame(异常处理)信息。对于 C 项目,您需要确保 -fno-omit-frame-pointer 包含在您的编译器标志中。
调用图工具¶
右侧是一个从“[Everything]”开始的调用图。它按进程分割,然后按您在该程序中看到的调用堆栈分割。左上侧是收集(并解码)的所有函数的列表。左下侧是所选函数上方的调用者列表。当您想回溯到调用函数的各个位置时,这很有用。
注意
Sysprof 是基于采样的分析器,因此不能保证拦截所有函数。
使用此信息找到特定项目中的相关代码。调整一些内容,再次尝试,测试……
跟踪多余的分配¶
可能导致应用程序变慢的事情之一是在热路径中进行内存分配。与应用程序可以执行的所有其他操作相比,分配内存仍然相当昂贵。
此时,运行您的应用程序以执行目标行为。然后按“停止”,您将看到录制结果。通常默认选择正常的调用图。选择“内存分配”行,您将看到内存调用图。
这一次,您将在函数旁边看到内存分配大小。探索一下,并寻找看起来不合适的东西。在下面的图像中,分配了大量的变换。
累积分配¶
查找主循环变慢¶
“Speedtrack”辅助工具将为您提供主线程中发生的事情的调用图,这些事情您可能希望避免,例如 fsync()、read() 等。它还会为这些调用的持续时间创建标记,以便您可以跟踪它们运行了多长时间。
Pango 中加载的各种文件¶
主循环迭代中的停顿¶
您还可以看到某些操作花费了多长时间。在这里,我们看到 g_main_context_iteration() 花费了 22 毫秒。在 60 Hz 的系统上,这不太好,因为我们可能错过了帧,或者花费的时间太长而无法及时提交我们的帧。您可以通过激活此行来选择时间范围。将来,我们希望它能更好地与调用图配合使用,以便您可以看到在此时间段内采样了什么。