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 性能分析
275,751 每月下载量
在 238 个 Crates 中使用 (28 直接)
335KB
7K SLoC
Inferno 将 flamegraph 工具套件的某些部分移植到 Rust,旨在提高原始 flamegraph 工具的性能。主要关注加快 stackcollapse-*
工具的速度,该工具将各种分析工具的输出转换为 flamegraph 绘图工具所需的“折叠”格式。到目前为止,重点在于解析 perf
和 DTrace 的分析结果。在撰写本文时,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
最终您将得到这样的图像
获取性能分析数据
为了分析您的应用程序,您需要安装一个“性能分析器”。这可能是 Linux 上的perf
或bpftrace
,以及 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