http://card.weibo.com/article/h5/s#cid=2304185311ad2d0102v9gd&vid=0&extparam=&from=1110006030&wm=0&ip=111.23.134.60

http://blog.sina.cn/dpool/blog/s/blog_5311ad2d0102v9gd.html

2015-01-22 19:45阅读 659
其实下面要说的没多少硬货,算是个自己这些日子使用春哥写的那几个systemtap脚本调优的经验总结吧。
一、systemtap安装
      因为一直在ubuntu上使用,所以安装很简单 sudo apt-get installsystemtap,源码安装的话请参考这篇文章:http://www.cnblogs.com/hazir/p/systemtap_introduction.html中的方法一。

二、内核调试信息
     不用跟踪内核态性能大概也不需要,不过保不齐会用到所以我也把内核调试信息搞上了。对于ubuntu这种发行版内核来说好处是官方已经提供了(URL:http://ddebs.ubuntu.com/pool/main/l/linux/),根据自己的内核(uname-a 查询)挑选版本。 如我的是Linux ubuntu 3.13.0-32-generic那么对应的就是:linux-image-3.13.0-32-generic-dbgsym_3.13.0-32.57_amd64.ddeb。
     下载后用 dpkg -ilinux-image-3.13.0-32-generic-dbgsym_3.13.0-32.57_amd64.ddeb安装。

三、Hello Systemtap!
      上面这些完成以后可以使用命令:sudo stap -ve 'probe begin { log("hello Systemtap!")exit() }' 来测试是否安装成功。如果成功的话会有类似下面的输出:

四、nginx-systemtap-toolkit
     进入正题,这个就是主要介绍的章亦春大神写的systemtap nginx调试的系列脚本了(URL:Github地址),提供了活动请求的查询、ngx_lua模块的当前lua堆栈查看、pcre模式串/运行时间分析、C堆栈采样等等炸裂功能。
     首先介绍下C堆栈采样这个脚本,结合Brendan Gregg大神写的FlameGraph tools(URL:https://github.com/brendangregg/FlameGraph),可以画出功能实用、看着酷炫的火焰图。如图:
这个东西的原理就是在程序运行的时候每隔一定的时间对指定进程的C堆栈进行采样,将当前各栈帧的函数名保存起来。因为采样时间是恒定的,所以最后的结果上如果一个函数占用cpu时间越长,那么得到的采样次数也就越多,最后反映到火焰图上的横轴长度就越长。另外颜色深浅其实没什么含义,只是方便查看。
     使用方法:
1、首先确定编译的代码要带有调试i信息,以便调试脚本可以获得具体的代码信息。如nginx就要加上--with-debug开关。
2、其次要调优的进程已经启动,并且获得其pid,对于nginx这种多进程的程序,需要找到一个worker进程的pid,所以如果是开发环境调优的话,可以考虑使用单进程跑nginx。
3、命令sudo ./nginx-systemtap-toolkit/sample-bt -p 1147 -u -t 20 >trace.txt
     其中-p  指定进程的pid
            -u  追踪用户态的调用堆栈(也可以使用-k追踪程序运行期间在内核态的堆栈)
            -t  脚本的运行时间,达到时间之后脚本自动停止,将堆栈信息输出,单位为秒
      启动后会有类似的信息:
    WARNING: Tracing 1147 (/home/kawaru/nginx/sbin/nginx) in user-spaceonly...
    提示已经开始跟踪,这是可以用ab等等东西打点流量,等20秒之后会显示:
    WARNING: Time's up. Quitting now...(it may take a while)
    这时候有可能需要多等一会,成功完成后会在trace.txt里看到类似

一堆堆栈信息。
4、制作火焰图,这时就需要用到flame graph tools了,一共分为两步:
    一个是根据不同工具生成的堆栈信息转化为一个调用计数结果,因为我们用的是systemtap生成的,所以使用stackcollapse-stap.pl这个脚本,命令如下:
     ./FlameGraph/stackcollapse-stap.pl ./trace.txt > trace.out
    之后再使用flamegraph.pl生成最终的svg格式的火焰图,命令:
     ./FlameGraph/flamegraph.pl ./trace.out > trace.svg
    最后就可以看到浏览器里打开trace.svg,看到酷炫的火焰图了:

上面介绍的是sample-bt这个脚本,比较适用于cpu占用较高时对低效代码的排查,如果cpu占用不高,但运行的效率还是很低可以考虑是否是阻塞在io上,这时可以使用sample-bt-off-cpu这个脚本,查看io阻塞在哪段代码上,以便着手优化,使用方法差不多就不单独介绍了。

另外一个比较实用的是ngx-pcre-stats 这个,可以追踪nginx运行过程中跑pcre正则的性能,具体使用:
sudo ./ngx-pcre-stats -p 11276 --total-time-top --luajit20
-p             进程pid
--luajit20  根据系统里用的是lua5.1还是luajit2.0分别使用--lua51或者--luajit20
--total-time-top  追踪时的针对的项目,一共有四个除了total-time-top这个追踪单个正则总计运行时间外,还有--exec-time-dist:查看正则运行时间分布,--worst-time-top,运行时间最差情况的十条正则;--data-len-dist正则匹配时匹配串的长度分布。这四个项目每次运行时候选择一个使用。
-t     跟踪时间,单位为秒,不指定的话ctrl-c结束。
使用效果:

可以看出最差情况下第一条运行时间消耗比较多,这时就可以考虑使用常用的正则优化手段进行优化,比如使用非贪婪模式,减少不必要的不定长量词的使用等等。

其他几个脚本用处也很大,可以参考春哥的那个github页面上的介绍。除了nginx-systemtap-toolkit外,春哥还有个stap++,是对systemtap的一个简单扩展,功能也很多可以自行研究。

参考资料:
systemtap安装:http://www.cnblogs.com/hazir/p/systemtap_introduction.html 
nginx-systemtap-toolkit:https://github.com/openresty/nginx-systemtap-toolkit
stap++:https://github.com/openresty/stapxx
FlamgGraph tools:https://github.com/brendangregg/FlameGraph

春哥的nginx systemtap调试脚本简单介绍的更多相关文章

  1. 用Py2exe打包Python脚本简单介绍

    一.简述      Py2exe,从这个名字上就可以理解,把Python脚本转换为windows平台上面可以运行的可执行程序(*.exe)的工具.经过转换后,你可以不 用安装Python的执行环境就可 ...

  2. 内核调试神器SystemTap — 简单介绍与使用(一)

    a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简单介绍 SystemTap是我眼下所知的最强大的内核调试工具,有些家伙甚 ...

  3. CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

    1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...

  4. 关于mysql和Apache以及nginx的监控脚本怎么写会比较好的记录

    最近,自己业务进行上线,上线后,需要考虑的是对各种服务进行监控,包括(httpd服务,mysqld服务等),现在想以mysqld服务为例总结下那种方式的脚本最为专业和合理: (1).根据mysql的端 ...

  5. Linux gcc/g++下GDB调试及其调试脚本的使用

    GDB调试及其调试脚本的使用返回脚本百事通一.GDB调试 1.1. GDB 概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB ...

  6. 自动部署Nginx和nfs并架设Nginx集群脚本

    本人经过多次尝试,简单完成了自动部署Nginx和nfs脚本,并且能够自动部署web反向代理集群,下面详细的阐述一下本人的思路.(以下脚本本人处于初学阶段,写的并不是很完善,所以需要后期进行整理和修正, ...

  7. .net core2.0添加json文件并转化成类注入控制器使用 让js调试更简单—console

    .net core2.0添加json文件并转化成类注入控制器使用 上一篇,我们介绍了如何读取自定义的json文件,数据是读取出来了,只是处理的时候太麻烦,需要一遍一遍写,很枯燥.那么有没有很好的办法呢 ...

  8. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  9. [转]九个Console命令,让js调试更简单

    转自:九个Console命令,让js调试更简单 一.显示信息的命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html ...

随机推荐

  1. CentOS7支持中文显示

    1.查看系统是否安装有中文语言包 locale -a | grep "zh_CN"     命令含义:列出所有可用的公共语言环境的名称,包含有"zh_CN" 若 ...

  2. 【贪心 堆】luoguP2672 推销员

    堆维护,贪心做法 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为S ...

  3. 暴力解说之首次部署NGINX

    前言 本章基于Centos 7.x系统讲解 本章讲解下在项目上线部署的时候对NGINX的操作.有些童鞋在网上百度类似LNMP安装就跟着命令一条一条执行了,如果没报错还好,一旦报错就懵逼状态了.这是对自 ...

  4. python中魔法方法(持续更新)

    1.对于一个自定义的类,如果实现了 __call__ 方法,那么该类的实例对象的行为就是一个函数,是一个可以被调用(callable)的对象.例如: class Add: def __init__(s ...

  5. Java技术——Java中的内存泄漏

    . OOM的常见类型 按照JVM规范,JAVA虚拟机在运行时会管理以下的内存区域: 程序计数器:当前线程执行的字节码的行号指示器,线程私有. JAVA虚拟机栈:Java方法执行的内存模型,每个Java ...

  6. 2019年最新 Python 模拟登录知乎 支持验证码

    知乎的登录页面已经改版多次,加强了身份验证,网络上大部分模拟登录均已失效,所以我重写了一份完整的,并实现了提交验证码 (包括中文验证码),本文我对分析过程和代码进行步骤分解,完整的代码请见末尾 Git ...

  7. 洛谷P3961 图的遍历

    题目来源 做这道题的方法不少. 在这里我只提一种 就是大法师. 可以采用反向建边,从最大的点开始dfs 我们考虑每次从所剩点中最大的一个点出发,我们暂且称它为i,而凡是i这个点所能到达的点,可以到达的 ...

  8. java 位向量

    public class BitVectory { private int count; private int[] a; private static final int BIT_LEN = 32; ...

  9. python 中zip()函数的使用

    zip(*iterables)函数的定义: zip()函数的对象Iterables,iterables可以有多个参数(元组,列表等可迭代对象)组成.通过zip()函数返回一组元组数据,每个元组中的第i ...

  10. 紫书第五章训练3 D - Throwing cards away I

    D - Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the top ...