luajit 2.1 用 lj-lua-stacks 获取到的火焰图只有一列是为什么?

196 views
Skip to first unread message

Heero Zhang

unread,
Apr 22, 2014, 5:53:37 AM4/22/14
to open...@googlegroups.com
章老师,

你好,实时分析lua性能的工具非常棒,我已经离不开他了,但是换到Luajit 2.1后好像无法使用了。不太清楚luajit2.1是否可以获取到火焰图?

我的系统:
ubuntu 12.04
uname -r
3.8.0-38-generic

我用openresty 1.5.11.1 和 1.5.12 rc3 都测试了,结果一样,如下:

我用
./sample-bt -p pid -t 5 -u > n.bt
对nginx查看火焰图应该是正常的,能显示出函数名,采取的样本数也正常,也像火焰。

ngx-sample-lua-bt 看文档的意思,这个是不是不能用于luajit 2.1?总之,这个运行没有结果,有时直接报错nginx进程就退出了:
ERROR: utrace_set_events returned error -114 on pid 3864
WARNING: task_finder inode-uprobes callback for task 3864 failed: -22


./stapxx/samples/lj-lua-stacks.sxx --arg time=5 --skip-badvars -x pid > temp.bt
这个运行获取到了采样,但是数量很少,100%的cpu只有100多个,堆栈都是笔直的,不像火焰,有时只有一列笔直的堆栈。

我已安装了linux-image-$(uname -r)-dbgsym,不知是有什么东西未做好,是不是这样使用的?

感谢。


Yichun Zhang (agentzh)

unread,
Apr 22, 2014, 2:52:35 PM4/22/14
to openresty
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
Reply all
Reply to author
Forward
0 new messages