使用 SystemTap 绘制火焰图的主要流程如下:
- 安装 SystemTap 以及 操作系统符号调试表
- 根据自己所需绘制的火焰图类型以及进程类型选择合适的脚本
- 生成内核模块
- 运行 SystemTap 或者运行生成的内核模块统计数据
- 将统计数据转换成火焰图
安装 SystemTap 以及 操作系统符号调试表使用 yum 工具安装 systemtap:
yum install systemtap systemtap-runtime由于 systemtap 工具依赖于完整的调试符号表,而且生产环境不同机器的内核版本不同(虽然都是Tlinux 2.2版本,但是内核版本后面的小版本不一样,可以通过 uname -a 命令查看)所以我们还需要安装 kernel-debuginfo 包、 kernel-devel 包 我这里是安装了这两个依赖包kernel-devel-3.10.107-1-tlinux2-0046.x86_64kernel-debuginfo-3.10.107-1-tlinux2-0046.x86_64根据自己所需绘制的火焰图类型以及进程类型选择合适的脚本使用 SystemTap 统计相关数据往往需要自己依照它的语法,编写脚本,具有一定门槛 。幸运的是,github 上春哥(agentzh)开源了两组他常用的 SystemTap 脚本:openresty-systemtap-toolkit 和 stapxx,这两个工具集能够覆盖大部分 C 进程、Nginx 进程以及 Openresty 进程的性能问题场景 。
我们这里需要绘制 off-cpu 火焰图,所以使用 sample-bt-off-cpu 脚本即可
生成内核模块现在我们有了统计脚本,也安装好了 systemtap,正常来说就可以使用了,但由于 systemtap 是通过生成内核模块的方式统计相关探针的统计数据,而 tlinux 要求所有运行的内核模块需要先到 tlinux 平台签名才可以运行,所以:
故需要先修改 off-cpu 脚本,让其先生成内核模块;之后对该内核模块作签名;最后使用 systemtap 命令手工运行该脚本,统计监控数据
Systemtap 执行流程如下:

文章插图
- parse:分析脚本语法
- elaborate:展开脚本 中定义的探针和连接预定义脚本库,分析内核和内核模块的调试信息
- translate:.将脚本编译成C语言内核模块文件放 在$HOME/xxx.c 缓存起来,避免同一脚本多次编译
- build:将c语言模块文件编译成.ko的内核模块,也缓存起来 。
- 把模块交给staprun,staprun加载内核模块到内核空间,stapio连接内核模块和用户空间,提供交互IO通道,采集数据 。
// 在 stap 命令后增加 -p4 参数,告诉systemtap,当前只需要执行到第四阶段open my $in, "|stap -p4 --skip-badvars --all-modules -x $pid -d '$exec_path' --ldd $d_so_args $stap_args -"or die "Cannot run stap: $!n";修改好之后运行脚本,会生成一个内核模块// -p 8682 是需要监控的进程的进程号// -t 30 是指会采样30秒./sample-bt-off-cpu -p 8692 -t 30生成的内核模块名称形如 stap_xxxxx.ko模块名称 由于读者并不需要关心内核模块签名,故章节略过运行内核模块统计数据内核模块签名完成后,便可以使用 staprun 命令手工运行相关内核模块了
命令:
// 注意:签名脚本会将生产的内核模块重命名,需要将名字改回去……(脚本bug)staprun -x {进程号} {内核模块名} > demo.bt值得注意的是,监控的进程要有一定负载 systemtap 才可以采集到相关数据,即在采集时,同时需要要有一定请求量(通常是自己构造请求,压测进程)将统计数据转换成火焰图获得了统计数据 demo.bt 后,便可以使用火焰图工具绘制火焰图了
下载 FlameGraph,链接:
https://github.com/brendangregg/FlameGraph
【编程新手该如何调优程序?程序员必备性能调优利器——火焰图】命令:
./stackcollapse-stap.pl demo.bt > demo.folded./flamegraph.pl demo.folded > demo.svg这样便获得了 off-cpu 火焰图:
文章插图
看图说话趁热打铁,通过几张火焰图熟悉下如何使用火焰图
图片来自于春哥微博或者个人近期定位的问题
on-cpu 火焰图Apache APISIX QPS急剧下降问题

文章插图
Apache APISIX 是一个开源国产的高性能 API 网关,之前在进行选型压测时,发现当 Route 匹配不同场景下, QPS 急剧下降,在其 CPU (四十八核)占用率几乎达到100%的情况下只有几千 QPS,通过绘制火焰图发现,其主要耗时在一个 table 插入阶段(lj_cf_table_insert),分析代码发现是该 table 一直没有释放,每次匹配不中路由会插入数据,导致表越来越大,后续插入耗时过长导致 QPS 下降 。
推荐阅读
- 新手开淘宝店应该注意些什么 淘宝开店分类如何选择
- 淘宝新手开店需要注意什么 开淘宝店的注意事项
- 汽车门把手的3个隐藏功能,新手学会后,有效提高驾驶技术和安全
- 初入户外,应该购买哪些装备?
- 情感pua到底是什么意思?
- 3种花新手还是放弃吧,买了就等于浪费钱,很难养活
- 小个子女生冬季应该怎么穿?跟着时尚达人们一起学,显高又时尚
- 想开网店怎么学 怎么开网店新手入门
- 淘宝怎么做一件代发代销货源 新手开网店怎么找代销货源
- 大学生应该开网店吗 大学生开网店的利与弊
