zoukankan      html  css  js  c++  java
  • Skynet服务热点火焰图分析

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

    Skynet是一个轻量级的多线程在线游戏框架。线程作为worker,从服务的队列中抽出有消息的,然后处理上面的消息。服务间通过发消息来相互通信。目前服务主要是用Lua进行编写。

    以前做的火焰图工具,没法单独看一个skynet服务的堆栈,只能看到整个进程的。要想针对单个服务做优化分析,需要抓出skynet_context的地址,才能取到服务的id。一个服务对应的是一个Lua VM,在这个VM里,snlua.so会悄悄的将skynet_context地址塞进去REGISTRY。那么,我们只要将skynet_context取出来,然后判断skynet_context->handle即可。这看似简单的东西,在C里就一句话:

    struct skynet_context * ctx = lua_touserdata(L, lua_upvalueindex(1));

    但是,翻译成stap脚本后,就变成了:

            if (((((p->func))->tt_) == ((6 | (1 << 4))))) {
                next
            }
            else {
                gc = p->func->value_->gc
                closure = &@cast(gc, "GCUnion", @1)->cl
                func = &@cast(closure, "Closure", @1)->c //CClosure
                if (idx <= func->nupvalues) {
                    upvalue_type = func->upvalue[idx - 1]->tt_
                    if (upvalue_type != 2) {
                        next
                    } /* only this one can enter counter */
                    skynet_context = &@cast(func->upvalue[idx - 1]->value_->p, "skynet_context", @1)
                    /* service id in decimal*/
                    if (skynet_context->handle != strtol(@2, 10)) {
                        next
                    }
                } else {
                    next
                }
            }

    感谢gcc -E,帮我展开了一重重的宏……

    这个过程无比蛋疼,要将C翻译成stp脚本。stp可以保护新手,避免搞挂内核,但是随之而来的就是晦涩的指针运算魔法了。接下来打算试试用bcc写了

    Anyway,折腾出来一个火焰图:

    火焰图取材于在内核取样的数据点,纵向切一刀,表示当前时刻的lua栈。横向表示统计时间内,各个栈帧的占比。横向越长,时间越长。纵向越深,调用越深。颜色没有关系,可以忽略

    可以看到里面有个堆栈很高,说明调用深度很深,另外宽度也很大,说明调用频次占比高。后来定位了一下这个函数,发现是多调了一次aoi同步……

    优化后栈的深度变浅了,剩下的基本是压测脚本跑的内容了。栈深度还能优化一下,到C函数的调用层次不宜过多。

    好了,睡觉了……

  • 相关阅读:
    Flutter-动画-原理篇
    Flutter-动画-实践篇
    Flutter-动画-概念篇
    Android-textview图文混排(网络图片)
    Android--解决图片保存到相册显示1970年1月1日 8:00的问题
    Android--使用JobService实现进程保活
    Android--获取手机联系人和Sim卡联系人
    git 代码服务器的网页版gitweb的搭建
    Android 内存管理中的 Shallow heap Retained heap
    欧几里德算法----最大公约数算法
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/skynet_systemtap_for_service.html
Copyright © 2011-2022 走看看