分析器
通过 CLion 的 CPU 分析器集成,您可以分析为应用程序(包括内核和用户代码)收集的性能指标。 分析器可用于 Linux 和 macOS,其实现基于 Perf 和 DTrace 工具。
Perf 和 DTrace 以固定速率采样来中断应用程序并收集程序计数器和堆栈跟踪,然后将其转换为分析报告。 此类报告可能很长且难以分析,因此 CLion 提供了分析器输出数据的可视化功能。
先决条件
为您的 特定内核版本 安装 Perf 工具。
使用
uname -r找出确切的版本,然后安装相应的 linux-tools 包。 例如:$ uname -r 4.15.0-36-generic $ sudo apt-get install linux-tools-4.15.0-36-generic调整内核选项
perf_event_paranoid - 控制非 root 用户对性能事件数据的使用。
将该值设置小于 2 以使性能分析器在无 root 权限的情况下收集性能信息:
sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid'您可以在 内核文档 中找到可能值的描述。 通常,
1或0就足以让分析器运行并收集数据。 但是,如果您获得了空的分析结果(显示 无分析器数据 消息),您的系统设置可能需要-1- 这是最不安全的选项,允许所有用户使用所有性能事件。kptr_restrict - 设置对内核地址暴露的限制。
要正确解析内核符号,请通过将 kptr_restrict 的值设置为 0 来禁用其提供的保护:
sudo sh -c 'echo 0 >/proc/sys/kernel/kptr_restrict'
默认情况下,这些更改仅影响您当前的操作系统会话。 要在系统重启后保持这些设置,请运行:
sudo sh -c 'echo kernel.perf_event_paranoid=1 >> /etc/sysctl.d/99-perf.conf' sudo sh -c 'echo kernel.kptr_restrict=0 >> /etc/sysctl.d/99-perf.conf' sudo sh -c 'sysctl --system'首次启动分析器时,CLion 会检查内核变量是否已设置,并建议必要的更改:

唯一需要的工具是 DTrace ,该工具很可能已默认安装在您的 macOS 上。 通过在终端中调用
dtrace命令进行检查。
CLion 会自动检测 Perf 或 DTrace 可执行文件(如果其位置包含在 PATH 环境变量中)。 您也可以在 中手动设置路径。
运行分析
准备构建
分析器依赖调试信息来提供有意义的输出数据和导航,因此建议使用 调试 配置进行分析。
编译器 优化 (例如内联)可能会影响分析结果。 为了确保没有帧因内联而丢失,请在 CMakeLists.txt 中将优化级别设置为
-O0:set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")此外,编译器可能会将帧指针寄存器用作通用寄存器以进行优化,这可能导致堆栈跟踪中断。 在 Linux 上,分析器的实现不依赖于此,但在 macOS 上,我们建议为 gcc 设置
-fno-omit-frame-pointer编译标志,并为 clang 设置-fno-omit-frame-pointer和-mno-omit-leaf-frame-pointer。
配置采样频率
默认采样率值相当高,这可能需要长时间运行程序占用大量磁盘空间。
如有需要,您可以在 中更改分析器的采样频率。

选择采样率时,请考虑 注意其他计时器驱动的活动 可能在您的系统中被调度。 例如,默认值设置为 99 赫兹而不是 100 赫兹,以避免与其他可能以 100Hz 采样频率运行的活动发生同步采样。
设置 Perf 输出目录(Linux)
默认情况下, Perf 的输出放置在 /tmp 中,该目录可能容量有限。 如果在分析期间该目录已满,程序将以错误终止。 为避免这种情况,您可以在 中配置另一个目录用于分析输出。

运行分析器
使用以下选项之一:
从工具栏的列表中选择一个运行配置,然后点击
或从主菜单调用 :

或者,从程序入口点或您想要分析的函数的左侧边栏菜单中选择
配置文件:

您还可以将分析器附加到正在运行的进程(调用 ):

启动分析时,CLion 会通知您分析器是否成功附加。
在应用程序停止并且分析数据准备好后,CLion 会显示一个气泡通知,其中包含指向 CPU 性能分析器工具窗口 的链接(也可从主菜单 访问):

要在停止应用程序之前停止分析器,请使用分析器工具窗口中的 停止 按钮。
阅读分析报告
在 CPU 分析器工具窗口中,您可以看到收集的数据以三个选项卡的形式显示: 火焰图、 调用树 和 方法列表。 左侧列出了应用程序线程和 所有线程已合并。 在 Linux 上,如果程序中设置了线程名称,CLion 会显示有意义的线程名称;而在 macOS 上,线程名称显示为 ID。

导航报告
分析器 工具窗口使您能够在保持对特定函数聚焦的同时在选项卡之间切换。
右键点击所需的函数,然后选择您想要打开它的另一种视图:
在另一个选项卡中定位所选函数(例如,火焰图块的 在方法列表中聚焦于方法)。

导航到源代码(跳转到源)。
将帧信息复制到剪贴板;仅复制帧名称(复制帧 )或从堆栈底部到选定帧的帧名称序列(复制堆栈到帧)。
火焰图
由 Perf 或 DTrace 收集的原始分析数据是调用树摘要。 火焰图 将其可视化为堆栈跟踪的集合:矩形代表调用堆栈中的框架,按宽度排序。
每个块表示堆栈中的一个函数(一个堆栈框架)。 每个块的宽度对应于函数使用的 CPU 时间。 Y 轴表示从下到上的栈深度。 X 轴显示按从最耗费资源的函数到最少耗费资源的函数排序的堆栈分析。
阅读火焰图时,请聚焦于 最宽块。 这些块是分析中最常出现的函数。 您可以从底部开始向上移动,跟随从父函数到子函数的代码流,也可以使用相反方向查看直接在 CPU 上运行的顶层函数块。
在工具提示中显示详细信息
将鼠标悬停在块上以显示工具提示:

工具提示显示完全限定的函数名称、父级采样时间的百分比以及总采样时间的百分比。
缩放图表
使用
和
选项缩放图表。
要聚焦于特定函数,请双击图表中相应的块。
要恢复图表的原始大小,请点击 1:1。
搜索图表
如果您想在图表中定位某个指定函数,请开始输入其名称。 图表会高亮所有名称与您的搜索请求匹配的块。
使用
和
快速导航搜索结果之间。 您还可以在整个图表中搜索,或仅在特定子树中搜索。

捕获图表
您可以单独捕获并导出图表,而不包含报告中的其他数据。
点击
并选择 复制到剪贴板 ,或者点击 保存 将图表以 .png 格式导出为图像。
调用树
调用树 选项卡表示在分析期间采样的程序调用堆栈信息。 顶级的 所有线程已合并 选项将所有线程合并到一棵单一树中。 还有每个线程的自顶向下调用树。

对于每个函数,该选项卡显示以下信息:
函数名称
总样本时间百分比或父样本时间百分比
总采样计数
递归调用
折叠递归调用
具有多个递归函数的复杂应用程序可能非常难以分析。 在常规调用树视图中,递归调用按它们被调用的顺序显示——一个接一个,这在包含大量递归调用的复杂调用堆栈的情况下会导致几乎无限的堆栈滚动。
CLion 检测到递归时,会在调用堆栈中找到相同函数的更高层调用。 在这种情况下,子树会从调用树中取出,然后重新附加到该函数的首次调用位置。 通过这种方式,您可以绕过递归,专注于消耗最多资源和调用的函数。
折叠递归调用使您能够看到在这些调用中消耗的总时间,就像没有递归一样。

折叠的递归调用在 图标上 调用树 标签中标记。 点击它以在单独的选项卡中打开递归调用树。 您可以在工具提示中预览合并堆栈的数量。

假设:聚焦于特定函数
CLion 允许您检查调用树中的特定函数:您可以排除特定函数,或者反过来,仅聚焦于您当前感兴趣的函数。
右键点击 调用树 选项卡上的必要函数,然后选择以下选项之一以在专用选项卡中打开结果:
聚焦于子树 :仅显示选定的函数调用。 父函数样本时间计数器仅显示在选定子树中花费的时间。
聚焦于调用 :显示选定的函数及调用它的函数。 启用此选项时,每个时间帧仅显示在选定函数中花费的时间。
排除子树 :忽略选定的函数调用。
排除调用 :忽略对选定函数的所有调用。

过滤调用
您可以在调用树中折叠/展开框架。 例如,当您想隐藏库类或特定框架的类并聚焦于应用程序代码时,这非常有用。
使用树中的上下箭头隐藏或显示调用:

您可以在 中查看并调整用于折叠调用树框架的模式列表:

方法列表
方法列表收集分析数据中的所有函数,并按累积采样时间排序。

在 采样 列中,您可以看到每个函数的总采样数。 自身采样 列显示了堆栈跟踪结束于当前函数(而非其被调用者)的采样数量。 自身采样 的值在检查不调用其他函数的长时间运行函数时可能会有所帮助。
对于列表中的每个函数,您可以查看 回溯 和 合并的被调用者。
导出和导入分析器结果
在 CLion 中,您可以在所有平台上导出/导入分析结果。 这在对 远程 或 嵌入式 目标进行分析后将结果导入本地时特别有用。
导出分析结果
点击
,位于 分析器 工具窗口的左侧框架()。
在打开的对话框中,为文件命名,指定要保存的文件夹,然后点击 保存。
结果将导出到 .collapsed 文件中。 此文件包含以 FlameGraph 脚本使用的格式表示的调用跟踪。 该格式是标准化的,表示调用堆栈的集合,其中每行是一个以分号分隔的框架列表,后跟一个计数器。
导入分析结果
从主菜单中选择 。
选择一个新文件或最近打开的文件之一。