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. [HIHO] 1050 树中的最长路

    #1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...

  2. perl学习之内置变量

    Perl内置特殊变量   一.正则表达式特殊变量:1.$n  :包含上次模式匹配的第n个子串2.$& :前一次成功模式匹配的字符串3.$`  :前次匹配成功的子串之前的内容4.$’ :前次匹配 ...

  3. perl:split函数用法

    本文和大家重点讨论一下Perl split函数的用法,Perl中的一个非常有用的函数是Perl split函数-把字符串进行分割并把分割后的结果放入数组中.这个Perl split函数使用规则表达式( ...

  4. 合肥工业大学数据结构上机实验代码与实验报告(全)github地址

    我已经将这个学期的所有数据结构上机实验的代码与报告上传到github上了,一直都有这个想法,但没抽出时间来学习git.经过上周简单的练习后,我已经基本学会运营自己的代码仓库了.所有代码都是C++写的类 ...

  5. git 打补丁,即git review之后需要二次修改并提交代码

    假如代码已经push上去了,可是当review时,发现有地方需要修改,你可以继续在本地修改你的文件,之后git status查看修改的文件,然后git add修改的文件,此时不能直接git commi ...

  6. centos 服务器配置

    安装防火墙 安装Apache 安装MySQL 安装PHP 安装JDK 安装Tomcat 服务器上搭建Apache +MySQL+PHP +JDK +Tomcat环境,用的是Linux Centos7. ...

  7. saltstack管理八之常用执行模块

    所有执行模块: http://docs.saltstack.cn/zh_CN/latest/ref/states/all/index.html 常用模块:cmd, cron, file, mount, ...

  8. app启动画面(prepo)

    IPhone启动画面以及图标的设置 目前IPhone的分辨率为:320X480.640X960.640X1136. Default.png                    320X480 iPh ...

  9. kali2018利用ss和ProxyChains实现任意应用代理

    第一步:配置ss 第二步:配置proxychain vim /etc/proxychains.conf 第三步:使用proxychains 终端输入: proxychains firefox 通过代理 ...

  10. zabbix的安装(一)监控os资源:内存,cpu,io,负载,带宽

    一.Linux下开源监控系统简单介绍1)cacti:存储数据能力强,报警性能差2)nagios:报警性能差,存储数据仅有简单的一段可以判断是否在合理范围内的数据长度,储存在内存中.比如,连续采样数据存 ...