Hello!
2014-04-22 2:53 GMT-07:00 Heero Zhang:
> 你好,实时分析lua性能的工具非常棒,我已经离不开他了,但是换到Luajit 2.1后好像无法使用了。不太清楚luajit2.1是否可以获取到火焰图?
>
我们一直在线上使用 stap++ 项目里的 lj-lua-stacks 工具来获取 LuaJIT 2.1 里的 Lua-land Flame
Graph. 同时也使用 Nginx Systemtap Toolkit 项目里的 sample-bt 工具来获取 C
级别或者汇编级别的火焰图(这个 sample-bt 工具是通用的,并不特定于 LuaJIT)。
> 我的系统:
> ubuntu 12.04
> uname -r
> 3.8.0-38-generic
>
推荐从官方源码编译 3.10.x 的 Linux 内核,并加上下面这个补丁:
http://agentzh.org/misc/kernel/linux-3.10.16-timer_hook_api.patch
Linux 3.8 的内核缺少 uretprobes 特性,有一些工具会需要它(不过火焰图工具并不需要 uretprobes)。
不过 3.8 的内核还有 timer hook API,所以你倒不用打上面那个 timer hook api 的补丁 :)
> 我用
> ./sample-bt -p pid -t 5 -u >
n.bt
> 对nginx查看火焰图应该是正常的,能显示出函数名,采取的样本数也正常,也像火焰。
>
Good.
> ngx-sample-lua-bt 看文档的意思,这个是不是不能用于luajit 2.1?
ngx-sample-lua-bt 只适用于 LuaJIT 2.0,不适用于 LuaJIT 2.1.
>
> ./stapxx/samples/lj-lua-stacks.sxx --arg time=5 --skip-badvars -x pid >
>
temp.bt
> 这个运行获取到了采样,但是数量很少,100%的cpu只有100多个,堆栈都是笔直的,不像火焰,有时只有一列笔直的堆栈。
>
这看起来是正常的,因为一般 Lua 调用栈的变化远不及 C 调用栈的变化多。你可以延长采样时间,比如 60 秒或者更长(即 --arg time=60)。
Regards,
-agentzh