使用Systemtap生成Flame Graph(火焰图)

  参考资料: 《Systemtap生成Flame Graph(火焰图)》
之所以再写一篇博客,主要是原文的内容显示的有问题,直接贴文章中的脚本有问题,另外文章中也没有说明可能遇到的一些问题。
以下的安装步骤是在CentOS 6.4下进行的,内核版本是2.6.32-358.el6.x86_64,选择的应用软件是nginx-1.4.2。
1、检查内核是否提供utrace/uprobes用户态支持
打开/boot/config-2.6.32-358.el6.x86_64文件(内核版本不同,文件名不同),检查CONFIG_UTRACE宏是否设置。如果没有,很遗憾,要么自己打上补丁重新编译内核,或者选择其他的内核版本。
2、安装所需要的包
Systemtap的安装需要systemtap和systemtap-runtime rpm包。由于SystemTap是将脚本编译成内核模块然后插入到系统中,需要内核源码树,因此要安装kernel-devel、kernel-debuginfo、kernel-debuginfo-common包。debuginfo包在 debuginfo.centos.org下载。
3、编写SystemTap脚本
global bt
global quit = 0

probe timer.profile {
if (pid() == target()) {
if ( !quit) {
bt[backtrace(), ubacktrace()] << < 1
} else {
foreach ([sys, usr] in bt - limit 1000) {
print_stack(sys)
print_ustack(usr)
printf( "\t%d\n", @count(bt[sys, usr]))
}
exit()
}
}
}

probe timer.s( 20) {
quit = 1
}
脚本的主要功能是在每个时钟tick都进行一次采样,采集的指定进程的内核栈信息和用户态栈信息,20s后开始退出,并输出结果。将上面的脚本保存在fire.stp。
4、对nginx进行压测并执行脚本
使用ab、polygraph等工具对nginx进行压测,然后执行脚本,命令如下:
stap --ldd -d /usr/local/nginx/sbin/nginx \
--all -modules -D MAXMAPENTRIES = 10240 \
-D MAXACTION = 20000 \
-D MAXTRACE = 100 \
-D MAXSTRINGLEN = 4096 \
-D MAXBACKTRACE = 100 -x 1750 fire.stp >a.out
-d选项指定需要的符号信息来源,这里指定的就是可执行文件的路径,注意在编译nginx时要加上-g选项。-D选项是用来设置一些宏,这里用到的宏都是一些关于资源限制的,根据自己的环境修改,具体的含义参见man stap。-x用来指定针对的进程,从nginx的work进程中选择一个即可。fire.stp是脚本文件,a.out用来存储输出,用于在后面生成火焰图。
前面已经检查了运行stap脚本所需要的环境,但是在执行这步的话还是可能会报下面的警告:
WARNING: Missing unwind data for module, rerun with 'stap -d stap_554dc449843d32431205d7d8e384a4e_22086'
WARNING : _stp_read_address failed to access memory location
ERROR : Skipped too many probes, check MAXSKIPPED or try again with stap -t for more details.
WARNING : Number of errors : 0, skipped probes : 105
WARNING : /usr /bin /staprun exited with status : 1
Pass 5 : run failed. Try again with another '--vp 00001' option.
在网上看到很多人遇到,不过没有关系,在Google Groups看到章亦春说这个没有影响,只要能正常生成火焰图就行。我的火焰图就是在这种警告下生成的,而且有时还会报utrace/uprobes不支持等警告,忽略这些警告即可。
5、生成火焰图
生成火焰图需要两个perl脚本,脚本在FlameGraph,执行过程如下所示:
[root@FWD_YF_009_111 ~] # perl stackcollapse-stap.pl a.out > a.out2
[root@FWD_YF_009_111 ~] # perl flamegraph.pl a.out2 > a.svg
在window下用浏览器打开a.svg文件,就能看到类似下面的图:
使用Systemtap生成Flame Graph(火焰图)_第1张图片

你可能感兴趣的:(使用Systemtap生成Flame Graph(火焰图))