Rust, Databend and the Cloud Warehouse (9) CPU and Memory profiling for Rust
/ 点击背景
Go 语言里做各种 CPU 和 Memory profiling 非常方便,尤其是火焰图这种可视化,排查问题非常方便,但是在Rust语言里,稍微有些困难,这次就来分享下如何使用工具对 Rust 程序进行 CPU 和 Memory 的火焰图分析。
为了支持 CPU 和 Memory Profiling,我们需要增加一些 API,比如在 Databend 中,它们的位置在:cpu/pprof.rs 和 mem/jeprof.rs 。
CPU Profiling
我们只需在 Databend 服务器上执行:
1 | 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
1 | cargo build --bin databend-query --release --features memory-profiling |
2. 使用 MALLOC_CONF
启动
1 | MALLOC_CONF=prof:true,lg_prof_interval:30 ./target/release/databend-query |
- lg_prof_interval:30, 1GiB(2^30 bytes)生成一次 Dump文件
3. 替换更快的 add2line-rs
1 | git clone https://github.com/gimli-rs/addr2line |
这样你的 jeprof 就会从 30 分钟飞速到 3 秒。
4. 升级 jeprof 到最新版本
由于旧版 jeprof 不支持火焰图的一些参数,需要对 jeprof 进行升级,由于 jeporf 是一个 perl 脚本,升级就比较暴力。
首先找出本机的jeprof文件的路径:
1 | whereis jeprof |
然后打开jeprof 最新版,拷贝并覆盖你本机的 jeprof,注意不要覆盖旧版本的这两个参数,否则会执行失败:
1 | my $JEPROF_VERSION = "5.2.1-0-gea6b3e973b477b8061e0076bb257dbd7f3faa756"; |
5. 生成火焰图
1 | 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