本页内容

Chrome 跟踪格式可视化工具

您可以使用全栈跟踪,从顶层的 QML 或 JavaScript 开始,一直追踪到 C++,甚至深入到内核空间。这使您能够测量应用程序的性能,并检查其性能瓶颈是 CPU 还是 I/O 限制,或是受到同一系统上运行的其他应用程序的影响。 跟踪功能能深入揭示系统正在执行什么操作,以及应用程序为何会呈现特定的性能表现。它能显示硬件的利用情况,并揭示内核和应用程序的具体运行状态。

跟踪信息可以为您提供更多关于 QML Profiler 收集的数据提供更多信息。例如,您可以检查为什么一个简单的绑定评估会耗时如此之久。这可能是由于 C++ 代码的执行或磁盘 I/O 速度较慢所致。

有多种跟踪工具(例如chrome://about )可以生成关于 Chrome 跟踪事件的 Chrome 跟踪格式(CTF)信息。 您可以在Qt Creator 中打开 CTF 文件进行查看。当查看大于 100 MB 的跟踪文件时,此方法特别有用,因为内置的跟踪查看器(chrome://tracing )由于内存占用过高,难以处理此类大文件。

该可视化工具支持LTTng追踪框架生成的数据中所有已转换为 CTF 格式的事件类型。但某些更高级的事件类型(例如 Android 系统追踪中使用的)则不被支持。对于不支持的事件类型,该可视化工具会自动忽略,且不会发出提示。

可视化工具支持以下事件类型:

  • 开始、结束、持续时间和瞬时事件
  • 计数器事件(图表)
  • 元数据事件(进程和线程名称)

打开 JSON 文件

要打开 JSON 文件进行查看,请选择“Analyze ” > “Chrome Trace Format Viewer ” > “Load JSON File ”。

事件可视化

Timeline ”视图以图形形式展示跟踪事件,并提供所有记录事件的摘要视图。

时间轴视图

时间轴中的每个类别代表应用程序中的一个线程。将光标悬停在某行上的事件(5)上,即可查看其持续时间和事件类别。若仅在选中事件时显示相关信息,请禁用“View Event Information on Mouseover ”按钮(4)。

时间轴(10)汇总了数据采集的时间段。拖动缩放范围(8)或单击时间轴可在时间轴上移动。要在事件之间切换,请选择“Jump to Previous Event ”和“Jump to Next Event ”按钮(1)。

点击“Show Zoom Slider ”按钮(2)可打开滑块,用于设置缩放级别。您也可以拖动缩放控点(9)。要重置为默认缩放级别,请右键单击时间轴以打开上下文菜单,然后选择“Reset Zoom ”。

选择“仅限主题 ”(Restrict to Threads )按钮(6)以选择要显示的线程。

选择事件范围

您可以选择一个事件范围(7),以查看其所代表的时间段,或放大波形图的特定区域。点击“Select Range ”按钮(3)以激活选择工具。然后在时间轴上单击以指定事件范围的起始点。拖动选择控点以定义范围的结束点。

您还可以使用事件范围来测量两个连续事件之间的延迟。将范围设置在第一个事件的结束点与第二个事件的开始点之间。Duration 字段将以毫秒为单位显示两个事件之间的延迟。

要放大事件范围,请双击该范围。

要删除事件范围,请关闭“Selection ”对话框。

查看统计信息

统计视图

Statistics ”视图会显示时间轴中每个函数包含的样本总数,以及位于堆栈顶部时的样本数(称为“self ”)。这使您能够检查需要优化的函数。出现次数过多可能表明该函数被不必要地触发,或者执行时间过长。

收集 LTTng 数据

LTTng 是一款适用于 Linux 的跟踪工具包,您可以在嵌入式 Linux 系统上使用它来找出如何优化应用程序的启动时间。

Qt 提供了一组内核跟踪点,以及用于自定义用户空间跟踪点的跟踪子系统。

配置内核

要使用 LTTng,您必须在构建内核之前设置以下配置选项:

  • CONFIG_HIGH_RES_TIMERS
  • CONFIG_KALLSYMS
  • CONFIG_MODULES
  • CONFIG_TRACEPOINTS

建议您设置以下附加选项:

  • CONFIG_EVENT_TRACING
  • CONFIG_HAVE_SYSCALL_TRACEPOINTS
  • CONFIG_KALLSYMS_ALL

在 Yocto 中,您可以在“Menu ” > “Config ” > “Kernel Hacking ” > “Tracers ”中启用上述选项。

安装 LTTng

在构建内核并将其部署到设备后,您需要在设备上安装以下 LTTng 软件包:

  • lttng-tools 用于控制跟踪会话
  • lttng-modules 用于内核跟踪点
  • lttng-ust 用于用户空间跟踪点

在 Yocto 中,您只需启用EXTRA_IMAGE_FEATURES += "tools profile"

使用跟踪点构建 Qt

Qt的各个版本中都在不断添加跟踪点。若要使用这些功能,您需要自行使用configure -trace lttng 选项构建Qt。

记录事件

要创建一个会话,请调用lttng create 命令。然后调用lttng enable-channel kernel -k 来启用内核通道。在内核通道中,将相应的跟踪点指定为kernel_events ,并调用lttng enable-event 来启用它们。最后,调用lttng start 来开始跟踪。

调用lttng stop 可停止追踪。您可以使用sleep 设置会话时长。停止后,可调用lttng destroy 销毁该会话。

您可以编写并运行包含上述命令的脚本,以启动和停止全栈追踪。您可以使用systemd 来执行这些脚本。

启用跟踪点

数据将根据您在 LTTng 会话中启用的跟踪点进行记录。通常,启用调度器切换、系统调用和 Qt 跟踪点会很有帮助。

调度器切换跟踪点

当应用程序因抢占而被切换出时(例如,当另一个进程获得在 CPU 核心上运行的机会时),会触发调度器切换跟踪点。启用调度器切换跟踪点可记录当前正在运行的线程及其所属的进程,以及该进程的启动和停止时间。

系统调用跟踪点

系统调用跟踪点有助于您了解调度器切换发生的原因。以下是需要跟踪的系统调用示例:

  • openat close 将文件描述符映射到文件名
  • mmap 将页面故障映射到文件
  • read write 由 I/O 操作触发
  • nanosleepfutex 以及poll 解释了调度器切换的原因
  • ioctl 控制 GPU 和显示

将 LTTng 数据转换为 CTF

ctf2ctf工具使用babeltrace 解析二进制通用跟踪格式 (CTF),并将其转换为 Chrome 跟踪格式 (CTF)。它执行以下自定义任务,以使记录更易于人类阅读:

  • 将文件描述符映射到文件名
  • 将页面故障映射到文件名
  • 为中断和块设备添加名称注释
  • 将 UTF-16 格式的QString 数据转换为 UTF-8 字符串
  • 统计内存页分配次数

要生成包含 Chrome 跟踪格式(Chrome Trace Format)跟踪数据的 JSON 文件,请在命令行中输入以下命令:

ctf2ctf -o trace.json path/to/lttng trace/

另请参阅 《操作指南:分析》、《分析器》和《代码分析》。

Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.