火焰图分析openresty性能瓶颈,openresty瓶颈


注:本文操作基于CentOS 系统 准备工作   开始测试
#!/bin/sh
 
if [ $# -ne 3 ]
then
        echo "Usage: ./`basename $0` lua/c PID NAME"
        exit
fi
 
pid=$2
name=$3
 
if [ $1 == "lua" ]
then
        /opt/nginx-systemtap-toolkit/ngx-sample-lua-bt -p $pid --luajit20 -t 30 >temp.bt
        /opt/nginx-systemtap-toolkit/fix-lua-bt temp.bt >${name}.bt
elif [ $1 == "c" ]
then
        /opt/nginx-systemtap-toolkit/sample-bt -p $pid -t 10 -u > ${name}.bt
else
        echo "type is only lua/c"
        exit
fi
 
/opt/FlameGraph/stackcollapse-stap.pl ${name}.bt >${name}.cbt
/opt/FlameGraph/flamegraph.pl ${name}.cbt >${name}.svg
rm -f temp.bt ${name}.bt ${name}.cbt
  火焰图分析: 附上一张openresty C部分nginx的火焰图 火焰图上下表示函数调用栈(类似于gdb中bt命令看到的栈帧顺序),可以通过函数调用栈来定位到具体的执行路径;每一个函数的宽度表示该函数占用的cpu时间片,可以重点分析占用cpu时间片过多的函数。   后记: openresty提供的性能分析工具基于systemtap。systemtap 的核心思想是定义一个事件(event),以及给出处理该事件的句柄(Handler)。当一个特定的事件发生时,内核运行该处理句柄,就像快速调用一个子函数一样,处理完之后恢复到内核原始状态。这里有两个概念:
  • 事件(Event):systemtap 定义了很多种事件,例如进入或退出某个内核函数、定时器时间到、整个systemtap会话启动或退出等等。
  • 句柄(Handler):就是一些脚本语句,描述了当事件发生时要完成的工作,通常是从事件的上下文提取数据,将它们存入内部变量中,或者打印出来。
systemtap 工作原理是通过将脚本语句翻译成C语句,编译成内核模块。模块加载之后,将所有探测的事件以钩子的方式挂到内核上,当任何处理器上的某个事件发生时,相应钩子上句柄就会被执行。最后,当systemtap会话结束之后,钩子从内核上取下,移除模块。整个过程用一个命令 stap 就可以完成。 

相关内容

    暂无相关文章