网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

  文章背景

  日常的工作中,会收到一堆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

  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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
俄方宣布紧急状态!萨拉托夫的克里斯塔尔油库燃烧14小时

俄方宣布紧急状态!萨拉托夫的克里斯塔尔油库燃烧14小时

项鹏飞
2025-01-09 20:20:28
刘纪鹏教授:中国完全有可能在世界上第一个解决国有企业改革难题

刘纪鹏教授:中国完全有可能在世界上第一个解决国有企业改革难题

尚曦读史
2025-01-09 19:31:05
男子在旅店拨打“小卡片”,来的却是自己老婆,嫖资还被赚差价?

男子在旅店拨打“小卡片”,来的却是自己老婆,嫖资还被赚差价?

乌娱子酱
2025-01-09 19:54:14
岳云鹏接到春晚通知,作品需要大幅改动,坦言:不让去就不去了

岳云鹏接到春晚通知,作品需要大幅改动,坦言:不让去就不去了

乌娱子酱
2025-01-09 11:19:32
刘德华辅导女儿作业被气到失控,怒问这都不懂?原来天王也顶不住

刘德华辅导女儿作业被气到失控,怒问这都不懂?原来天王也顶不住

娱乐白名单
2024-12-14 08:05:03
突然宣布!拥有2套以上房产的家庭,按照新规,房产税或将这样征

突然宣布!拥有2套以上房产的家庭,按照新规,房产税或将这样征

爱论历史
2025-01-09 23:09:02
笑死了!39岁C罗在禁区内触电式倒地引热议,球迷:演技浮夸

笑死了!39岁C罗在禁区内触电式倒地引热议,球迷:演技浮夸

侧身凌空斩
2025-01-10 03:54:59
500公里高空,中国干了件大事,美国发现情况不妙,最大底牌被废

500公里高空,中国干了件大事,美国发现情况不妙,最大底牌被废

空天力量
2025-01-09 19:10:37
大降47%!物业费“降价潮”也来了…

大降47%!物业费“降价潮”也来了…

星耀长沙
2025-01-09 21:50:48
美国加州大火失控 对话当地华人:以为误入了末日|封面深镜

美国加州大火失控 对话当地华人:以为误入了末日|封面深镜

封面新闻
2025-01-09 21:13:04
微信员工:原生鸿蒙是一套新的技术框架,意味着 App 要完全重写

微信员工:原生鸿蒙是一套新的技术框架,意味着 App 要完全重写

IT之家
2025-01-09 21:58:09
公安部:去年共有208名民警、174名辅警因公牺牲

公安部:去年共有208名民警、174名辅警因公牺牲

界面新闻
2025-01-10 10:04:45
北京女子上坟哭喊儿子,不料真有回应,母亲不顾反对给儿子开棺

北京女子上坟哭喊儿子,不料真有回应,母亲不顾反对给儿子开棺

一场奇遇日记
2024-01-05 22:55:39
湖南益阳一民房发生爆炸 致2死1伤

湖南益阳一民房发生爆炸 致2死1伤

环球网资讯
2025-01-10 06:16:08
黎巴嫩政坛巨变!亲美派新总统或联手以色列美国围剿真主党 !

黎巴嫩政坛巨变!亲美派新总统或联手以色列美国围剿真主党 !

国际情爆猿
2025-01-09 21:48:00
陈奕迅演唱会不取消!网友怒了:希望冷血的他剃个光头感谢泰国!

陈奕迅演唱会不取消!网友怒了:希望冷血的他剃个光头感谢泰国!

大风文字
2025-01-09 16:09:59
豪门狂欢夜!穆帅率队3-0迎开门红,皇马3-0进决赛,C罗利剑出鞘

豪门狂欢夜!穆帅率队3-0迎开门红,皇马3-0进决赛,C罗利剑出鞘

侧身凌空斩
2025-01-10 05:47:45
演员王星获救后接连发声:他在泰国撒的谎,普通人一个字也不要信

演员王星获救后接连发声:他在泰国撒的谎,普通人一个字也不要信

千浔观点
2025-01-09 16:08:44
可怕!高考状元也被骗至缅甸,疑从云南出境,已失联98天姐姐爆哭

可怕!高考状元也被骗至缅甸,疑从云南出境,已失联98天姐姐爆哭

历史阿务
2025-01-09 18:10:18
一觉醒来,知名月子中心人去楼空!有宝妈没来得及撤离,有孕妈交了几万元还一天没住

一觉醒来,知名月子中心人去楼空!有宝妈没来得及撤离,有孕妈交了几万元还一天没住

每日经济新闻
2025-01-10 01:03:08
2025-01-10 10:19:00
开源中国 incentive-icons
开源中国
每天为开发者推送最新技术资讯
6729文章数 34348关注度
往期回顾 全部

科技要闻

特斯拉中国推出新款Model Y 26.35万元起售

头条要闻

广州知名月子中心人去楼空 留下产妇们"没饭吃没水喝"

头条要闻

广州知名月子中心人去楼空 留下产妇们"没饭吃没水喝"

体育要闻

纳什:梅西是足坛乔丹 哈维魔笛丁丁像我

娱乐要闻

李明德疑似诈捐!下一步全网封号

财经要闻

人民币,让空头失望了

汽车要闻

10万元级无图智驾 悦也PLUS全路况实测

态度原创

亲子
本地
游戏
公开课
军事航空

亲子要闻

用草莓骗宝宝吃柠檬,宝宝直接被酸出表情包了

本地新闻

食味印象|来太原,先干了这碗牺汤!

《巫师4》开发工作氛围健康积极 老手带新手合力打造

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

逃兵太多 乌克兰想动员海外侨民

无障碍浏览 进入关怀版