之前搞过一下systemtap(systemtap折腾笔记),可惜很快琐事缠身,没有继续搞下去。最近偷空搞了一下,有点意思。

章大大的思路,是用perl生成systemtap脚本,从/proc/$pid/maps里面扫出liblua.so的地址。然后hook这个地址里,以luaL_*和lua_*开头的lua虚拟机C函数。hook住的函数里,都会有个参数L,这个L表示lua的虚拟机。接下来就是按lua的C代码撸一遍,看看怎么从L的内存结构里,dump出整个lua的运行栈。相当于在systemtap里,重新实现一遍官方的debug.traceback。

换到skynet里实现,有几个不同点。首先,skynet是把lua静态编译进去的,所以无法找到liblua.so。其实这样问题更简单了,不需要扫so的地址,只要hook住skynet里的相关函数,一样可以拿到L的地址。其次,是skynet用的是魔改版的lua,所以proto的位置与官方版有点不同,而且现在用的是lua53了,跟openresty的lua51比还是有差异的。我实现了一版给skynet用的lua-bt,参见skynet_systemtap_set仓库里的mini_lua_bt.stp

做出来的效果就是上图这样。因为没有用户登录,所以只有一个exchange服务在跑。这个服务是用于和平台通讯的,所以会定时处理一些消息。

目前还有点小问题,有时候同一个栈位置会打印两次,还没找到原因。另一个是目前打印的是文件名和行数,没有函数名直观。但是lua的函数其实只是一个指针,可以给这个指针绑定不同的名字,都是同一个函数,而且代码里还有大量的匿名函数,所以不好搞出来函数名。另外,从skynet的结构来说,其实可以找到更接近业务层的点。skynet底层是socket-server,然后用sn-lua跑lua服务,再用lua-skynet.c为lua服务提供skynet的接口。hook住lua-skynet的lcallback,应该就能看到skynet调lua业务的东西了。不过这个还没搞好……

接下来再慢慢补充一下其他类型的脚本。。

skynet的火焰图的更多相关文章

  1. Skynet服务热点火焰图分析

    最近花了一周时间对场景服务进行热点分析,利用以前的火焰图工具做了一点微小的贡献,分享下心得(仓库地址在https://github.com/spin6lock/skynet_systemtap_set ...

  2. 火焰图分析openresty性能瓶颈

    注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...

  3. 动态追踪技术(中) - Dtrace、SystemTap、火焰图

    http://openresty.org/cn/presentations.html http://weibo.com/agentzh?is_all=1 http://openresty.org/po ...

  4. 使用perf生成Flame Graph(火焰图)

      具体的步骤参见这里: <flame graph:图形化perf call stack数据的小工具>   使用SystemTap脚本制作火焰图,内存较少时,分配存储采样的数组可能失败,需 ...

  5. 使用linux perf工具生成java程序火焰图

    pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...

  6. perf + Flame Graph火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  7. Linux程序性能分析和火焰图

    Linux程序性能分析和火焰图 Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多.其中应用分析性能方面Dtrace, Syst ...

  8. CPU火焰图

    y轴:栈深度 x轴:cpu时间 长方形:一个栈(方法) 长度:出现在监视器中的时长(占用cpu的时间) 其他:从左到右的顺序只是按字母排序,无其他意义 火焰图就是看顶层的哪个函数占据的宽度最大.只要有 ...

  9. 033_linux操作系统火焰图探测系统性能

    火焰图是定位疑难杂症的神器,比如 CPU 占用高.内存泄漏等问题.特别是 Lua 级别的火焰图,可以定位到函数和代码级别. 一.研究 https://moonbingbing.gitbooks.io/ ...

随机推荐

  1. laravel清缓存,flex简单使用

    关于laravel 删除视图缓存:php artisan view:clear 清除运行缓存:php artisan cache:clear 清除配置缓存:php artisan config:cle ...

  2. js判断一个字符串是否是回文字符串

    回文字符串:即字符串从前往后读和从后往前读字符顺序是一致的. 如:字符串abccba,从前往后读是a-b-c-c-b-a:从后往前读也是a-b-c-c-b-a 方法一 function palindR ...

  3. CentOS 7 常用命令大全

    CentOS7 常用命令集合 这两天一直在对CentOS 7.2进行初体验,各种学习命令肿么用,不过其实大多和DOS是一样的,只是命令的表达上可能有点儿不一样,毕竟这些都不是一家出来的嘛~ 废话不多说 ...

  4. nodejs操作 mongoose(mongodb)和Sequelize(mysql)查询数据后添加新属性未生效

    最近在着手koa时候,发现mongoose(mongodb)查询数据库后添加新属性,前端拿不到新属性问题, 然后测试了一下Sequelize(mysql),发现也有同样的问题存在.此时着手干! 1.1 ...

  5. MFC如何在树形图边上添加动态小地图

    MFC如何在树形图边上添加动态小地图 https://www.jianshu.com/p/7b1d828bf5db (简书无法识别缩进的...早知道先在博客园发了) (转载请注明出处) 作者:梦镜谷雨 ...

  6. JAVAEE第七周

    JSON 一.什么是JSON -JSON指的是JavaScript对象表示法(Javascript Object Notation) -JSON是轻量级的文本数据交换格式 -JSON独立于语言 -JS ...

  7. linux 常见报错

    yum install 包名        出现安装包重复,同一个安装包出现多版本 使用 rpm -qa |grep 包名 如果出现包名,则说明已存在该包(已被安装),要安装新版本的,可以卸载已装的y ...

  8. hive常用操作

    相关显示参数设置 显示参数设置 set hive.cli.print.header=true; // 打印列名 set hive.cli.print.row.to.vertical=true; // ...

  9. 实时输出topk最频繁变动的股价

    网上看到了一道关于bloomburg的面试题,follow 评论的思路 自己试着写了一个HashHeap的实现. 基本思路是维护一个大小为K的最小堆,里面是topK股价变动的公司ID(假设ID是Int ...

  10. 第4次作业 -- 基于Jenkins的持续集成

    Jenkins 配置使用心得 先在 https://jenkins.io/download/ 下载Jenkins 下载之后安装,在指定的地方找到了初始密码,安装了一些插件之后,Jenkins就可以使用 ...