#flame-graph #perf

bin+lib inferno

Rust 版本的 FlameGraph 性能分析工具套件

54 个版本

0.11.21 2024年8月3日
0.11.20 2024年7月14日
0.11.19 2023年11月25日
0.11.15 2023年2月11日
0.6.0 2019年3月13日

#6 in 性能分析

Download history 49925/week @ 2024-05-03 56824/week @ 2024-05-10 55753/week @ 2024-05-17 48687/week @ 2024-05-24 54258/week @ 2024-05-31 54956/week @ 2024-06-07 60706/week @ 2024-06-14 59619/week @ 2024-06-21 55709/week @ 2024-06-28 63623/week @ 2024-07-05 68039/week @ 2024-07-12 68685/week @ 2024-07-19 65655/week @ 2024-07-26 71245/week @ 2024-08-02 69428/week @ 2024-08-09 57439/week @ 2024-08-16

275,751 每月下载量
238 个 Crates 中使用 (28 直接)

CDDL-1.0

335KB
7K SLoC

Crates.io Documentation Codecov Dependency status

Inferno 将 flamegraph 工具套件的某些部分移植到 Rust,旨在提高原始 flamegraph 工具的性能。主要关注加快 stackcollapse-* 工具的速度,该工具将各种分析工具的输出转换为 flamegraph 绘图工具所需的“折叠”格式。到目前为止,重点在于解析 perfDTrace 的分析结果。在撰写本文时,inferno-collapse-perf 的速度比 stackcollapse-perf.pl 快 20 倍左右,而 inferno-collapse-dtrace 的速度比 stackcollapse.pl 快 20 倍左右(参见 compare.sh)。

它部分是通过现场编码会议开发的,您可以在 YouTube 上找到这些会议 [链接]

使用 Inferno

作为库

Inferno 通过 inferno Crates 提供了一个 库接口。这将允许您在不通过命令行的情况下折叠堆栈并生成火焰图,并旨在与外部 Rust 工具(如 cargo-flamegraph)集成。

作为二进制文件

首先,您可能想了解 cargo flamegraph,它为您处理了大量基础设施!

如果您想直接使用 Inferno,请以发布模式构建您的应用程序,并包含调试符号,然后运行性能分析器以收集性能分析数据。一旦您有了数据,通过适当的 Inferno "合并器"进行处理。根据您的平台,这看起来可能像这样

$ # Linux
# perf record --call-graph dwarf target/release/mybin
$ perf script | inferno-collapse-perf > stacks.folded

$ # macOS
$ target/release/mybin &
$ pid=$!
# dtrace -x ustackframes=100 -n "profile-97 /pid == $pid/ { @[ustack()] = count(); } tick-60s { exit(0); }"  -o out.user_stacks
$ cat out.user_stacks | inferno-collapse-dtrace > stacks.folded

您还可以使用inferno-collapse-guess,它应该适用于 perf 和 DTrace 样本。最终,您将得到一个“折叠堆栈”文件。您可以将该文件传递给inferno-flamegraph以生成火焰图 SVG

$ cat stacks.folded | inferno-flamegraph > flamegraph.svg

最终您将得到这样的图像

colorized flamegraph output

获取性能分析数据

为了分析您的应用程序,您需要安装一个“性能分析器”。这可能是 Linux 上的perfbpftrace,以及 macOS 上的 [DTrace]。在 Brendan Gregg 的[CPU 火焰图页面]上有一些很好的使用这些工具的说明。

[性能分析器]: https://en.wikipedia.org/wiki/Profiling_(computer_programming perf: https://perf.wiki.kernel.org/index.php/Main_Page bpftrace: https://github.com/iovisor/bpftrace/ [DTrace]: https://www.joyent.com/dtrace [CPU 火焰图页面]: http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html#Instructions

在 Linux 上,您可能需要调整内核配置,例如

$ echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid

以使性能分析正常工作

性能

与 Perl 实现的比较

要运行 Inferno 的性能比较,请运行./compare.sh。它需要hyperfine,并且您必须确保您也签出 Inferno 的子模块。一般来说,Inferno 的 perf 和 dtrace 合并器比 stackcollapse-* 快约 20 倍,样本合并器快约 10 倍。

基准测试

Inferno 在benches/中包含criterion基准测试。Criterion 将其结果保存在target/criterion/中,并使用该结果来识别性能变化,这应该有助于在开发错误修复和改进时检测性能回归。

您可以使用cargo bench运行基准测试。一些结果(视情况而定)

我的台式电脑(AMD Ryzen 5 2600X)得到(/N 表示 N 核心)

collapse/dtrace/1       time:   [8.2767 ms 8.2817 ms 8.2878 ms]
                        thrpt:  [159.08 MiB/s 159.20 MiB/s 159.29 MiB/s]
collapse/dtrace/12      time:   [3.8631 ms 3.8819 ms 3.9019 ms]
                        thrpt:  [337.89 MiB/s 339.63 MiB/s 341.28 MiB/s]

collapse/perf/1         time:   [16.386 ms 16.401 ms 16.416 ms]
                        thrpt:  [182.37 MiB/s 182.53 MiB/s 182.70 MiB/s]
collapse/perf/12        time:   [4.8056 ms 4.8254 ms 4.8460 ms]
                        thrpt:  [617.78 MiB/s 620.41 MiB/s 622.97 MiB/s]

collapse/sample         time:   [8.9132 ms 8.9196 ms 8.9264 ms]
                        thrpt:  [155.49 MiB/s 155.61 MiB/s 155.72 MiB/s]

flamegraph              time:   [16.071 ms 16.118 ms 16.215 ms]
                        thrpt:  [38.022 MiB/s 38.250 MiB/s 38.363 MiB/s]

我的笔记本电脑(Intel Core i7-8650U)得到

collapse/dtrace/1       time:   [8.3612 ms 8.3839 ms 8.4114 ms]
                        thrpt:  [156.74 MiB/s 157.25 MiB/s 157.68 MiB/s]
collapse/dtrace/8       time:   [3.4623 ms 3.4826 ms 3.5014 ms]
                        thrpt:  [376.54 MiB/s 378.58 MiB/s 380.79 MiB/s]

collapse/perf/1         time:   [15.723 ms 15.756 ms 15.798 ms]
                        thrpt:  [189.51 MiB/s 190.01 MiB/s 190.41 MiB/s]
collapse/perf/8         time:   [6.1391 ms 6.1554 ms 6.1715 ms]
                        thrpt:  [485.09 MiB/s 486.36 MiB/s 487.65 MiB/s]

collapse/sample         time:   [9.3194 ms 9.3429 ms 9.3719 ms]
                        thrpt:  [148.10 MiB/s 148.56 MiB/s 148.94 MiB/s]

flamegraph              time:   [16.490 ms 16.503 ms 16.518 ms]
                        thrpt:  [37.324 MiB/s 37.358 MiB/s 37.388 MiB/s]

许可

Inferno 是 @brendangregg 的出色原始 FlameGraph 项目的移植,该项目是用 Perl 编写的,并且它的存在以及几乎所有功能都完全归功于该项目。像 FlameGraph 一样,Inferno 根据CDDL 1.0许可,以避免任何许可问题。具体来说,CDDL 1.0 授予

在知识产权权利(除专利或商标外)下,提供一种全球范围内、免版税、非独占的许可,由初始开发者授权,用于使用、复制、修改、展示、表演、再许可和分发原始软件(或其部分),无论是否修改,以及/或作为更大作品的一部分;以及根据专利权要求,对于制造、使用或销售原始软件(或其部分)的行为侵犯专利权,有权制造、委托制造、使用、实施、销售、提供销售和/或以其他方式处置原始软件(或其部分)。

只要源代码与许可(3.1)一起提供,这两个条件都是真实的,因为你在阅读这个文件!

依赖关系

~2–11MB
~102K SLoC