下面是我结合网上资料摸索出的可行的操作方法,记录在这样,以备后面继续研究。操作系统是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("\t%d\n", @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

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

  1. 在CentOS 6.5 x86_64上安装libunwind的问题

    1.事由 当时间进入2021年,之前的对CentOS 6.x上的官方依赖仓库和国内镜像仓库都不好使了,如果要安装软件包,是一个痛苦的事情.今天我在一台CentOS 6.5的老机器上安装ats的rpm包 ...

  2. 在CentOS 6.8 x86_64上安装ATS 6.2.1实录

    我的博客上已经有很多这样的ats安装实录了,这次的笔记有些不一样,因为它是ATS目前最新的LTS版本6.2.1的安装,写出来更多的是整理自己的思路,因为很多东西搞过不整理,过一段时间就完全忘记掉了. ...

  3. 在CentOS 6.8 x86_64上安装nghttp2最新版及让curl具有http2特性

    nghttp2是什么? nghttp2是一个实现IETF官方HTTP/2和HPACK头压缩算法的C库,但不限如此,在C库基础上,还实现了http2的客户端,服务器,代理服务器,以及压测工具.参见官网链 ...

  4. 在CentOS 6.8 x86_64上安装nginx 1.10.3

    本文档记录了完全使用最新源码来编译安装nginx最新版1.10.3,所有的依赖也是最新的,便于第三方nginx模块开发 假定使用root身份安装 目前最新的源码地址汇总 ftp://ftp.csx.c ...

  5. 在CentOS 7.7 x86_64上安装python3的selenium 3模块实录

    安装selenium3模块 pip3 install selenium 如果上面的命令因为网络问题,重试多次仍失败,可以尝试下面的命令 pip3 install selenium -i http:// ...

  6. 在CentOS 7.7 x86_64上安装InfluxDB 1.8.0实录

    在InfluxDB官网获取最新稳定版的下载和安装指导 wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.0.x86_64.rp ...

  7. 在CentOS 7.7 x86_64上安装python3.7.7

    由于Centos 7原本就安装了python2,而且这个python2不能被删除,因为有很多系统命令,比如yum都要用到. [root@VM_105_217_centos Python-3.6.2]# ...

  8. 在CentOS 7.7 x86_64上安装python3.11.0实录

    整个安装过程基本上参照原来的博文 https://blog.csdn.net/tao_627/article/details/105674448 但是这里有新的注意点就是,ssl使用了新的openss ...

  9. 在CentOS 6.9 x86_64上安装nginx 1.12.2

    比较详细的教程参见以前的博文 http://blog.csdn.net/tao_627/article/details/60957521 这里只给出简略步骤,没有截图,自始至终使用root操作 目前最 ...

最新文章

  1. DataTable中进行Distinct、Group by、Join、Create
  2. 汉诺塔递归与非递归算法
  3. mysql用户权限设置
  4. YOLOv5-LibTorch
  5. 网络编程释疑之:TCP半开连接的处理
  6. 大二上学期总结计算机专业,计算机学生的大二第二学期自我总结-自我总结
  7. sql 相加_SQL经典题型
  8. nginx哪个版本性能好_nginx性能为什么好
  9. MMKV集成与原理,薪资翻倍
  10. ios开发问题汇总(一)
  11. python web开发 Bootstrap框架基础
  12. HTML5 新特性
  13. 防止a标签跳转的几种方法
  14. 鼠年最后一场干货直播:构建极致性能、易于扩展、坚如磐石的数据库
  15. full stack on the road
  16. 使用sngrep跟踪分析sip信令
  17. php中switch使用
  18. 对比学习Contrastive Learning
  19. Linux中的阻塞机制
  20. 解决Dmaven.multiModuleProjectDirectory system propery is not set. Check M2_HOME错误

热门文章

  1. Java技术——Iterator和Enumeration的不同
  2. Excel的数据分析—排位与百分比
  3. ThinkPHP入门(二)
  4. awk处理文件内容格式
  5. 军团要塞2正版服务器,专用服务器配置 - Official TF2 Wiki | Official Team Fortress Wiki
  6. 后端如何发出请求_gRPC系列(三) 如何借助HTTP2实现传输
  7. linux重启sh脚本,Linux 之shell脚本系列之服务启动/关闭/重启/状态
  8. java socket 包头包体_自定义协议封装包头、包体
  9. img 在video上面_HTML,img,video无法铺满屏幕解决方法,同视频做网页背景无法全屏的解决方法...
  10. 登录linux后台工具,linux后台进程管理工具-supervisor