首页 > 在CentOS 6.6 x86_64上安装SystemTap/Perf+FlameGraph玩转火焰图实录

在CentOS 6.6 x86_64上安装SystemTap/Perf+FlameGraph玩转火焰图实录

下面是我结合网上资料摸索出的可行的操作方法,记录在这样,以备后面继续研究。操作系统是CentOS 6.6 x86_64。

1.将内核版本升级到最新版

因为我机器上CentOS 6.6的内核版本号是2.6.32-573.12.1.el6.x86_64,网上根本找不到对应的kernel-devel,kernel-debuginfo和kernel-debuginfo-common内核rpm包,而升级到最新版就可以解决这个问题。

升级方法参见

http://blog.csdn.net/tao_627/article/details/52136091

升级后的版本号是2.6.32-642.3.1.el6.x86_64



2.检查内核是否提供utrace/uprobes用户态支持

打开/boot/config-2.6.32-642.3.1.el6.x86_64文件(内核版本不同,文件名不同),检查CONFIG_UTRACE宏是否设置。如果没有,就不能使用SystemTap

cat /boot/config-2.6.32-642.3.1.el6.x86_64 | grep '_UTRACE'

2.安装内核调试所需要的包

yum -y install kernel-devel-2.6.32-642.3.1.el6.x86_64

yum -y install kernel-debuginfo-2.6.32-642.3.1.el6.x86_64

yum -y install kernel-debuginfo-common-x86_64-2.6.32-642.3.1.el6.x86_64

3.安装SystemTap并配置脚本

yum -y install systemtap

验证SystemTap是否安装成功?

stap -ve 'probe begin{log("hello SystemTap!")exit()}'



我目前安装的版本号是



配置的脚本flame.stp内容如下

global s; 
global quit = 0; 
probe timer.profile { if (pid() == target()) { if (quit) { foreach ([sys,usr] in s- limit 1000) { print_stack(sys)print_ustack(usr); printf("	%d
", @count(s[sys, usr])); } exit() } else { s[backtrace(), ubacktrace()] <<< 1; } } 
} 
probe timer.s(20) { quit = 1 
} 


4.监视运行中的ats并采样,输出svg图

stap --ldd -d /usr/bin/traffic_server --all-modules -D MAXMAPENTRIES=256 -D MAXACTION=20000 -D MAXTRACE=100 -D MAXSTRINGLEN=4096 -D MAXBACKTRACE=100 -x $(pidof traffic_server) flame.stp --vp 0001 > ats.out

这里ats必须是debug版本的,各重要参数说明一下:

-d 表示要查看的对象,比如这里必须要填traffic_server

--ldd 表示加载所有需要的动态库名

--all-modules  加载内核所有需要用到所有动态库名

-D NM=VAL  emit macro definition into generated C code

注意这些宏参数根据各自环境自行配置和摸索得到合适的值,可以进一步参考SystemTap的官方资料和文档,我这里暂没有好的结果。

各种资源的使用限制由所生成的C代码中的宏来设置。这些值可在编译时由-D选项来重写。下面描述了部分挑选出来的宏:

MAXNESTING 递归函数的最大调用层数,默认值是10。

MAXSTRINGLEN 字符串的最大长度,默认值是128。

MAXTRYLOCK 在声称可以出现死锁和跳出探测点前,等待全局变量锁的最大迭代次数,默认值是1000。

MAXACTION 单个探测点内可以执行语句数的最大值,默认值是1000。

MAXMAPENTRIES 数组在声明时没有显示指定大小时,数组的最大行数(译者注:即组数的最大下标个数),默认值为2048。

MAXERRORS  在触发退出前,可以容忍软件错误个数的最大值,默认值是0。

MAXSKIPPED 在触发退出前,可忽略的重入探测点的最大值,默认值是100。

MINSTACKSPACE 运行探测处理函数所需要的内核栈的最小字节数。此数值应比探测处理函数所需内核栈的大小加上安全边界大小足够大。默认值是1024。

参考nginx的项目nginx-systemtap-toolkit中sample-bt这个perl脚本的内容来完善我们的测试。





5.下载FlameGraph包,并转换输出数据为svg图

git clone https://github.com/brendangregg/FlameGraph.git

将需要用到的flamegraph.pl和stackcollapse-perf.pl到当前目录,并执行

perl stackcollapse-stap.pl ats.out > ats.out2

perl flamegraph.pl ats.out2 > ats.svg

使用浏览器打开该svg文件就可以了。





6.perf+FlameGraph生成的火焰图

另外使用perf record也可以采集指定时间的数据,并使用FlameGraph生成活跃图。下面是火焰图示例



局部图





参考文献

[1].https://sourceware.org/systemtap/ftp/releases/

[2].https://github.com/brendangregg/FlameGraph

[3].https://github.com/openresty/nginx-systemtap-toolkit

[4].https://github.com/openresty/stapxx

更多相关:

  • 1.Tcpdive的基本原理 Tcpdive是基于linux内核的探测点机制,使用systemtap脚本语言和内嵌C代码来实现的。  通过定义几类相互关联的探测点和库函数,来收集和处理运行中内核的数据,以及修改内核的处理逻辑。 2.源码目录 https://github.com/fastos/tcpdive 目前的代码基...

  • 在基于CentOS平台的工作过程中,难免有时需要升级或者降级内核以验证功能、调试性能或者更新整个系统。 如果从头重新编译一个内核费时费力,另外加之现在内核特性越来越复杂,依赖的库或者工具也不少,找到一种简单的升级内核方法将非常必要。 下面是我实践过的最简单方法。 系统环境: CentOS 6.6 x86_64 1:查看系统版...

  • 关于系统目录树和源码目录树的结构图如下 内核版本: centos 7.0 升级内核之后 3.10.0-957-5.1.e17...

  • 下述为UCloud资深工程师邱模炯在InfoQ架构师峰会上的演讲——《UCloud云平台的内核实践》中非常受关注的内核热补丁技术的一部分。给大家揭开了UCloud云平台内核技术的神秘面纱。   如何零代价修复海量服务器的Linux内核缺陷?   对于一个拥有成千上万台服务器的公司,Linux内核缺陷导致的死机屡见不鲜。让工程师们纠结的...