之前搞过一下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. java中的多线程入门

    进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 而多线程的好处就是效率高,充 ...

  2. PDF 补丁丁 0.6.0.3340 版发布(修复提取图片的问题)

    新的版本修复了两个导致提取图片颜色异常的问题.

  3. mysql索引的选择

    一:索引的常见模型 1.哈希表(key-value)存储的数据结构 缺点:hash索引在做区间查询时,速度慢. 优点:hash索引很适用于等值查询的场景,比如memcached以及其他一些nosql引 ...

  4. sqlserver数据库 视图相关

    1.首先创建一个视图 方法一:右键解决 方法二:脚本 create view view_test AS select * from t1 GO 2.删除视图 方法1:右键解决 方法2:脚本 if ex ...

  5. linux挂载数据盘步骤

    Linux添加新硬盘自动挂载硬盘的具体步骤 1.插入新硬盘,启动Linux服务器,使用fdisk -l 查看硬盘 #fdisk -l Disk /dev/sdb: 100GB, *********** ...

  6. Mysql基本操作命令【转载】

    原文链接:http://www.cnblogs.com/rookie-c/p/6425039.html 创建数据库 CREATE DATABASE name; 显示所有数据库 SHOW DATABAS ...

  7. laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题

    在Model里面加上下面这句,强制读主(写)库数据库,解决主从延迟问题. public static function boot() { //清空从连接,会自动使用主连接 DB::connection ...

  8. d3js可视化策略

    d3js是数据驱动图形的思路.基本可以这么理解,有什么样的图形,后面基本就有类似结构的数据.大概思路步骤如下: 一.适配数据格式 这一步主要是为第二部服务,第一步的结果作为第二部的入参. 比如,画层级 ...

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

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

  10. leetcode python 037 求解数独

    import numpy as npimport syssys.setrecursionlimit(1000) #例如这里设置为一百万 def get1(n):    if n<3:       ...