首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何使用火焰图对 Rust 程序进行性能和内存占用分析

如何使用火焰图对 Rust 程序进行性能和内存占用分析

作者头像
MikeLoveRust
发布2023-02-15 18:31:16
发布2023-02-15 18:31:16
3.1K0
举报

背景

Go 语言里做各种 CPU 和 Memory profiling 非常方便,尤其是火焰图这种可视化,排查问题非常方便,但是在Rust语言里,稍微有些困难,这次就来分享下如何使用工具对 Rust 程序进行 CPU 和 Memory 的火焰图分析。

为了支持 CPU 和 Memory Profiling,我们需要增加一些 API,比如在 Databend 中,它们的位置在:cpu/pprof.rs 和 mem/jeprof.rs 。

CPU Profiling

我们只需在 Databend 服务器上执行:

代码语言:javascript
复制
go tool pprof -http="0.0.0.0:8081" http://localhost:8080/debug/pprof/profile?seconds=30
  • localhost:8080, Databend 的管理地址和端口
  • 0.0.0.0:8081,go tool pprof server 地址
  • seconds=30,采集时间为 30 s

这样就可以在浏览器中打开地址: <your-ip>:8081/ui/flamegraph 查看 CPU 的火焰图了,非常方便。

Memory Profiling

Memory 的火焰图要复杂些,需要做一些前置工作。

1. Enable memory profiling

代码语言:javascript
复制
cargo build --bin databend-query --release --features memory-profiling

2. 使用 MALLOC_CONF 启动

代码语言:javascript
复制
MALLOC_CONF=prof:true,lg_prof_interval:30 ./target/release/databend-query
  • lg_prof_interval:30, 1GiB(2^30 bytes)生成一次 Dump文件

3. 替换更快的 add2line-rs

代码语言:javascript
复制
git clone https://github.com/gimli-rs/addr2line
cd addr2line
cargo b --examples -r
cp ./target/release/examples/addr2line <your-addr2line-find-with-whereis-addr2line>

这样你的 jeprof 就会从 30 分钟飞速到 3 秒。

4. 升级 jeprof 到最新版本

由于旧版 jeprof 不支持火焰图的一些参数,需要对 jeprof 进行升级,由于 jeporf 是一个 perl 脚本,升级就比较暴力。 首先找出本机的jeprof文件的路径:

代码语言:javascript
复制
whereis jeprof

然后打开jeprof 最新版,拷贝并覆盖你本机的 jeprof,注意不要覆盖旧版本的这两个参数,否则会执行失败:

代码语言:javascript
复制
my $JEPROF_VERSION = "5.2.1-0-gea6b3e973b477b8061e0076bb257dbd7f3faa756";
my $PPROF_VERSION = "2.0";

5. 生成火焰图

代码语言:javascript
复制
jeprof ./databend-query-main ./jeprof.206330.563.i563.heap --collapse | flamegraph.pl --reverse --invert --minwidth 3 > heap.svg
  • flamegraph.pl 需要从 github下载
  • databend-query-main,你的可执行文件路径
  • jeprof.206330.563.i563.heap,选取一个heap 文件

References

[1] brendangregg/FlameGraph [2] https://github.com/jemalloc/jemalloc/blob/dev/bin/jeprof.in [3] Databend, Cloud Lakehouse: https://github.com/datafuselabs/databend

关于 Databend

Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。

  • Databend 文档:https://databend.rs/
  • Twitter:https://twitter.com/Datafuse_Labs
  • Slack:https://datafusecloud.slack.com/
  • Wechat:Databend
  • GitHub :https://github.com/datafuselabs/databend
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我们只需在 Databend 服务器上执行:
  • Memory 的火焰图要复杂些,需要做一些前置工作。
    • 1. Enable memory profiling
    • 3. 替换更快的 add2line-rs
    • 4. 升级 jeprof 到最新版本
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档