skynet火焰图

    最近项目的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系统安装,简单很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值