最近在搞skynet生成火焰图, github 上刚好有解决方案 skynet_systemtap_set,但代码比较老旧,不支持新版的 skynet 及 lua5.4
生成火焰图的原理是,利用 systemtap 抓取 lua栈,分析函数代码的热路径。
所以,我在他的基础上,主要处理以下两个问题:
1. lua5.4 内部数据结构做了调整,取代码文件地址、代码行数也有改动。
2. skynet shareproto 结构调整
我修改完的代码也放在github分享,有兴趣的小伙伴可以围观 skynet_systemtap_set
火焰图效果:
这里,我简单写了例子,测了火焰图效果。
使用依赖:
使用前,要先安装 systemtap:
在 CentOS/RHEL 系统上安装:
yum install -y systemtap kernel-devel-$(uname -r)
在 Ubuntu/Debian 系统上安装:
apt install -y systemtap linux-headers-$(uname -r)
使用 systemtap 时,需要 root 权限,或者使用 sudo
使用说明:
./monitor_skynet_and_gen_svg.sh skynet_pid skynet_bin_path serviceid seconds proj_path
字段 | 说明 |
---|---|
skynet_pid | skynet进程id |
skynet_bin_path | skynet程序地址 |
serviceid | skynet服务id(10进制) |
seconds | 数据采集时间 |
proj_path | 项目路径 |
最后
不建议在生产环境使用,如果一定要这么做,改下 monitor_skynet_and_gen_svg.sh 脚本,只保留 systemtap 抓取 lua 栈的结果。其他的脚本,如lua代码行数查找函数名和生成火焰图,则放在测试机子执行,特别是生成火焰图,性能消耗比较大。