春哥的nginx systemtap调试脚本简单介绍
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
一、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调试脚本简单介绍的更多相关文章
- 用Py2exe打包Python脚本简单介绍
一.简述 Py2exe,从这个名字上就可以理解,把Python脚本转换为windows平台上面可以运行的可执行程序(*.exe)的工具.经过转换后,你可以不 用安装Python的执行环境就可 ...
- 内核调试神器SystemTap — 简单介绍与使用(一)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简单介绍 SystemTap是我眼下所知的最强大的内核调试工具,有些家伙甚 ...
- 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 ...
- 关于mysql和Apache以及nginx的监控脚本怎么写会比较好的记录
最近,自己业务进行上线,上线后,需要考虑的是对各种服务进行监控,包括(httpd服务,mysqld服务等),现在想以mysqld服务为例总结下那种方式的脚本最为专业和合理: (1).根据mysql的端 ...
- Linux gcc/g++下GDB调试及其调试脚本的使用
GDB调试及其调试脚本的使用返回脚本百事通一.GDB调试 1.1. GDB 概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB ...
- 自动部署Nginx和nfs并架设Nginx集群脚本
本人经过多次尝试,简单完成了自动部署Nginx和nfs脚本,并且能够自动部署web反向代理集群,下面详细的阐述一下本人的思路.(以下脚本本人处于初学阶段,写的并不是很完善,所以需要后期进行整理和修正, ...
- .net core2.0添加json文件并转化成类注入控制器使用 让js调试更简单—console
.net core2.0添加json文件并转化成类注入控制器使用 上一篇,我们介绍了如何读取自定义的json文件,数据是读取出来了,只是处理的时候太麻烦,需要一遍一遍写,很枯燥.那么有没有很好的办法呢 ...
- vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结
vue—你必须知道的 目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...
- [转]九个Console命令,让js调试更简单
转自:九个Console命令,让js调试更简单 一.显示信息的命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html ...
随机推荐
- Django ORM字段和字段参数
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- invalid LOC header (bad signature)
[产生原因] 本地maven仓库相关jar存在问题. [解决方案] 删除本地maven相关jar并重新下载.
- Python中的socket网络编程(TCP/IP,UDP)讲解
在网络编程中的一个基本组件就是套接字(socket).套接字基本上是两个端点的程序之间的"信息通道".程序可能分布在不同的计算机上,通过套接字互相发送信息.套接字包括两个:服务器套 ...
- java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment问题解决
2018-09-29 17:45:16.905 ERROR [pool-1-thread-1]o.s.scheduling.support.TaskUtils$LoggingErrorHandler. ...
- 01-封装函数求斐波那契数列第n项
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 分析Tapjoy的模式—分发用于ios设备的企业级应用程序
下面简单介绍下Tapjoy的模式,供大家参考: Tapjoy最初的合作模式:“按安装奖励”(pay-per-install) Tapjoy利用非常成功的奖励性下载模式影响了App Store的免费游戏 ...
- BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸 ——动态规划
状态设计的方法很巧妙,六个值 h1,h2,h3,t1,t2,t3,我们发现t1,t2,t3可以通过前缀和优化掉一维. 然后考虑把h留下还是t留下,如果留下h显然t是会发生改变的,一个int存不下. 如 ...
- USACO 2.1 The Castle
题目大意:给你一个城堡让你求有多少房间,最大房间有多大,敲掉一堵墙后最大的房间有多大,敲掉那座墙 思路:比较恶心的bfs题,反正就是bfs使劲敲 /*{ ID:a4298442 PROB:castle ...
- 【CCF】路径压缩 区间dp
[题意] 改编哈夫曼树,限制从左到右字母的编码按字典序递增 [思路] 因为是二进制编码,所以是二叉树: 因为是前缀码,所以每个字母都是叶子结点,不可能是内结点: 因为要按字典序递增,所以只能是相邻的结 ...
- linux文件夹作用
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...