之前写过一篇文章Nginx调试必备,介绍了几种调试Nginx的工具,包括echo、lua、njs,这些工具,都只是方便输出或者打印日志输出一些变量等,方便运维人员查看变量输出,或者自定义变量赋值等
在Nginx执行阶段详解中又介绍了通过开启debug的方式编译nginx,在nginx的error.log文件中可以更加详细的看到nginx的内部调用过程
其实在nginx官方文档中,介绍了一种能够更彻底了解nginx内部代码执行、函数调用以及内核调用的方式,那就是利用DTrace
DTrace是一种动态跟踪(Dynamic Tracing)技术,动态跟踪技术是一种在不修改源码或配置,不重启服务,在系统继续运行的前提下,分析、定位问题的方法
动态跟踪相比于其他debug方式,它的优点在于,一般不需要目标应用来配合,通常是随时运行,随时进行采样,随时结束采样,而不用管目标系统的当前状态,另外一个优点就是它自身的性能损耗极小,通常在百分之5,甚至更低,而且它的性能损坏只发生在采样的那段很短的事件,这就为生产环境调试带来极大的方便
而DTrace算是动态跟踪技术的鼻祖,它诞生于Solaris操作系统,是由原来的Sun Micorsystems公司的工程师编写的,更多DTrace的资料,可以通过Brendan的个人博客来了解,虽然优点老了,但是里面可以学习的东西很多,文章最后有地址
说回DTrace跟踪Nginx,在Nginx官方文档中,提供了DTrace脚本文件,可以直接下载,下载后就可以直接运行来动态跟踪Nginx
DTrace在CentOS无法直接安装,源里面没有,需要添加oracle linux的yum源
然后yum 安装oraclelinux-release-el7,安装完成后,关闭上面添加的临时的oracle linux的yum源,接着就可以通过yum安装DTrace
如果遇到gpgcheck检查错误,要么关闭检查,要么从下载校验文件
安装完成后就可以用dtrace了
接着从nginx官网DTrace介绍页面下载已经写好的DTrace脚本,通过dtrace指定nginx进程PID就可以分析了
但是DTrace毕竟是Sun的产物,对于CentOS不太兼容,需要修改内核,添加DTrace的驱动,而且3.8以上内核驱动都已经不维护了,对于生产环境排查故障来说,显然不太适合,所以这里介绍更适合CentOS的工具systemtap
SystemTap也是开源的动态跟踪工具,可以跟踪linux内核态以及用户态,收集详细的信息供开发或运维人员分析及诊断问题
CentOS安装systemtap就很简单了,直接yum安装就可以
systemtap依赖内核扩展包,所以需要安装对应内核版本的扩展包,否则会报错找不到需要的包
安装所需内核扩展包,可以通过stap-prep查看需要的包
接着安装这几个包就可以,安装包也可以通过http://rpm.pbone.net这里找自己内核版本对应的包,或者通过http://debuginfo.centos.org找对应内核的包
安装完成后,可以通过简单的脚本来验证系统是否已经支持systemtap
验证支持后就可以开始使用systemtap动态分析nginx了,不过nginx官网只提供了DTrace的脚本,如果你对systemtap不熟悉,可以找大神写的openresty-systemtap-toolkit工具,里面包含了已经写好的很多Systemtap分析openresty的脚本,对nginx、luaJIT、ngx_lua分析都可以使用,地址见文末
openresty的脚本已经很久不更新了,如果你需要分析新版本的nginx,那么你还是需要学习systemtap用法,或者是用官方提供的DTrace的脚本,转换为SystemTap脚本,SystemTap官网提供了DTrace转换SystemTap脚本的步骤,具体可查看SystemTap官网
Brendan博客:http://dtrace.org/blogs/brendan/
Nginx官方文档:http://nginx.org/en/docs/nginx_dtrace_pid_provider.html#see_also
DTrace 文档:http://dtrace.org/guide/preface.html#preface
systemtap官方文档:https://sourceware.org/systemtap/wiki
openresty-systemtap-toolkit:https://github.com/openresty/openresty-systemtap-toolkit