• 火焰图分析openresty性能瓶颈


    注:本文操作基于CentOS 系统
    准备工作
    1. 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包,然后解压、./configure; make; make install 安装到目标主机;执行命令 stap -ve 'probe begin { log("hello systemtap!") exit() }' 如果提示pass 5: run completed ... 就表示安装成功。
    2. 安装内核开发包、调试包(需要查看内核函数)yum install kernel-devel; yum install kernel-debuginfo (需要观察内核级函数时)。
    3. 用wget从https://github.com/openresty/nginx-systemtap-toolkit下载最新的openresty调试工具,然后解压到/opt即可。
    4. 用wget从https://github.com/brendangregg/FlameGraph下载最新的FlameGraph(火焰图),然后解压到/opt即可。
     
    开始测试
    1. 配置openresty中的worker_processes、worker_cpu_affinity,然后启动openresty。
    2. 利用压测工具开始向openresty起压,统计QPS变化。
    3. 使用如下脚本生成火焰图(注:该脚本需要三个参数:分析的对象c表示nginx部分、lua表示lua脚本部分, PID是要分析的一个worker进程, NAME是生成火焰图的名称) 大家可以根据自己的实际环境对脚本进行修改
    #!/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 就可以完成。 
  • 相关阅读:
    JavaScript之美读书笔记一
    关于form与表单操作
    正则表达式中的字符转义
    [codeforces 391D2]Supercollider
    [AMPPZ 2013]Bytehattan
    [那些你所不知道的鬼畜写法]平衡树学习笔记
    [AHOI 2006][BZOJ 1269]文本编辑器editor
    [BZOJ 3622]已经没有什么好害怕的了
    [POI 2008]Mafia
    [POI 2008][BZOJ 1132]Tro
  • 原文地址:https://www.cnblogs.com/sxhlinux/p/6250619.html
Copyright © 2020-2023  润新知