在 kubernets pod 里使用 perf 直接调试 rust 程序

发布时间 2023-07-07 18:31:37作者: piperck

 

我们想要了解我们程序在运行时候的真实情况,但是感觉 rust 性能方面的调试真的比 go 麻烦非常多。

首先在 rust cargo.toml 中添加

[profile.release]
debug = true

 

直接在 pod 里面进行调试限制比较多,首先我们可能需要安装一些必要的东西比如 perf 本体

在 ubuntu 的环境下

apt-get update
apt install linux-perf

执行

perf record -g -p 1

会得到一些内核的报错信息,默认配置下指向我们的权限不足我们需要调整 node 上的一些内核参数

/proc/sys/kernel/perf_event_paranoid=1
/proc/sys/kernel/perf_event_mlock_kb 8192
cat /proc/sys/kernel/kptr_restrict 0

 

执行

perf record -g -p 1
过于会儿之后手动停掉采样使用

perf report 
查看报告

然后我们会看到这样一个报告

但是 symbol 的部分居然都是一些内存地址,看得人一头雾水。我们需要获得一些跟代码相关的信息

当然我们可能会觉得火焰图更好看一些,我们可以尝试使用 FlameGraph,我在测试环境将这个工具打包进 pod

然后在数据生成之后使用可以将已经生成好的 

perf.data => out.perf
perf script > out.perf

然后直接使用打包进去的 FlameGragh 工具生成 SVG 烈焰图即可

./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > flamegraph.svg

 

其实我感觉在生成了 data 之后,想办法从 pod 里面讲将数据拿出来分析会比较方便。pod 里面什么工具都没有还是比较麻烦的。