https://github.com/openresty/openresty-systemtap-toolkit
https://sourceware.org/systemtap/langref/
https://github.com/brendangregg/FlameGraph
参考ngx-sample-lua-bt
现代linux 动态追踪技术 主要是基于 ebpf
systemtap 是 动态追踪的前端, 技术原理是 编译一个 类似c的脚本 生成 内核模块, 来监控用户空间的lua程序
对openResty的脚本改造两点,
1: 去掉nginx相关函数的 probe 探针
2:如何获取LuaState 状态机的方法 调整, 可以使用程序内部的 全局变量定义
if(\@defined(\@var("globalL", "$lua_path"))) {
L = \@var("globalL", "$lua_path")
}
对timer 采样也可以调整
timer.profile 每个CPU周期 timer.ms 是 定时毫秒
动态追踪核心:
定义probe 探针位置
定义timer 采样
在timer中判断 PID 进程ID, 来确定自己要观察的程序
timer.s 观察总时长后结束
systemtap 的堆栈格式是
一次堆栈每层 文件:行号 总共出现次数
fix-bt 之后 得到 lua 函数名字
flamegraph 的工具 stack stap 多行压缩到一行
最后生成 火焰图 分析
来源:oschina
链接:https://my.oschina.net/u/186074/blog/4310654