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

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

首先在 rust cargo.toml 中添加

[profile.release]
debug = true

 

Profiling CPU

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

在 ubuntu 的环境下

apt-get update
apt-get install linux-tools-common linux-tools-generic linux-tools-`uname -r`

执行

perf record -F 99 -g -p 1
过于会儿之后手动停掉采样使用
perf report 
查看报告

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

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

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

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

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

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

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

当然如果你的 pod 可以连网,你完全可以在本地装一个 FlameGragh 使用命令

brew install flamegraph

 

然后在之前生成的 pod 机器上转换 perf.data 为 perf.unfold 然后下载下来执行后面两条命令即可。

# perf script -i perf.data &> perf.unfold                        

# ./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded              

# ./FlameGraph/flamegraph.pl perf.folded > perf.svg 

pod 里面比较难弄,用 transfer.sh 把 svg 弄到本地来看会是一个不错的选择。

https://transfer.sh/

 

或者我们可以直接用 kubectl 的命令

kubectl cp namespace/pod:/path/to/file /path/to/local/destination

 

posted @ 2023-07-07 18:25  piperck  阅读(94)  评论(0编辑  收藏  举报