在 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