专栏首页云原生生态圈火焰图:全局视野的Linux性能剖析

火焰图:全局视野的Linux性能剖析

文章背景

日常的工作中,会收到一堆CPU使用率过高的告警邮件,遇到某台服务的CPU被占满了,这时候我们就要去查看是什么进程将服务器的CPU资源占用满了。通常我们会通过top或者htop来快速的查看占据CPU最高的那个进程,如下图:

这里是通过一个普通的服务器做演示使用,如图所示当前服务器占用CPU最高的是一个叫做kube-apiserver命令运行的一个进程,该进程的PID为25633,当然你可能遇到一个服务器上运行有多个服务,想快速知道占用率最高的那几个进程的话,你可以使用以下命令:

ps aux|head -1;ps -aux | sort -k3nr | head -n 10 //查看前10个最占用CPU的进程
ps aux|head -1;ps -aux | sort -k4nr | head -n 10 //查看前10个最占用内存的进程

但是通过以上的方法获取到服务器占用资源的进程之后,还是不知道CPU使用究竟耗时在哪里,不清楚瓶颈在哪里,此时就可以通过Linux系统的性能分析工具perf分析,分析其返回的正在消耗CPU的函数以及调用栈。然后可以通过解析perf采集的数据,渲染到火焰图?,就清楚的知道究竟占用系统CPU资源的罪魁祸首了。

在制作火焰图之前,需要先来说说这个Linux性能分析工具perf,该工具是一个相对简单易上手的性能分析工具,是Performance单词的缩写,通过其perf的命令选项完成系统事件的采集到解析,我们来简单的认识一下:

linux上的性能分析工具Perf

安装perf

我目前的服务器发行版是Ubuntu 16.04.6 LTS因此需要先安装perf才能使用,该工具由linux-tools-common提供,但是它需要安装后面的依赖。

#安装
root@master:~# apt install linux-tools-common linux-tools-4.4.0-142-generic linux-cloud-tools-4.4.0-142-generic -y

root@master:~# perf -v #显示perf的版本
perf version 4.4.167

在安装完成时候,我们就可以对上图CPU使用率最高的进程ID为25633的进程进行采样分析。

首选我们采集一下该进程的调用栈信息:

root@master:~# sudo perf record -F 99 -p 25633 -g -- sleep 30
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.039 MB perf.data (120 samples) ]

这个命令会产生一个大的数据文件,取决与你采集的进程与CPU的配置,如果一台服务器有16个 CPU,每秒抽样99次,持续30秒,就得到 47,520 个调用栈,长达几十万甚至上百万行。上面的命令中,perf record表示记录,-F 99表示每秒99次,-p 25633是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒,参数信息可以视情况调整。生成的数据采集文件在当前目录下,名称为perf.data

perf record命令可以从高到低排列统计每个调用栈出现的百分比,显示结果如下图所示:

root@master:~# sudo perf report -n --stdio

这样的效果对使用者来说还是不那么直观易读,这时候,火焰?图也就真正的派上用途了。

制作火焰?图

火焰?图并非一定就是火焰系列的颜色主题,只是通过?色系更能表达出含义。火焰图常见的类型有 On-CPU[1], Off-CPU[2], 还有 Memory[3], Hot/Cold[4], Differential[5] 等等. on-CPU/off-cpu的区别就是一个是用于CPU是性能瓶颈,一个是IO是性能瓶颈,当你不知道当前的服务器的性能瓶颈究竟是什么的时候,你可以使用这两种类型进行对比,通过两种火焰图的差别是比较大的,如果两张火焰图长得差不多, 那么通常认为CPU被其它进程抢占了.

另外一种情况就是如果无法确定当前的系统瓶颈, 可以通过压测工具来确认 : 通过压测工具看看能否让CPU使用率趋于饱和, 如果能那么使用 On-CPU 火焰图, 如果不管怎么压, CPU 使用率始终上不来, 那么多半说明程序被 IO 或锁卡住了, 此时适合使用 Off-CPU 火焰图. 你可以通过压测工具进行测试,目前比较常用的就是abwrk,我建议尝试使用诸如 wrk[6] 之类更现代的压测工具.

如果选择 ab 的话, 那么务必记得开启 -k 选项, 以避免耗尽系统的可用端口

Github上有Brendan D. GreggFlame Graph 工程实现了一套生成火焰图的脚本.我们可以直接克隆下来直接用。

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

生成火焰?图,我们一般都遵循以下流程

  • 捕获堆栈: 使用perf捕捉进程运行堆栈信息
  • 折叠堆栈: 对抓取的系统和程序运行每一时刻的堆栈信息进行分析组合, 将重复的堆栈累计在一起, 从而体现出负载和关键路径,通过stackcollapse脚本完成
  • 生成火焰图:分析 stackcollapse 输出的堆栈信息渲染成火焰图

Flame Graph中提供了抓取不同信息的脚本,可以按需使用。下面我们需要对捕获到的进程堆栈信息perf.data进行折叠,生成折叠的堆栈信息:

root@master:~# perf script -i /root/perf.data &> /root/perf.unfold

stackcollapse-perf.pl 将 perf 解析出的内容 perf.unfold 中的符号进行折叠

root@master:~/FlameGraph# ls
aix-perf.pl    docs                        example-perf.svg  pkgsplit-perf.pl  stackcollapse-aix.pl       stackcollapse-go.pl               stackcollapse-ljp.awk         stackcollapse-pmc.pl        stackcollapse-vsprof.pl   test.sh
demos          example-dtrace-stacks.txt   files.pl          range-perf.pl     stackcollapse-bpftrace.pl  stackcollapse-instruments.pl      stackcollapse-perf.pl         stackcollapse-recursive.pl  stackcollapse-vtune.pl
dev            example-dtrace.svg          flamegraph.pl     README.md         stackcollapse-elfutils.pl  stackcollapse-java-exceptions.pl  stackcollapse-perf-sched.awk  stackcollapse-sample.awk    stackcollapse-xdebug.php
difffolded.pl  example-perf-stacks.txt.gz  jmaps             record-test.sh    stackcollapse-gdb.pl       stackcollapse-jstack.pl           stackcollapse.pl              stackcollapse-stap.pl       test
root@master:~/FlameGraph# ./stackcollapse-perf.pl /root/perf.unfold &> /root/perf.folded
root@master:~/FlameGraph#

最后就是生成火焰?图了

root@master:~/FlameGraph# ./flamegraph.pl /root/perf.folded > /root/perf.svg

当然也可以通过管道符|将整个过程简化:

cd && perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > process.svg

最后在谷歌浏览器上打开该火焰图:

火焰图是基于stack信息生成的SVG 图片, 用来展示 CPU 的调用栈。

  • y 轴表示调用栈, 每一层都是一个函数. 调用栈越深, 火焰就越高, 顶部就是正在执行的函数, 下方都是它的父函数.
  • x 轴表示抽样数, 如果一个函数在 x 轴占据的宽度越宽, 就表示它被抽到的次数多, 即执行的时间长. 注意, x 轴不代表时间, 而是所有的调用栈合并后, 按字母顺序排列的.

火焰图就是看顶层的哪个函数占据的宽度最大. 只要有"平顶"(plateaus), 就表示该函数可能存在性能问题。颜色没有特殊含义, 因为火焰图表示的是 CPU 的繁忙程度, 所以一般选择暖色调.

调用栈不完整调用栈过深时,某些系统只返回前面的一部分(比如前10层);当函数名缺失,函数没有名字,编译器只用内存地址来表示(比如匿名函数),所以使用火焰图也是存在分析不到的地方。你也可以通过以下脚本进行采集分析火焰图:

if [ $# -ne 1 ];then
 echo "Usage: $0 seconds"
 exit 1
fi
perf record -a -g -o perf.data &
PID=`ps aux| grep "perf record"| grep -v grep| awk '{print $2}'`
if [ -n "$PID" ]; then
 sleep $1
 kill -s INT $PID
fi
# wait until perf exite
sleep 1

perf script -i perf.data &> perf.unfold
perl stackcollapse-perf.pl perf.unfold &> perf.folded
perl flamegraph.pl perf.folded >perf.svg

参考资料

[1]

On-CPU: http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html

[2]

Off-CPU: http://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html

[3]

Memory: http://www.brendangregg.com/FlameGraphs/memoryflamegraphs.html

[4]

Hot/Cold: http://www.brendangregg.com/FlameGraphs/hotcoldflamegraphs.html

[5]

Differential: http://www.brendangregg.com/blog/2014-11-09/differential-flame-graphs.html

[6]

wrk: https://github.com/wg/wrk

本文分享自微信公众号 - 云原生生态圈(CloudNativeEcoSystem),作者:Marionxue

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用vscode插件icepanel可视化配置运行在k8s上的微服务

    在朋友圈发现一款高大上的kubernetes配置清单可视化编辑工具:icepanel官网是(https://icepanel.io),使用icepanel在几分...

    云原生生态圈
  • 轻松爬取拉勾网招聘岗位信息

    最近发现一些朋友想要跳槽,正值疫情,也不知道现在市场的如何,同时目前的IT行业更是越来越难,技术革新越来越快,对新的岗位的需求也是不断的变化,因此就会想知道现在...

    云原生生态圈
  • Jenkins在kubernetes上的初体验

    创建 pv/pvc 对象,这里我们要注意 nfs 提供给 jenkins 的存储目录的权限问题,否则服务因为权限无法写入数据:

    云原生生态圈
  • 牛逼的Linux性能剖析—perf

    系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码...

    刘盼
  • 【珍藏】CMU大师对软件工程师的系统建议(附书和论文下载)

    【新智元导读】软件工程师想学机器学习,有什么好建议?机器学习专家、卡耐基梅隆大学教授、1-Page公司首席科学家 Alex Smola 在 Quora 上给出了...

    新智元
  • 2018年全球最受欢迎的30款数据可视化工具

    RAWGraphs是一个在线的开源工具和数据可视化框架,用来处理Excel表中的数据。你只需将数据导入到RAWGraphs中,设计你想要的图表,然后将其导出为S...

    iCDO互联网数据官
  • 智能音箱的中国战争

    2016年,在全球互联网行业享有盛誉的“互联网女皇”,KPCB合伙人玛丽·米克尔有过一个预判:“语音拐点已经到来,在2015年智能手机销量下滑之后,Echo销量...

    罗超频道
  • 机器学习技术如何应用于股票价格预测?(下)

    上一篇文章中,我们一起了解了用“移动平均”、“线性回归”预测股价的方法,今天这篇文章中,我们继续讲解XGBoost、LSTM的方法预测股价。

    AiTechYun
  • Hassabis 论文:为智能体设计“不需要模型的情景控制系统”

    【新智元导读】谷歌 DeepMind 创始人 Demis Hassabis 等人近日发表论文,延续其拓展的辅助学习系统理论,为智能体设计了一个“不需要模型的情景...

    新智元
  • 既然有 HTTP 请求,为什么还要用 RPC 调用?

    HTTP协议,以其中的Restful规范为代表,其优势很大。它可读性好,且可以得到防火墙的支持、跨语言的支持。而且,在去年的报告中,Restful大有超过RPC...

    week

扫码关注云+社区

领取腾讯云代金券