Rust中实现内存与性能可视化分析的工具有哪些? - Reddit

22-05-16 banq

Rust有没有像go语言中pprof这样的内存和性能可视化分析工具?

1、可使用https://github.com/KDE/heaptrack实现内存分析,虽然不是特定针对Rust

2、Rust 使用与 C++ 相同的工具,而 Golang 需要使用为 Golang 制作的特定工具。
对于内存分配分析,可以尝试https://docs.rs/dhat/latest/dhat/。但基本上任何 C/C++ 工具都应该可以工作。

3、在 Linux 上,我很高兴与Firefox Profiler for GUIperf结合使用。使用该组合的指南在这里

4、根据我对pprof和剖析LLVM/Clang编译的代码的了解(我自己是Go开发者),pprof是不分语言的(Google已经在剖析方面做了一段时间的实验,比如gperftools),它不与Go剖析挂钩,只要你有调试符号,你就可以剖析。

另外,还有其他工具,比如KCachegrind和Callgrind,用于其他类型的剖析,甚至LLVM中也有一些内置的工具,虽然我不确定Rust是否支持它们,但我们一直看到覆盖率支持在进行,所以如果目前不支持,它可能在某个时候会支持。此外,我认为LLVM并没有提供与GCC相同的编译时剖析功能,尽管今年已经/正在进行这方面的讨论。

就我个人而言,我更喜欢使用跟踪和导出到TimescaleDB的手动仪器,因为我可以实时了解生产代码,并针对实际情况进行优化,但我也可以获得开发代码的跟踪数据,以帮助找到开发过程中的慢点和热点,以及我认为相关的附加元数据。

根据我的经验,对那些没有运行时(或编译时代码仪表,如gcc)的语言产生的代码进行剖析是非常棘手的,即使是调试/开发剖析也有一些优化的特点,像async/await这样的高级结构对剖析器来说并不明显,而且它们有一些角落的情况,要么导致崩溃,要么在剖析器中出现UB(意外行为),或者得出难以理解的剖析数据。它们可以被使用,但我不认为它们应该是你最好的选择。

做人工剖析,使用cargo-criterion设置一些基准来发现算法的退步(但要确保总是在同一环境下运行),测量速度慢的部分的时间复杂性,并在可能的情况下使用剖析器来发现其他问题,但不要只依赖它。

剖析器和采样器总是我的最后手段,即使在我使用Java的时候(我有8年的经验),它有一些最好的剖析和采样的工具。有一些原因,但我不会把它延伸得更远(因为文章已经很长了)。

5、看看: https://nnethercote.github.io/perf-book/profiling.html

6、也许cargo-flamegraph对你有用

7、对于内存,您还可以尝试Bytehound,这是我不久前写的一个内存分析器。尽管它是用 Rust 编写的并且具有 Rust 特定的功能,例如自动 Rust 符号解构或对 jemalloc 的支持,但它在技术上并不是特定于 Rust 的。它还具有 GUI,并具有用于分析的内置脚本 DSL

 

猜你喜欢