春哥的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

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

时间: 2024-10-14 17:59:21

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

重新发现Oracle太美之awr相关脚本简单介绍

大家知道在$ORACLE_HOME/rdbms/admin下,有如下的相关脚本(我的环境为11.2.0.4.2): [[email protected] ~]$ cd $ORACLE_HOME/rdbms/admin [[email protected] admin]$ ls -ltr awr* -rw-r--r-- 1 oracle oinstall  1999 Oct 24  2003 awrrpt.sql -rw-r--r-- 1 oracle oinstall 49166 Sep  1

Liunx----Shell脚本简单介绍 Shell运行环境和Shell变量

Shell 脚本(shell script),是一种为 shell 编写的脚本程序. Shell 编程跟 java.php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了. Linux 的 Shell 种类众多,常见的有: Bourne Shell(/usr/bin/sh或/bin/sh) Bourne Again Shell(/bin/bash) C Shell(/usr/bin/csh) K Shell(/usr/bin/ksh) 默认为 #!/bin/bas

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

a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简单介绍 SystemTap是我眼下所知的最强大的内核调试工具,有些家伙甚至说它无所不能:) (1) 发展历程 Debuted in 2005 in Red Hat Enterprise Linux 4 Update 2 as a technology preview. After four years in development, System 1.0 was rel

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

1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Redis下载地址:wget http://download.redis.io/releases/redis-2.8.6.tar.gz 2.安装依赖包 yum install -y gcc gcc-c++ readline-devel pcre-devel openssl-devel tcl perl

nginx的安装与简单配置

安装环境:ubuntu 14.04 安装方式:源码安装 1.去官方网站https://nginx.org/en/download.html,下载一个稳定的版本.并解压. 2, 安装nginx的依赖包,一共有三个(资料来源与网络): 安装 prce: sudo apt-get update sudo apt-get install libpcre3 libpcre3-dev 安装 zlib: sudo apt-get install zlib1g-dev 安装openssl: sudo apt-g

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

GDB调试及其调试脚本的使用返回脚本百事通一.GDB调试 1.1. GDB 概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在 UNIX/Linux平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓“寸有所长,尺有所短”就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让

JS版按键精灵-精灵点点简明教程4 -- 编辑与调试脚本

摘要:如果你按着前面的说明一步一步操作过来的话,应该已经是不止一次的进入过[编辑界面]了.但是却没有真正的手写过一行脚本.下面我们就来手写我们的第一个点点脚本,Hello Jianjian. 要想写脚本,首先得进入[编辑界面], 这里我们从[主界面]点击[新建]按钮进入.进入后,在编辑框内,输入如下代码 目录   精灵点点简明教程1 -- 下载与安装 精灵点点简明教程2 -- 基本操作 精灵点点简明教程3 -- 录制脚本 精灵点点简明教程4 -- 编辑与调试脚本 精灵点点简明教程5 -- 编写扩

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

本人经过多次尝试,简单完成了自动部署Nginx和nfs脚本,并且能够自动部署web反向代理集群,下面详细的阐述一下本人的思路.(以下脚本本人处于初学阶段,写的并不是很完善,所以需要后期进行整理和修正,请高手能够多多指教.) 本脚本需要注意的是: 1.这是针对centOS6.8,32位操作系统写的脚本文件,如果想在cenOS7中运行,就需要有些改动 2.这个脚本需要先安装代理服务器部分,再安装反向代理服务器,因为涉及到共享文件夹挂载的问题,所以需要有先后顺序: 3.今后本人会对此脚本进行更新和完善

Google Chrome 调试JS简单教程[更新]

题外话,刚开始我写这篇内容只是将自己了解的一些知识放上来,不巧的是我分析了我的来访日志,很多朋友都有这个需求,为了大家没有白来,我决定充实下这篇文章.最近更新时间2014-02-14 chrome版本: 32.0.1700.107 m 我是一名忠实Chrome迷,使用它已经快有2年的历史了,整体给我的感觉就是清爽,快速,简洁.又打小广告了……^_^,虽然我知道IE8+也有调试工具,包括火狐的什么XXBUG,但是我用过之后,个人还是十分偏爱chrome的debug. chrome对于在前端打拼的兄