最近项目的skynet的CPU占用比较高,经常触发告警。用systemtap工具来跑一跑,找出性能热点蛮好。网上找了个库,使用了一下,有几个问题改了下。
1、lua 5.4的结构体加深了一层,所以几个 p->func->value_都需要修改为p->func->val->value_
2、获取函数在原文件行数的计算不对,我加了个C函数在stap脚本中来获取行数
%{
#include "/root/skynet/3rd/lua/lua.h"
#include "/root/skynet/3rd/lua/lstate.h"
%}
function get_line:long(pa:long,pf:long) %{
struct CallInfo *ci = (struct CallInfo *)STAP_ARG_pa;
struct Proto *f = (struct Proto *)STAP_ARG_pf;
int basepc;
int baseline;
int MAXIWTHABS = 128;
int ABSLINEINFO = -0x80;
int pc = (long)(ci->u.l.savedpc - f->code)-1;
printk("test 12");
if(f->lineinfo == NULL) STAP_RETURN(-1);
if (f->sizeabslineinfo == 0 || pc < f->abslineinfo[0].pc) {
basepc = -1; /* start from the beginning */
baseline = f->linedefined;
}
else {
int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */
while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc)
i++; /* low estimate; adjust it */
basepc = f->abslineinfo[i].pc;
baseline = f->abslineinfo[i].line;
}
while (basepc++ < pc) { /* walk until given instruction */
baseline += f->lineinfo[basepc]; /* correct line */
}
STAP_RETURN(baseline);
%}
c语言版的编译起来有点麻烦,需要改几个地方。整了个systemtap脚本版的: 版本4.8
lualib/mini_lua_bt.stp at master · yuanfengyun/lualib · GitHub
systemtap折腾起来还蛮扯,推荐用fedora系统安装,简单很多。