之前搞过一下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. 数据库 ACID

    ACID是指一个事务本质上有四个特点: Atomicity:原子性 Consistency:一致性 Isolation:隔离性 Durablilty:耐久性 原子性 原子性是指事务是一个不可分割的工作 ...

  2. dreamware2018破解

    dreamware2018破解     C:\Program Files\Adobe\Adobe Dreamweaver CC 2018      

  3. sql server中如何修改视图中的数据?

    sql server中如何修改视图中的数据? 我做个测试,视图的数据有标记字段时,如果是这种方式(0 as FlagState),是无法修改的 --创建视图语句 --- create view V_E ...

  4. unity室内外VR漫游

    这是一个用Unity 做的VR漫游小场景.

  5. SpringBoot 下 mybatis 的缓存

    背景: 说起 mybatis,作为 Java 程序员应该是无人不知,它是常用的数据库访问框架.与 Spring 和 Struts 组成了 Java Web 开发的三剑客--- SSM.当然随着 Spr ...

  6. 活代码LINQ——01

    序言 此系列的所有代码都是运行在Win 7 64位 + Visual Basic 2008 Express Edition的环境中 之所以学习List集合类,是因为我们先前学习的数组自身的缺陷: 1. ...

  7. 完全关闭及再次启动cdh集群

    关闭集群 - 关闭集群所有组件 关闭Cloudera Management Service 关闭cdh所有客户端节点 sudo /opt/cloudera-manager/cm-5.11.1/etc/ ...

  8. MapReduce实现Apriori算法

    Apiroi算法在Hadoop MapReduce上的实现 输入格式: 一行为一个Bucket 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 34 36 38 ...

  9. 作业:K-means算法应用:图片压缩

    from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import matplotlib. ...

  10. SQL-52 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列

    题目描述 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列CREATE TABLE `employees` (`emp_no` int(11) ...