hotspot

hotspot

Linux性能分析的开源可视化工具

Hotspot是一个开源的Linux性能分析图形界面工具。它能够可视化perf.data文件,提供火焰图、调用图等多种视图,并支持时间线过滤和离线CPU分析等功能。Hotspot集成了perf记录功能,可直接启动应用进行性能分析。此外,它还支持嵌入式系统分析,以及数据的导入导出,便于跨机器共享分析结果。Hotspot为Linux性能优化和调试提供了直观高效的分析体验。

Hotspot性能分析LinuxperfGUIGithub开源项目
<img width="100%" src="https://yellow-cdn.veclightyear.com/835a84d5/4ad96a0d-3432-4b25-92fa-1a41459ef637.png">

Hotspot - Linux perf性能分析GUI工具

本项目是KDAB公司的一项研发工作,旨在创建一个独立的性能数据GUI工具。我们的首要目标是围绕Linux perf提供一个类似KCachegrind的用户界面。展望未来,我们计划在这个框架下支持各种其他性能数据格式。

目录

截图

以下是展示Hotspot主要功能的一些截图:

数据可视化

Hotspot的主要功能是对perf.data文件进行图形化可视化。

hotspot概览页面

hotspot火焰图页面

注意:内联函数比非内联函数有更深的边框。

hotspot离线CPU分析

hotspot调用者-被调用者页面

hotspot自下而上页面

hotspot自上而下页面

hotspot停靠小部件布局

时间线

时间线允许按时间、进程或线程过滤结果。数据视图会相应更新。

hotspot时间线按时间过滤

hotspot时间线按线程或进程过滤

hotspot时间线过滤应用于火焰图

记录数据

您还可以从Hotspot启动perf,以分析新启动的应用程序或附加到已运行的进程。但请注意下面的注意事项

hotspot启动应用程序

hotspot附加到进程

获取Hotspot

注意:Hotspot尚未在所有Linux发行版上打包。在这种情况下,或者如果您想使用最新版本,请使用AppImage,它可以在任何最新的Linux发行版上正常工作。

ArchLinux

Hotspot可在AUR中获得(https://aur.archlinux.org/packages/hotspot)。

Debian / Ubuntu

Hotspot可在Debian(https://packages.debian.org/hotspot)和Ubuntu (https://packages.ubuntu.com/hotspot)中获得。

Gentoo

Hotspot ebuilds可从我们的overlay获得(https://github.com/KDAB/kdab-overlay)。

Fedora

Hotspot可在Fedora中获得(https://packages.fedoraproject.org/pkgs/hotspot/hotspot/)。

适用于任何Linux发行版:AppImage

您可以前往最新发布版持续构建版。 在这两种情况下,您都可以在"Assets"下找到可下载的AppImage。 解压AppImage文件(对于最新发布版),然后使其可执行并运行它。

请使用最新构建以获取最新版本。如果它不工作,请报告错误并测试最新的稳定版本。

注意:您的系统库或偏好设置不会被更改。如果您想再次删除Hotspot, 只需删除下载的文件即可。在此处了解有关AppImage的更多信息。

要了解如何调试AppImage,请参阅HACKING

构建Hotspot

从源代码构建Hotspot可以让您获得最新和最强大的版本,但您需要确保所有依赖项都可用。大多数用户可能应该从发行版包管理器或作为AppImage安装Hotspot

对于想为Hotspot做出贡献或使用最新版本而不使用AppImage的人,可以在HACKING中找到详细说明。

使用

一般使用

首先,使用perf记录一些数据。要获取回溯,您需要启用dwarf调用图模式:

perf record --call-graph dwarf <您的应用程序> ... [ perf record: Woken up 58 times to write data ] [ perf record: Captured and wrote 14.874 MB perf.data (1865 samples) ]

现在,如果您在同一台机器上有Hotspot,您只需启动它即可。 它会自动打开当前目录中的perf.data文件(类似于perf report)。 或者,您可以在控制台上指定数据文件的路径:

hotspot /path/to/perf.data

命令行选项

根据您的需求,您可能想要向 Hotspot 传递额外的命令行选项。 这允许一次性设置在 GUI 中"设置"下找到的配置选项, 还允许将 Linux perf 数据文件转换为更小且可移植的 perfdata 格式 (有关详细信息,请参阅导入/导出)。 使用 --help 可以显示所有命令行选项:

用法:hotspot [选项] [文件...] 用于性能分析的 Linux perf GUI。 选项: -h, --help 显示命令行选项帮助。 --help-all 显示包括 Qt 特定选项在内的所有帮助。 -v, --version 显示版本信息。 --sysroot <路径> 用于查找库的 sysroot 路径。 --kallsyms <路径> 用于解析内核符号的 kallsyms 文件路径。 --debugPaths <路径> 包含调试信息的路径的冒号分隔列表。这些路径相对于 可执行文件,而不是相对于当前工作目录。 --extraLibPaths <路径> 查找库的额外路径的冒号分隔列表。 --appPath <路径> 包含应用程序可执行文件和库的文件夹路径。 --sourcePaths <路径> 源代码搜索路径的冒号分隔列表。 --arch <路径> 用于解析的架构。 --exportTo <路径> 输入数据应导出到的 .perfparser 输出文件的路径。 还必须给定单个输入文件。 --perf-binary <路径> perf 二进制文件的路径。 --objdump-binary <路径> objdump 二进制文件的路径。 参数: 文件 启动时要打开的可选输入文件,即 perf.data 文件。

离线 CPU 分析

Hotspot 支持一种非常强大的等待时间分析或离线 CPU 分析方法。 这种分析基于 Linux 调度器中的内核跟踪点。通过记录这些 数据,我们可以找到线程不在 CPU 上运行而是离线的时间差。 这可能有多种原因,所有这些原因都可以使用这种技术找到:

  • 同步 I/O,例如通过 read()write()
  • 页面错误,例如访问 mmap() 的文件数据时
  • 调用 nanosleep()yield()
  • 通过 futex() 等进行锁竞争
  • 抢占
  • 可能还有更多

通过利用内核中的跟踪点,开销是相当可控的, 我们只在进程实际被切换出去时付出代价。最值得注意的是, 当例如互斥锁操作可以直接在用户空间处理时,我们不会付出代价。

要使用 Hotspot 进行离线 CPU 分析,您需要使用非常具体的命令记录数据:

perf record \ -e cycles \ # 在线 CPU 分析 -e sched:sched_switch --switch-events \ # 离线 CPU 分析 --sample-cpu \ # 跟踪代码在哪个核心上执行 -m 8M \ # 减少事件丢失的可能性 --aio -z \ # 减少磁盘 I/O 开销和数据大小 --call-graph dwarf \ # 我们肯定需要回溯 <您的应用程序>

或者,您可以在 Hotspot 集成的记录页面中使用离线 CPU 复选框。

在分析过程中,您可以在"cycles"成本视图(用于在线 CPU 数据) 和"离线 CPU 时间"成本视图(用于等待时间分析)之间切换。通常,您会想要 在两者之间切换,例如找到可能需要进一步并行化的代码位置 (另请参阅 Amdahl 定律)。

"sched:sched_switch"成本也会显示给您。但在我看来,这不太 有用,因为它只表示调度器切换的次数。中间的时间长度 通常对我来说更有趣 - 这就是在"离线 CPU 时间"指标中向您展示的内容。

嵌入式系统

如果您在嵌入式系统上记录,您会希望在开发机器上使用 Hotspot 分析数据。 为此,请确保您的 sysroot 包含解析所需的调试信息(见下文)。 然后在嵌入式系统上记录数据:

embedded$ perf record --call-graph dwarf <您的应用程序> ... [ perf record: 被唤醒 58 次以写入数据 ] [ perf record: 捕获并写入了 14.874 MB perf.data(1865 个样本)] embedded$ cp /proc/kallsyms /tmp/kallsyms # 将伪文件转换为真实文件

即使您的嵌入式机器使用与主机不同的平台也没关系。在您的 主机上,然后执行以下步骤来分析数据:

host$ scp embedded:perf.data embedded:/tmp/kallsyms . host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms \ perf.data

如果您手动从 sysroot 外部的路径部署了应用程序,请执行以下操作:

host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms --appPath /path/to/app \ perf.data

如果您的应用程序还使用 sysroot 和 appPath 之外的库,请执行以下操作:

host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms --appPath /path/to/app \ --extraLibPaths /path/to/lib1:/path/to/lib2:... \ perf.data

最坏的情况下,如果您还在非标准位置使用拆分调试文件,请执行以下操作:

host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms --appPath /path/to/app \ --extraLibPaths /path/to/lib1:/path/to/lib2:... \ --debugPaths /path/to/debug1:/path/to/debug2:... \ perf.data

导入导出

perf.data 文件格式不是自包含的。要分析它,您需要访问 被分析进程的可执行文件和库,以及调试符号。 这使得在机器之间共享这些文件变得麻烦,例如,为了获得 同事的帮助来调查性能问题,或用于错误报告目的。

Hotspot 允许您导出分析后的数据,这些数据是完全自包含的。 可以通过"文件 > 另存为"菜单操作访问此功能。然后数据 保存在自包含的 *.perfparser 文件中。要将数据重新导入 Hotspot, 只需直接打开该文件,替代原始的 perf.data 文件即可。

作为替代方案,您也可以使用 --exportTo 选项从命令行执行导出(无需 GUI, 因此也可用于自动化构建)。

**注意:**文件格式尚未稳定。这意味着由一个版本的 Hotspot 导出的数据 只能由同一版本读回。这个问题将在未来解决,时间允许的话。

跟踪点

Hotspot 目前只在时间线中显示跟踪点的名称。

hotspot 跟踪点

反汇编器

hotspot 反汇编器页面 Hotspot包含一个反汇编器,可以显示每条指令的成本。反汇编器使用颜色来指示哪些汇编行对应哪些源代码行。

为了更容易导航,您可以简单地点击一行,另一个视图就会跳转到该位置。您可以通过双击来跟踪函数调用。在源代码视图中,您可以按Ctrl+F或点击搜索图标来打开搜索窗口。

如果您的源文件在不同的目录中,可以使用--sourcePaths或设置来告诉反汇编器在那里搜索源代码。

已知问题

如果上述功能出现问题,导致输出的可用性不如perf report,请在GitHub上报告问题。 话虽如此,以下是一些人们可能会遇到的已知问题:

回溯失败

为生成回溯而展开堆栈是一门深奥的技术,可能会以多种方式出错。Hotspot依赖于perfparser(见下文),而perfparser又依赖于elfutils的libdw来展开堆栈。这在大多数情况下工作得很好,但仍可能出错。最明显的是,在以下情况下展开将失败:

  • perf.data文件引用的ELF文件(即可执行文件或库)丢失
    • 要解决此问题,请尝试使用以下CLI参数之一,让Hotspot知道在哪里查找ELF文件:
      • --debugPaths <paths>:当您在非标准位置有拆分的调试文件时使用此选项
      • --extraLibPaths <paths>:当您在记录后将库移动到其他位置时使用此选项
      • --appPath <paths>:这是上述两个字段的组合。该路径会被递归遍历,寻找调试文件和库。
      • --sysroot <path>:当您尝试检查在嵌入式平台上记录的数据文件时使用此选项
  • ELF文件缺少调试信息
    • 要解决此问题,请从您的发行版安装调试包
    • 或者以"带调试信息的发布"模式编译代码,即确保您的编译器使用类似-O2 -g的选项。您需要重复perf record步骤
    • 可能上述两种方法都不适合您,例如当库是闭源的并由第三方供应商提供时。在这种情况下, 您可能会幸运地发现库包含帧指针。如果是这样,那么尝试从当前git主分支构建elfutils(您需要提交a55df2c1,它应该是0.170的一部分)。 这个版本的elfutils将在缺少调试信息时尝试回退到帧指针进行展开。
  • 您的调用栈太深
    • 默认情况下,perf record只复制部分栈到数据文件。这可能导致非常深的调用栈在某个点被截断的问题。这个问题会破坏Hotspot中的自上而下的调用树,如在自上而下视图或火焰图中可视化的那样。要解决此问题,您可以尝试增加栈转储大小,即:

      perf record --call-graph dwarf,32768
      

      请注意,这可能会显著增加perf.data文件的大小 - 请谨慎使用。另外也请查看man perf record

    • 对于某些场景,递归函数调用simply无法展开。另请参见 https://github.com/KDAB/hotspot/issues/93

debuginfod

Hotspot支持通过debuginfod下载调试符号。 可以通过在设置中添加下载URL或在环境中定义DEBUGINFOD_URLS来启用此功能。

缺失功能

perf report相比,Hotspot缺少许多功能。其中一些计划在未来解决。其他可能永远不会实现。但请注意,以下功能目前在Hotspot中_不_可用:

  • 表格中的列目前是硬编码的,而用户可能希望更改这些列以显示例如每个进程或线程的成本等。已添加基本的分组功能,但目前不计划实现像WPA那样更灵活的列排列。
  • 许多更高级的功能,如--itrace--mem-mode--branch-stack--branch-history,不受支持

没有超级用户权限的情况下使用perf进行记录

sudoroot用户身份启动Hotspot不是一个好主意。例如,请参阅 以Root身份编辑文件 这篇文章。Issue #83在这方面也很相关。

但是没有超级用户权限,使用Hotspot的记录功能时可能会看到如下错误消息:

您可能没有收集统计信息的权限。 考虑调整/proc/sys/kernel/perf_event_paranoid: -1 - 完全不偏执 0 - 禁止非特权用户访问原始跟踪点 1 - 禁止非特权用户访问CPU事件 2 - 禁止非特权用户进行内核分析

为了解决这个限制,Hotspot可以使用提升的权限自行运行perf。

导出文件格式

当前的数据导出仅限于只能被相同版本的Hotspot读取的格式。这使得与其他可视化工具的互操作几乎不可能。这是已知问题,未来将会改进。最值得注意的是计划支持导出到Web查看器,如perfettoMozilla profiler,但尚未实现。欢迎提交补丁!

Qt Creator

这个项目利用了Qt公司为其Qt Creator IDE创建的优秀的perfparser实用程序。如果您已经在使用Qt Creator,请考虑利用其集成的CPU使用分析器

许可证

Hotspot根据GPL v2+许可。有关更多信息,请参阅LICENSE.GPL.txt, 或者如果您对本许可的任何条件不清楚,请联系info@kdab.com

编辑推荐精选

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

下拉加载更多